Dictionary.GetValueOrDefault方法:默认值参数是否会被始终执行?
关于缓存字典GetValueOrDefault默认值执行时机的问题
你当前写的代码里,new Thing()会每次调用方法时都被执行——不管缓存字典里有没有找到对应的"key"。这是因为C#的方法参数在调用方法之前就会完成求值,所以不管方法内部逻辑如何,默认值的构造代码都会先跑一遍,这显然会造成你担心的不必要性能开销。
如果想实现「仅当键不存在时才构造Thing」的逻辑,你需要使用**接受工厂委托(Func<T>)**的重载版本(如果你的缓存字典类提供了这个重载的话),写法是这样:
var myThing = _cache.GetValueOrDefault("key", () => new Thing());
如果你的缓存字典没有自带这个重载,也可以自己写一个扩展方法来实现这个逻辑:
public static TValue GetValueOrDefault<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, Func<TValue> defaultValueFactory) { if (dictionary.TryGetValue(key, out var value)) { return value; } // 只有没找到键的时候才会执行委托创建对象 return defaultValueFactory(); }
这样就能确保只有在缓存中找不到对应键的情况下,才会去构造Thing对象,避免不必要的性能消耗。
内容的提问来源于stack exchange,提问作者esbenr
相关产品推荐
相关产品推荐

