C# - 尝试创建单例类

时间:2013-09-24 14:44:50

标签: c# singleton

我一直在阅读有关如何实现线程安全单例类的内容。我已经设法找到许多不同的方法来创建一个,但是我没有设法找到关于我应该在课堂上放置我的属性和方法等的信息。

例如:

public sealed class Singleton
{
   //Do I put properties here?     

   private Singleton() {}

   public static Singleton GetInstance()
   {
      return NestedSingleton.singleton;
   }

   class NestedSingleton
   {
      //Do I put properties here?  
      internal static readonly Singleton singleton = new Singleton();

      static NestedSingleton() {}

      //Do my methods go here
   }

  //or here?
}

3 个答案:

答案 0 :(得分:6)

这些方法将在外层进行。嵌套类的唯一目的是强制执行外部类的单例实例的初始化的特定时间。

不要忘记,您的GetInstance方法会返回对Singleton的引用 - 而不是NestedSingleton。实际上,NestedSingleton是私有的,因此Singleton之外的代码甚至不知道它的存在。您也可以将其设为static课程。 (即使尝试添加实例成员,也会阻止你。)

就个人而言,如果我希望真正严格控制初始化 - 我通常只使用Singleton类本身中的字段,我个人也会使用此表单。 (或Lazy<T> ...)这有点简单。如果您还没有遇到我的article on singleton implementations in C#,您可能需要查看它。 (我怀疑你已经看过了,但是......)

答案 1 :(得分:3)

您应该将所有实例成员放在外部类中。

内部类是私有持有者类型,仅存在于懒惰地初始化单例值 它应该是static

答案 2 :(得分:0)

您还可以查看this post,这是我在某些项目中使用的Singleton实现。

在C#&lt; 4,你可以使用:

public class Singleton
{
    private static Singleton _instance;
    private static object _lock = new object();

    private Singleton(){}

    public static Singleton Instance
    {
        get
        {
            if(_instance == null)
            {
               lock(_lock)
               {
                   if(_instance == null)
                       _instance = new Singleton();
               }
            }
            return _instance;
        }
    }
}

或在C#4

public class Singleton
{
     private Singleton(){}
     private static readonly Lazy<Singleton> _instance = new Lazy<Singleton>(()=>new Singleton());

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

此实现是线程安全的。