哪种单例实现更适合C#

哪种单例实现更适合C#,c#,singleton,C#,Singleton,在C#中实现单例模式有多种不同的方法。我将在这里以与优雅相反的顺序介绍它们,从最常见的非线程安全版本开始,逐步发展到完全延迟加载、线程安全、简单且高性能的版本 我在谷歌“如何实现单例”中找到了3种方法,哪种单例实现更适合C# 1) 此代码使用lock() 公共类单例 { //Singleton类的静态对象。 私有静态易失性单例_instance=null; /// ///提供对singleton对象的全局访问的静态方法。 /// ///Singleton类的Singleton对象。 公共静态

在C#中实现单例模式有多种不同的方法。我将在这里以与优雅相反的顺序介绍它们,从最常见的非线程安全版本开始,逐步发展到完全延迟加载、线程安全、简单且高性能的版本

我在谷歌“如何实现单例”中找到了3种方法,哪种单例实现更适合C#

1) 此代码使用lock()

公共类单例
{
//Singleton类的静态对象。
私有静态易失性单例_instance=null;
/// 
///提供对singleton对象的全局访问的静态方法。
/// 
///Singleton类的Singleton对象。
公共静态单例实例()
{
if(_instance==null)
{
锁(类型(单件))
{
_instance=newsingleton();
}
}
返回_实例;
}
/// 
///构造函数本质上是私有的,以限制访问。
/// 
私有单例(){}
}  
2) 此代码是静态初始化的

/// <summary>
/// A sealed class providing access to it's ONLY readonly static instance.
/// </summary>
sealed class SingletonCounter 
{
    public static readonly SingletonCounter Instance = 
         new SingletonCounter();

    private SingletonCounter() {}
}
//
///提供对其唯一只读静态实例的访问的密封类。
/// 
密封类单音计数器
{
公共静态只读SingletonCounter实例=
新的单音计数器();
专用SingletonCounter(){}
}
3) 此代码使用惰性类型。

public sealed class Singleton
{
    private static readonly Lazy<Singleton> lazy =
        new Lazy<Singleton>(() => new Singleton());

    public static Singleton Instance { get { return lazy.Value; } }

    private Singleton()
    {
    }
} 
公共密封类单例
{
私有静态只读惰性=
新的懒惰(()=>newsingleton());
公共静态单例实例{get{return lazy.Value;}}
私人单身人士()
{
}
} 

除非有过度使用的理由,否则你应该选择“简单”。事实上,您已经清楚地演示了使用更奇特的模式可能会把它们搞乱(如1,其中至少有2个值得注意的问题)。所以你应该选择2,因为它显然是正确的。它的缺点是它不是懒惰的,但是因为在类型上没有其他方法,所以您可以做的唯一有用的事情就是获取实例,所以这不是一个问题:从来没有一种情况下它懒惰是有用的。它也是完全无锁的,并且不需要评估获取实例的条件。

按照您介绍的方法,第三种方法听起来不错。你必须使用单件吗?你考虑过单元测试吗?6种方法:你没有正确锁定1)1)也应该仔细检查;Lasy(#3)是线程安全的吗?@user2068793是的,但它比需要的更复杂。对于如图所示的类,它没有任何实用工具是
惰性的
——它有开销,并且不能解决任何问题。
public sealed class Singleton
{
    private static readonly Lazy<Singleton> lazy =
        new Lazy<Singleton>(() => new Singleton());

    public static Singleton Instance { get { return lazy.Value; } }

    private Singleton()
    {
    }
}