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

时间:2009-08-17 06:04:33

标签: asp.net caching

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

  

注意:添加和插入方法有   相同的签名,但有   他们之间的细微差别。   首先,调用Add方法返回一个表示对象的对象   缓存项,同时调用Insert   不即可。其次,他们的行为是   如果你称这些方法不同   并将项目添加到缓存中   已存储在那里。插入   方法替换项目,而   添加方法失败。 [强调我的]

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

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

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

4 个答案:

答案 0 :(得分:12)

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

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

注意out object valueOld - 它被设置为当前位于缓存中“cacheKey”位置的对象,并作为Add()的结果返回。该文档具有误导性,它实际上并不是返回的 object - 它是该相同键位置的任何对象。

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

 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"

答案 1 :(得分: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]);
}

控制台输出:

addResult = first
Cache[key] = first

.Add的“第二次”调用会返回我们的密钥下目前位于缓存中的内容,无法更新该条目!

答案 2 :(得分:2)

如果Add方法调用成功添加项目,则返回null。

如果密钥已存在于缓存中,则该方法返回一个对象。但是,文档没有说明它是否返回您尝试放入缓存的对象或已存储在缓存中的对象。

逻辑上它应该返回缓存中已有的对象,因为这是唯一有用的信息。您已经有了对尝试放入缓存的对象的引用。

答案 3 :(得分:0)

如果相同的对象已经存储在缓存中,则它只返回一个对象(在另一个键下,我猜在同一个键下)。否则返回null。该文档具有误导性:

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

在Reflector中查看它,两个方法似乎都调用相同的内部方法,ADD返回先前存储在同一个键下的旧对象,而INSERT方法只是忽略该值。