Кэш == ноль?Является ли это возможным? - PullRequest
5 голосов
/ 06 апреля 2011

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

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

Я не уверен, что моя программа действительно работает нормально (даже если она компилируется), и мне интересно, если кеша не существует, установлен ли он на ноль?

Ответы [ 4 ]

6 голосов
/ 06 апреля 2011

Да, это законно (но вопрос в названии не так, подробности см. Ниже).

Хотя, может быть, стоит проверить, что тип в кеше соответствует ожидаемому.вместо того, чтобы выполнять эту проверку дважды, например:

//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 - так ли это?

ОБНОВЛЕНИЕ:

Для решения вашей проблемыкомментарий, проверьте комментарии, которые я добавил к коду.

2 голосов
/ 06 апреля 2011

В коде, который вы разместили, есть потенциальное состояние гонки:

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
2 голосов
/ 06 апреля 2011

Очень легально; скорее его лучше проверить на значение перед выполнением действия, особенно чтобы убедиться, что ключ не выдвинулся, не просрочен и т. д.

0 голосов
/ 06 апреля 2011

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

...