Кэш == ноль? Является ли это возможным?
Законно ли сделать следующее заявление:
if(Cache[CACHE_KEY] == null)
{
//do something to form cache
}
else
{
//do something else that uses cache
}
Я не уверен, что моя программа на самом деле работает должным образом (даже если она компилируется), и мне интересно, если кэш не существует, установлен ли он на ноль?
4 ответа
Да, это законно (но вопрос в названии - нет, подробности см. Ниже).
Хотя, может быть, стоит проверить, что тип в кеше соответствует ожидаемому, а не выполнять эту проверку дважды, например:
//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
Да, это возможно, Кэш всегда будет инициализирован (как сеанс и объект приложения). Но вы можете проверить, является ли ключ в кэше нулевым