2009-08-17 5 views
11

From MSDN über die Unterschiede zwischen ein Element hinzufügen oder Einfügen des ASP.NET Cache:Warum gibt Cache.Add ein Objekt zurück, das das zwischengespeicherte Objekt darstellt?

Hinweis: Das Add und Insert Methoden haben die gleiche Signatur, aber es gibt subtile Unterschiede zwischen ihnen. Zuerst gibt die Methode Add ein Objekt zurück, das das zwischengespeicherte Element darstellt, während der Aufruf Insert nicht aufruft. Zweitens ist ihr Verhalten anders, wenn Sie diese Methoden aufrufen und ein Element zum Cache hinzufügen, das bereits dort gespeichert ist. Die Methode Einfügen ersetzt das Element, während die Methode Hinzufügen fehlschlägt. [Hervorhebung meins]

Der zweite Teil ist einfach. Keine Frage.

Aber warum sollte es mit dem ersten Teil ein Objekt zurückgeben, das das zwischengespeicherte Element darstellt? Wenn ich versuche, ein Objekt zum Cache hinzuzufügen, weiß ich bereits, was dieses Element ist?

Ich verstehe es nicht. Was ist der Grund dafür?

Antwort

12

Aufruf hinzufügen() auf einem Cache schließlich ruft eine interne Methode, mit dieser Signatur:

internal abstract CacheEntry UpdateCache(CacheKey cacheKey, 
    CacheEntry newEntry, bool replace, CacheItemRemovedReason removedReason, 
    out object valueOld); 

Beachten Sie die out object valueOld - das auf das Objekt gesetzt wird, die derzeit in der „CacheKey“ Stelle im Cache ist, und wird als Ergebnis von Add() zurückgegeben. Die Dokumentation ist irreführend, es ist nicht wirklich das gleiche Objekt, das zurückgegeben wird - es ist, was Objekt war, dass gleichen Schlüssel Position.

Dieser leicht mit dem folgenden Code wird überprüft:

String x = "lorem"; 
String y = "ipsum"; 

HttpContext.Current.Cache.Add("hi", x, null, DateTime.MaxValue, 
           Cache.NoSlidingExpiration, 
           CacheItemPriority.Normal, null); 

var z = HttpContext.Current.Cache.Add("hi", y, null, DateTime.MaxValue, 
           Cache.NoSlidingExpiration, 
           CacheItemPriority.Normal, null); 

//Result: 
// z == "lorem" 
+0

Das macht was Sinn und was ich ursprünglich vermutet ... es ist möglich, den Wert eines Schlüssels zu überschreiben und der alte Wert wird zurückgegeben. – kitsune

+0

Auf dem ursprünglichen Poster ist dies eine einfache Möglichkeit zu überprüfen, ob ein zwischengespeichertes Objekt aktualisiert wurde oder nicht ... – kitsune

+0

Sorry, ich fand @ kitsune Kommentare verwirrend. Add() wird _override_ den Wert eines Schlüssels nicht (das ist was Insert() tut). Stattdessen gibt Add() entweder a) den zwischengespeicherten Wert zurück, der diesen Schlüssel bereits verwendet, ODER b) null, wenn dort nichts war. Für (a) wird der Wert, den Sie hinzufügen wollten, verworfen. – mrcrowl

0

Es gibt nur ein Objekt zurück, wenn das gleiche Objekt bereits im Cache gespeichert wurde ( unter einem anderen Schlüssel, ich denke unter dem gleichen Schlüssel). Andernfalls wird null zurückgegeben. Die Dokumentation ist irreführend:

http://msdn.microsoft.com/en-us/library/system.web.caching.cache.add.aspx

es in Reflector Sehen, beide Methoden scheinen die gleichen internen Verfahren zu nennen, mit ADD dem alten Objekt zurückkehr zuvor unter dem gleichen Schlüssel gespeichert und die INSERT-Methode einfach ignorieren, dass Wert.

+0

Dude, das klingt nicht richtig :(Es fügt ein Element, wenn es nicht da ist, sonst * scheitert * (Expection geworfen ?? Kann mich nicht erinnern). Es gibt auch ein Objekt zurück. Wie kann es zurückkehren das gleiche Objekt, unter einem anderen Schlüssel ?? das macht keinen Sinn .. –

+0

Es tut es nicht, aber es heißt so in der Dokumentation "Rückgabewert: Ein Objekt, wenn das Element zuvor im Cache gespeichert wurde; andernfalls Null-Referenz (Nothing in Visual Basic). " Wenn es fehlschlägt, wenn bereits ein Objekt unter diesem Schlüssel zwischengespeichert ist, wie kann es sagen, dass es ein Objekt zurückgibt, wenn das Objekt bereits zwischengespeichert ist? Unter welchem ​​Schlüssel? Noch einmal, ich don denke nicht, dass das passiert, also macht die Dokumentation keinen Sinn ... – kitsune

2

Wenn der Methodenaufruf zum Hinzufügen den Eintrag erfolgreich hinzufügt, wird null zurückgegeben.

Wenn der Schlüssel bereits im Cache vorhanden ist, gibt die Methode ein Objekt zurück. In der Dokumentation wird jedoch nicht angegeben, ob das Objekt zurückgegeben wird, das Sie in den Cache oder das bereits im Cache gespeicherte Objekt eingefügt haben.

Logisch sollte es das Objekt bereits im Cache zurückgeben, da dies die einzige Information ist, die interresing ist. Sie haben bereits einen Verweis auf das Objekt, das Sie versuchen, in den Cache zu stellen.

+0

Danke Kumpel - jetzt macht das Sinn :) –

7

Um dies noch deutlicher, hier ist eine Konsolenanwendung, die das genauen Verhalten zeigt:

static void Main(string[] args) 
{ 
    string key = "key"; 

    HttpRuntime.Cache.Add(key, "first", null/*no depends*/, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, null/*no callback*/); 
    var addResult = HttpRuntime.Cache.Add(key, "second", null/*no depends*/, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, null/*no callback*/); 

    Console.WriteLine("addResult = {0}", addResult); 
    Console.WriteLine("Cache[key] = {0}", HttpRuntime.Cache[key]); 
} 

Und die Konsolenausgabe:

 
addResult = first 
Cache[key] = first 

Der "zweite" Anruf an .Add gibt zurück, was sich derzeit im Cache unter unserem Schlüssel befindet und schlägt fehl, den Eintrag zu aktualisieren!

Verwandte Themen