2

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

例如:

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?
}
4

3 回答 3

6

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

不要忘记您的GetInstance方法返回对 -not 的Singleton引用NestedSingleton。确实,NestedSingleton是私有的,所以外部的代码Singleton甚至不知道它的存在。你可能也想让它成为一个static类。(这甚至会阻止您尝试向其中添加实例成员。)

就我个人而言,如果我想对初始化进行真正严格的控制,我只会使用这种形式——通常我只会在Singleton类本身中使用一个字段。(或Lazy<T>...)这有点简单。如果您还没有看到我关于 C# 中的单例实现的文章,您可能想看看它。(我怀疑你已经看过了,但是......)

于 2013-09-24T14:46:24.680 回答
3

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

内部类是一个私有持有者类型,它的存在只是为了延迟初始化单例值。
应该是static

于 2013-09-24T14:46:33.547 回答
0

你也可以看看这篇文章,这是我在一些项目中使用的 Singleton 实现。

在 C# < 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; } }
}

这个实现是线程安全的。

于 2013-09-24T14:53:12.300 回答