You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 10:22:03