2011-04-06 2 views
5

Законно ли это сделать следующее заявление:Кэш == null? Является ли это возможным?

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

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

ответ

6

Да, это законно (но вопрос в заголовке отсутствует, см. ниже для более подробной информации).

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

//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 - это тот случай?

UPDATE:

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

+0

Извините, что делает «Cache [key] как MyExpectedReferenceType« делать? – locoboy

+0

@ cfarm54: Смотрите мое обновление. –

+0

ха-ха, это на самом деле намного проще, чем я думаю, вы думаете. все, что я пытаюсь сделать, это выяснить, существует ли кеш или нет, и если он существует, используйте его ... – locoboy

2

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

+0

Лучше что? ;) –

+0

Лучше, чем ** не проверять вообще **; или лучше, чем считать само собой разумеющимся, что он содержит действительное значение. –

0

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

2

Существует потенциальное состояние гонки в коде вы публикуемый:

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