2011-04-06 14 views
5

E 'legale per rendere la seguente dichiarazione:Cache == null? È possibile?

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

Non sono sicuro che il mio programma è in realtà funziona correttamente (anche se compila) e mi chiedo se una cache non esiste è impostata su null ?

risposta

6

Sì, questo è legale (ma la domanda nel titolo non è, vedere sotto per i dettagli).

Anche se, può essere saggio per verificare che il tipo nella cache è quello che ci si aspetta, piuttosto che dover fare questo controllo due volte, come ad esempio:

//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! 
} 

On rileggendo la tua domanda se e pensando al tuo programma non funziona correttamente, sono tentato di dire che hai problemi più grandi di questo; come il tuo programma non funziona correttamente? L'istanza Cache non sarà mai null mentre è accessibile: è un campo di sola lettura di Page. Tuttavia, il valore memorizzato nella cache potrebbe essere null e, se questo è il problema, dovresti ricevere un NullReferenceException - è il caso?

UPDATE:

Per affrontare i suoi commenti, controllare i commenti che ho aggiunto al codice.

+0

scusa, cosa fa "Cache [chiave] come MyExpectedReferenceType"? – locoboy

+0

@ cfarm54: vedere il mio aggiornamento. –

+0

haha, in realtà è molto più semplice di quello che penso tu stia pensando. tutto quello che sto cercando di fare è capire se esiste una cache o no e se esiste usarlo ... – locoboy

2

Molto legale; piuttosto il suo meglio controllare per un valore prima di eseguire l'azione, soprattutto per assicurarsi che non sia chiave slided-out, o scaduti, ecc

+0

Meglio che cosa? ;) –

+0

Meglio di ** non controlla affatto **; o meglio che dare per scontato che contenga un valore valido. –

0

Sì E` possibile, Cache sarà sempre inizializzare (come sessione e obj dell'applicazione) Ma è possibile verificare se una chiave nella cache è nullo

2

C'è una condizione di potenziale gara nel codice che avete inviato:

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 

} 

E 'meglio per estrarre prima l'oggetto dalla cache, quindi verificare per nulla, ad esempio:

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 
Problemi correlati