为什么使用Lazy <T>而不是静态工厂类用于单身?

glo*_*pes 5 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));
    }    
}
Run Code Online (Sandbox Code Playgroud)

此模式具有以下优点:

  1. 类型初始化是懒惰的.
  2. 类型初始化是线程安全的.
  3. 单例访问只是一个没有方法调用的直接字段访问.

最近我发现了很多帖子,建议Lazy<T>实现类似的单例访问模式.Lazy<T>(或LazyInitializer)是否会为此实施带来任何好处?

Hei*_*nzi 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; }
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 你需要更少的样板代码(没有内部类),
  2. 您的代码的目的对于阅读它的每个人来说都很明显
  3. 这是很容易验证码是正确的,线程安全的(无需微妙的类型初始化的详细知识,一看Lazy<T>的文档就足够了),
  4. 阅读你的代码的人不会想知道为什么你重新发明轮子以及内置功能是否会有一些微妙的差别.

  • @glopes嗯,我认为我们必须同意不同意这样一个概念,即使用假设有关语言的晦涩知识的模式是一件好事.在学习环境中,也许 - 但在生产代码中,没有那么多...... :) (5认同)