Кэш == ноль? Является ли это возможным?

Законно ли сделать следующее заявление:

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

Да, это возможно, Кэш всегда будет инициализирован (как сеанс и объект приложения). Но вы можете проверить, является ли ключ в кэше нулевым

Другие вопросы по тегам