Skip to main content
 首页 » 编程设计

c#之在 System.Web.HttpContext.Current.Cache 中存储一个空值

2024年01月26日29duanxz

在 MVC 应用程序中,我们假设从数据库中动态加载一些字符串。基本上是一个 <string,string>键值字典。每次从数据库加载每个文本都会杀死应用程序,因此这些文本通常只会从数据库中提取一次,然后存储在缓存中(即 Web.HttpContext.Current.Cache )。还有一些硬编码的默认文本,如果在数据库中找不到任何内容,则会使用这些文本。为了使事情更简单,我还将这些默认文本放入缓存中。

逻辑如下:

  1. 尝试从缓存中获取文本,如果找到则返回。

  2. 如果缓存中没有文本,请尝试从数据库中提取它,如果找到,将其保存到缓存中并返回。

  3. 如果以上都失败了,使用默认文本并将其保存到缓存中,这样就不会对该特定键进行进一步查询。

如果我理解正确的话,检查 key 是否设置在 Web.HttpContext.Current.Cache 中的唯一方法是通过将它的值与 null 进行比较。我的问题是,默认文本并非完全不可能为空。因此,如果我将其放入缓存中,我将不知道已设置 key ,并且每次需要文本时我都会尝试从数据库中提取不存在的值。

我知道我可以使用空字符串而不是 null,但在不久的将来我可能会因为某些原因需要区分 null 和空字符串。

那么有什么方法可以判断 Web.HttpContext.Current.Cache 中是否设置了一个键?分配的值何时为空?

请您参考如下方法:

StriplingWarrior 先发制人,但我同意他所说的:只需将要存储的内容包装在复杂类型中,以便进行空值检查。通常你会使用 Nullable<T>为此,您不能将 Nullable 类型用于已经被认为可以为 null 的事物,例如字符串。

这是一个实际的例子:

定义一个简单的包装类:

public class CacheEntry<T> 
{ 
    public T Value { get; private set; } 
 
    public CacheEntry(T value) 
    { 
        Value = value; 
    }  
} 

然后使用它!

System.Web.HttpContext.Current.Cache.Insert("name", new CacheEntry<string>("Marcin")); 
 
var name = (CacheEntry<string>) System.Web.HttpContext.Current.Cache.Get("name"); 
if (name != null) 
{ 
    Console.WriteLine(name.Value); 
}