C# 缓存==null?可能吗?

C# 缓存==null?可能吗?,c#,.net,asp.net,asp.net-cache,C#,.net,Asp.net,Asp.net Cache,作出以下声明是否合法: if(Cache[CACHE_KEY] == null) { //do something to form cache } else { //do something else that uses cache } 我不确定我的程序是否真的正常运行(即使它已编译),我想知道缓存是否不存在,它是否设置为null?非常合法;在执行操作之前,最好检查一个值,尤其是确保键没有滑出或过期等。是的,缓存总是初始化的(如会话和应用程序obj) 但是您可以检查缓存中的密钥

作出以下声明是否合法:

if(Cache[CACHE_KEY] == null)
{
    //do something to form cache
}
else
{
    //do something else that uses cache
}

我不确定我的程序是否真的正常运行(即使它已编译),我想知道缓存是否不存在,它是否设置为null?

非常合法;在执行操作之前,最好检查一个值,尤其是确保键没有滑出或过期等。

是的,缓存总是初始化的(如会话和应用程序obj) 但是您可以检查缓存中的密钥是否为null是的,这是合法的(但标题中的问题不是,请参阅下面的详细信息)

不过,检查缓存中的类型是否符合预期可能是明智的,而不必执行两次此检查,例如:

//in English, the following line of code might read:
//    if the item known in the cache by the specified key is in
//    in fact of type MyExpectedReferenceType, then give me it 
//    as such otherwise, give me a null reference instead...
var myCachedInstance = Cache[key] as MyExpectedReferenceType;
if (myCachedInstance == null)
{  
    //we retrieved a reference to an instance of an MyExpectedReferenceType
}
else
{
    //oh, no - we didn't!
}
然而,在重新阅读你的问题,并考虑到你的程序没有正常工作时,我很想说你有比这更大的问题您的程序如何运行不正常?
缓存
实例本身在可访问时永远不会为
——它是
页面
的只读字段。但是,您期望的缓存值可能是
null
,如果这是问题所在,您应该会收到
NullReferenceException
-是这样吗

更新:


要处理您的评论,请查看我添加到代码中的评论。

您发布的代码中存在潜在的竞争条件:

if(Cache[CACHE_KEY] == null) 
{     
    //do something to form cache 
} 
else 
{     
    // Another thread could have removed CACHE_KEY from the Cache before you get here

}
最好先从缓存中提取对象,然后测试它是否为null,例如:

MyObject cachedObject = Cache[CACHE_KEY] as MyObject;
// or MyObject cachedObject = (MyObject) Cache[CACHE_KEY]; if you know it is of type MyObject
if(cachedObject == null) 
{     
    cachedObject = ... // generate the cached object
    Cache.Insert(CACHE_KEY, cachedObject, ...);
} 

// use cachedObject

总比根本不检查好;或者比想当然地认为它包含一个有效值要好。对不起,“将[key]缓存为MyExpectedReferenceType”有什么作用?哈哈,它实际上比我想的要简单得多。我想做的就是弄清楚缓存是否存在,如果它确实存在,请使用它。。。