Pregunta Caché == nulo? ¿Es posible?


¿Es legal hacer la siguiente declaración?

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

No estoy seguro de si mi programa está funcionando correctamente (aunque compila) y me pregunto si no existe una caché ¿está configurada como nula?


5
2018-04-06 08:38


origen


Respuestas:


Sí, eso es legal (pero la pregunta en el título no lo es, ver más abajo para más detalles).

Sin embargo, puede ser conveniente verificar que el tipo en la memoria caché es lo que está esperando en lugar de tener que hacer esta verificación dos veces, como por ejemplo:

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

Sin embargo, al volver a leer su pregunta y pensar en su programa no funciona correctamenteEstoy tentado de decir que tienes problemas más grandes que esto; cómo ¿tu programa no funciona correctamente? los Cache la instancia misma nunca será null accesible, es un campo de solo lectura de Page. Sin embargo, su valor en caché esperado podría ser null y, si este es el problema, debería recibir un NullReferenceException - es ese el caso?

ACTUALIZAR:

Para dirigir su comentario, revise los comentarios que agregué al código.


6
2018-04-06 08:42



Muy legal; más bien es mejor comprobar para obtener un valor antes de realizar una acción, especialmente para asegurarse de que la tecla no se haya deslizado, o haya caducado, etc.


2
2018-04-06 08:39



Existe una condición de carrera potencial en el código que publicaste:

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

}

Es mejor extraer primero el objeto de la caché, luego probarlo para nulo, por ejemplo:

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
2018-04-06 11:01



Sí, es posible, la caché siempre se inicializará (como la sesión y el obj de la aplicación) Pero puedes verificar si una clave en el caché es nula


0
2018-04-06 08:41