使用Lazy <T>对性能有害吗?

Ale*_*nor 11 c# .net-4.0 lazy-initialization

最近我遇到了一个singelton类的问题,这个类很懒,初始化一个字典,其中第二个线程会在实际填充之前尝试使用它.所以我通过Lazy<T>类实现了变量初始化.

这是我的代码:

private static Dictionary<string, string> GroupDefaults
{
    get { return mGroupDefaults.Value; }
}
private static Lazy<Dictionary<string, string>> mGroupDefaults =
    new Lazy<Dictionary<string,string>>(delegate
    {
        Dictionary<string, string> defaults = new Dictionary<string, string>();
        foreach (KeyValuePair<string, UnitGroup> groupDef in Groups)
            defaults.Add(groupDef.Key, groupDef.Value.First().Key);
        return defaults;
    });
Run Code Online (Sandbox Code Playgroud)

这解决了这个问题,现在我正在考虑将这个作为我的常规做法,Lazy<T>在我做懒惰初始化的任何地方使用该类,以避免任何可能的线程问题.所以基本上我想知道这是不是很好/普遍的做法?或者它会对性能有什么影响?

dle*_*lev 12

在不知道你有什么类型的性能限制的情况下很难说,但根据我的经验,一次性初始化很少成为瓶颈(因为根据定义它只发生一次.)Lazy<T>是为了向你提供这个确切的服务而编写的,所以我会建议使用它.

  • @ AlexHopeO'Connor这就是它被添加的原因!使用该类的缺点是,字段/属性的声明变得有点混乱(如您所见),但在性能方面,它是可靠的. (2认同)
  • 多数民众赞成我需要听到的,只是我没有在其他人的代码中看到很多这样的例子. (2认同)
  • @ AlexHopeO'Connor它只是添加到v4.0中的框架中,所以它还没有那么久.再加上它有点像一个利基类,你最终很少遇到它. (2认同)