为什么Cache.Add返回一个表示缓存项的对象?

Pur*_*ome 11 asp.net caching

从MSDN有关添加或插入ASP.NET缓存项的区别:

注意:Add和Insert方法具有相同的签名,但它们之间存在细微差别. 首先,调用Add方法返回一个表示缓存项的对象,而调用Insert则不会.其次,如果您调用这些方法并将项目添加到已存储在其中的缓存中,则它们的行为会有所不同.Insert方法替换该项,而Add方法失败.[强调我的]

第二部分很简单.毫无疑问.

但是对于第一部分,为什么要返回表示缓存项的对象?如果我正在尝试将项目添加到缓存中,我已经/知道该项目是什么?

我不明白.这背后的原因是什么?

wom*_*omp 12

在缓存上调用Add()最终会使用此签名调用内部方法:

internal abstract CacheEntry UpdateCache(CacheKey cacheKey, 
    CacheEntry newEntry, bool replace, CacheItemRemovedReason removedReason, 
    out object valueOld);
Run Code Online (Sandbox Code Playgroud)

请注意out object valueOld- 这将设置为当前位于缓存中"cacheKey"位置的对象,并作为Add()的结果返回.该文档具有误导性,它实际上并不是返回的相同对象 - 它是在同一个关键位置的任何对象.

使用以下代码可以轻松验证:

 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"
Run Code Online (Sandbox Code Playgroud)


Jar*_*xon 7

为了使这更清楚,这是一个控制台应用程序,演示了确切的行为:

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]);
}
Run Code Online (Sandbox Code Playgroud)

和控制台输出:

addResult = first
Cache[key] = first

"第二次"调用.Add返回当前在我们的密钥下的缓存中的内容并且无法更新条目!