发表以下声明是否合法:
if(Cache[CACHE_KEY] == null)
{
//do something to form cache
}
else
{
//do something else that uses cache
}
我不确定我的程序实际上是否正常运行(即使它可以编译),并且想知道缓存是否不存在是否设置为 null?
发表以下声明是否合法:
if(Cache[CACHE_KEY] == null)
{
//do something to form cache
}
else
{
//do something else that uses cache
}
我不确定我的程序实际上是否正常运行(即使它可以编译),并且想知道缓存是否不存在是否设置为 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!
}
不过,在重新阅读您的问题并考虑您的程序无法正常运行时,我很想说您有比这更大的问题;你的程序怎么不能正常工作?实例本身在可访问时Cache
将永远不可null
访问 - 它是Page
. 但是,您预期的缓存值可能是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
}
最好先从缓存中提取对象,然后测试它是否为空,例如:
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
是的,有可能,缓存将始终被初始化(如会话和应用程序 obj)但是您可以检查缓存中的键是否为空