Per chiarire un po 'la risposta accettata di Michael Petrotta (troppo lungo per un commento, temo), le concrete implementazioni di CacheInternal (CacheSingle e CacheMultiple, l'ultima delle quali gestisce semplicemente più istanze del primo), che è ciò che viene utilizzato internamente dal tipo di cache pubblica per supportare i metodi Get, Add, Insert, ecc., si basa su un HashTable per l'archiviazione. Tuttavia, non c'è mai alcuna domanda se esiste o meno un valore per una chiave particolare nella HashTable, perché i valori nativi (memorizzati nella cache) non sono memorizzati direttamente in HashTable. Invece, la HashTable è piena di oggetti CacheEntry unici che racchiudono le chiavi ei valori memorizzati nella cache (CacheEntry deriva in realtà da CacheKey, aggiungendo una proprietà Value basata su oggetti, tra le altre cose: il requisito di valore non nullo può essere trovato nel suo costruttore).
Sulla base della mia lettura del codice, non c'è alcun motivo tecnico evidente per gli autori di aver richiesto un CacheEntry.Value non null, tranne che l'oggetto Cache pubblico non espone un metodo di tipo Contains- o Exists, e naturalmente non espone gli oggetti interni di CacheEntry sottostanti, restituisce solo i valori di CacheEntry. Quindi, come per la risposta di Michael, senza forzare i valori ad essere non nulli, non è possibile per gli utenti di oggetti Cache sapere se esiste un particolare valore di chiave. È anche possibile, ma richiederebbe una maggiore lettura del codice per essere sicuri, che l'approccio piuttosto complesso adottato internamente per gestire le dipendenze degli oggetti memorizzati nella cache, le scadenze, gli eventi e gli aggiornamenti sul posto delle voci di HashTable si basino, in qualche modo, sui valori essere non nullo.
dizionario * non * distinguere tra (Questo è tutto fuori dalla parte superiore della mia testa, quindi mi scuso per eventuali errori di battitura stupide.) null e nessun valore. Ottenere il valore per una chiave che non esiste genera una KeyNotFoundException e la memorizzazione di un valore nullo è valida. –
Ah. Ho provato solo Hashtable. Un po 'più di prova che Cache è basata su Hashtable, con un controllo pre-inserimento. –
In ritardo alla festa, ma solo per informazione, sembra che MemoryCache comunichi una chiave mancante restituendo 'null'. Quindi se permette di inserire valori nulli, non conoscerà la differenza tra i due. – GettnDer