C#中私有构造函数的需求是什么?

时间:2009-05-28 09:46:58

标签: c#

C#中私有构造函数的需求是什么? 我把它作为C#测试的问题。

12 个答案:

答案 0 :(得分:32)

例如,如果您的类只应通过工厂方法创建。或者,如果您有构造函数的重载,并且其中一些应该只由其他构造函数使用。可能还有其他原因=)

答案 1 :(得分:12)

如果你知道一些设计模式,那很明显:一个类可以在内部创建一个自己的新实例,而不是让别人去做。 Java中的一个例子(我不太了解C#,对不起)有一个单例类:

class Meh 
{
  private Meh() { }
  private static Meh theMeh = new Meh();
  public static Meh getInstance() { return theMeh; }
}

答案 2 :(得分:11)

每当您想要阻止从其外部直接实例化类时,您将使用private构造函数。例如,在引入static类的C#2.0之前,您使用private构造函数来完成大致相同的事情:

sealed class StaticClass {
     private StaticClass() {
     }
     public static void DoSomething() {
     }
}

答案 3 :(得分:9)

当您想要阻止类的用户直接实例化该类时。一些常见的情况是:

  • 仅包含静态方法的类
  • 单身

答案 4 :(得分:7)

我可以回忆起它的几个用法:

  • 您可以在同一类
  • 中的静态工厂方法中使用它
  • 你可以在里面做一些常见的工作,然后从其他结构中调用它
  • 您可以使用它来阻止运行时自动添加空结构
  • 可以使用(虽然是私有的)来自一些模拟和ORM工具(如nhibernate)

答案 5 :(得分:2)

例如,当您提供工厂方法来控制实例化时......

public class Test(){

  private Test(){
  }

  void DoSomething(){
    // instance method
  }

  public static Test CreateCoolTest(){
    return new Test();
  }
}

答案 6 :(得分:2)

私有构造函数用于在没有实例字段或方法(例如Math类)时或在调用方法来获取类的实例时阻止创建类的实例。如果类中的所有方法都是静态的,请考虑使整个类保持静态。有关更多信息,请参阅静态类和静态类成员。

class NLog
{
    // Private Constructor:
    private NLog() { }

    public static double e = System.Math.E;  //2.71828...
}

以下是使用私有构造函数的类的示例。

public class Counter
{
    private Counter() { }
    public static int currentCount;
    public static int IncrementCount()
    {
        return ++currentCount;
    }
}

class TestCounter
{
    static void Main()
    {
        // If you uncomment the following statement, it will generate
        // an error because the constructor is inaccessible:
        // Counter aCounter = new Counter();   // Error

        Counter.currentCount = 100;
        Counter.IncrementCount();
        System.Console.WriteLine("New count: {0}", Counter.currentCount);
    }
}

答案 7 :(得分:1)

虽然this link is related to java,但我认为它应该可以帮助您理解为什么这个想法几乎相同。

  

私有构造函数阻止调用者显式实例化类。有一些常见的情况,私有构造函数可能有用:

     
      
  • 仅包含静态实用程序方法的类
  •   
  • 仅包含常量的类
  •   
  • 类型安全枚举
  •   
  • 单身
  •   

答案 8 :(得分:1)

如果基类的构造函数的参数与子类构造函数的参数类型不同,但您仍需要子类的基类功能,例如,您可以将它与继承一起使用。受保护的方法。

一般情况下,应尽可能避免这种情况,因为这是一种糟糕的继承形式。

答案 9 :(得分:1)

我已经迟到了,但是通过阅读所有其他答案,我没有看到这种用法:

我在具有多个(公共)构造函数的场景中使用私有构造函数,并且它们都有一些共同的代码。使用构造函数链接,代码变得非常整洁和干燥。

请记住,私有只读变量只能在构造函数中设置,所以我不能使用常规方法。

示例:

public class MyClass
{
    private readonly int _a;
    private readonly int _b;
    private readonly string _x;

    public MyClass(int a, int b, string x)
        : this(x)
    {
        _a = a;
        _b = b;
    }

    public MyClass()
        : this("(not set)")
    {
        // Nothing set here...
    }

    private MyClass(string x)
    {
        _x = x;
    }
}

答案 10 :(得分:1)

当您遵循单一设计模式时,基本上您使用私有构造函数。在这种情况下,您在类内部定义了一个静态方法,该方法在内部调用私有构造函数。

因此,要首次创建类的实例,用户将调用classname.static_method_name。在这个方法中,由于类的对象尚不存在,静态方法在内部调用私有构造函数并返回类的实例。

如果类的实例已经存在,那么静态方法只是将实例返回给调用方法。

答案 11 :(得分:0)

当然,您可以使用私有构造函数来防止子类化。