是否有任何理由只使用静态成员而不是静态成员?

时间:2016-03-21 11:32:43

标签: .net private-constructor

昨天我正在接受采访,其中一个问题是什么是单身人士,你是如何实施的。

MSDN's implementation

来自MSDN的解决方案#1:

using System;

public class Singleton
{
   private static Singleton instance;

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         if (instance == null)
         {
            instance = new Singleton();
         }
         return instance;
      }
   }
}

我给出了最简单的解决方案(msdn的实现中的解决方案编号1),而他想要线程安全的解决方案(解决方案编号3)。

来自MSDN的解决方案#3:

using System;

public sealed class Singleton
{
   private static volatile Singleton instance;
   private static object syncRoot = new Object();

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         if (instance == null) 
         {
            lock (syncRoot) 
            {
               if (instance == null) 
                  instance = new Singleton();
            }
         }

         return instance;
      }
   }
}

有趣的是msdn的例子中的私有构造函数。 我不知道存在这样的事情。

看看msdn on it

public class Counter
{
    private Counter() { }
    public static int currentCount;
    public static int IncrementCount()
    {
        return ++currentCount;
    }
}
然后我问:

为什么你会有一个只有静态成员的类,因此希望防止它被创建的实例,从而使用私有构造函数 - 而不是让类静态?!

PS 问题不在于单身人士 - 是关于描述我会选择创建一个只有静态成员的可实例化类的场景(最终创建私有构造函数的需要而不是使用静态类。

1 个答案:

答案 0 :(得分:4)

  

为什么你会有一个只有静态成员的类呢?   喜欢防止它被创建的实例,因此用于a   私有构造函数 - 而不是使类静态

在静态类上使用单例之间的主要区别在于,您可以在前者上实现接口,并将其传递给它,而不会绑定到singelton的具体实现细节,而静态类则不能。

除此之外,单例实例变量需要是静态的,并且可以作为常规实例成员公开。