从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)
为了使这更清楚,这是一个控制台应用程序,演示了确切的行为:
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返回当前在我们的密钥下的缓存中的内容并且无法更新条目!
| 归档时间: |
|
| 查看次数: |
3796 次 |
| 最近记录: |