为什么单独使用Lazy <t>而不是静态工厂类?

时间:2017-09-15 09:30:02

标签: c# singleton

在找到Lazy<T>类型之前,我使用以下模式来实现全局单例:

class DataModel
{
    public static XmlSerializer Serializer
    {
        get { return SerializerFactory.instance; }
    }

    static class SerializerFactory
    {
        internal static readonly XmlSerializer instance =
            new XmlSerializer(typeof(DataModel));
    }    
}

此模式具有以下优点:

  1. 类型初始化是懒惰的。
  2. 类型初始化是线程安全的。
  3. 单例访问只是一个没有方法调用的直接字段访问。
  4. 最近我发现很多帖子建议Lazy<T>实现类似的单例访问模式。 Lazy<T>(或LazyInitializer)会为此实施带来任何好处吗?

2 个答案:

答案 0 :(得分:9)

<强>可读性

这是使用Lazy<T>实现代码时的样子:

class DataModel
{
    private static readonly Lazy<XmlSerializer> lazySerializer = 
       new Lazy<XmlSerializer>(() => new XmlSerializer(typeof(DataModel)));

    public static XmlSerializer Serializer
    {
        get { return lazySerializer.Value; }
    }
}
  1. 您需要更少的样板代码(没有内部类),
  2. 您的代码的目的是立即显而易见给所有阅读它的人
  3. 更容易验证代码是否正确且是线程安全的(不需要了解细微类型的初始化详细信息,看看Lazy<T>'s documentation就足够了),
  4. 读取代码的人不会想知道为什么要重新启动方向盘以及内置功能是否存在细微差别。

答案 1 :(得分:3)

Lazy<T>更具表现力。很明显,该值使用延迟初始化。

例如,我在某些资源的初始化太重而无法放入构造函数的情况下使用它,并且我不希望API使用者调用一些显式的Initialize例程。