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

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

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

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

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

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

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

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

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

我可以回想起它的一些用法:

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

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

 public class Test(){ private Test(){ } void DoSomething(){ // instance method } public static Test CreateCoolTest(){ return new Test(); } } 

当没有实例字段或方法(如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); } } 

虽然这个链接与java有关 ,但我认为它应该可以帮助你理解为什么这个想法几乎是一样的。

私有构造函数阻止类被调用者显式实例化。 在某些常见情况下,私有构造函数可能很有用:

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

如果基类的构造函数的参数与子类构造函数的参数类型不同,但您仍需要子类的基类function,例如,您可以将其与inheritance一起使用。 保护方法。

通常尽管应该尽可能避免这种情况,因为这是一种糟糕的inheritanceforms。

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

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

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

例:

 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; } } 

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

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

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

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