为什么我们需要一个私人构造函数?

如果一个类有一个私有的构造函数,那么它不能被实例化。 所以,如果我不希望我的类被实例化并仍然使用它,那么我可以将它静态化。

什么是私人构造函数的使用?

它也被用在单例类中,但除此之外,还有其他的用法吗?

(注:我之所以排除上面的单例情况,是因为我不明白为什么我们需要一个单例,当有一个静态类时,你可能不会回答这个问题。

私有构造函数在使用工厂模式(换句话说,用于获取类的实例而不是显式实例化的静态函数)时可能很有用。

public class MyClass { private static Dictionary<object, MyClass> cache = new Dictionary<object, MyClass>(); private MyClass() { } public static MyClass GetInstance(object data) { MyClass output; if(!cache.TryGetValue(data, out output)) cache.Add(data, output = new MyClass()); return output; } } 

与嵌套儿童伪密封

任何从外部类inheritance的嵌套类都可以访问私有构造函数。

例如,你可以使用这个来创build一个可以inheritance的抽象类,但是没有其他人( internal构造函数也可以在这里把inheritance限制在一个单独的程序集中,但是private构造函数强制所有的实现都是嵌套类。 )

 public abstract class BaseClass { private BaseClass() { } public class SubClass1 : BaseClass { public SubClass1() : base() { } } public class SubClass2 : BaseClass { public SubClass2() : base() { } } } 

基础构造函数

它们也可以用来创build从不同的,更容易访问的构造函数中调用的“基础”构造函数。

 public class MyClass { private MyClass(object data1, string data2) { } public MyClass(object data1) : this(data1, null) { } public MyClass(string data2) : this(null, data2) { } public MyClass() : this(null, null) { } } 

正如Stefan,Adam和其他人所指出的那样, 私人构造函数在不希望由类之外的代码创build类的情况下非常有用 。 单身人士,工厂,静态方法对象是能够限制一个types的构造对于强制执行特定模式的例子。

要回答你的问题的第二部分,为什么需要单身人士,如果存在静态类:单身人士和静态类是相同的。

例如,一个单例类可以实现一个接口,一个静态类不能。 一个单例对象可以作为parameter passing给方法 – 这对于静态类而言并不容易,不需要使用包装对象或reflection。 还有一些情况下,你可能想要创build一个叶子类中的一个(或多个)是单例的inheritance层次结构 – 这对于静态类也是不可能的。 作为另一个例子,你可能有几个不同的单例,你可能想要在运行时基于环境或configuration参数实例化其中的一个 – 这对静态类也是不可能的。

理解语言特征并select合适的工作非常重要 – 他们在那里是有原因的。

有时你不应该能够实例化一个类。 这使得这个在编译器级显式执行。

单身人士只是一个用例。 常量类,静态方法类和其他types的模式决定了一个类不应该是可实例化的。

那么如果你唯一的目标是你不希望它被实例化,那么静态就足够了。

如果otoh,你根本不想让它在课堂外实现(也许你只希望用户通过在课堂上使用静态工厂来获得) – 那么你需要一个私人的ctor来允许那些可公开访问的静态工厂来实例化它。

从历史的angular度来说,记住静态类的创build并不总是在…将ctor私有化是一种使静态关键字可以应用于类之前不能实例化的方法(这是一个单词吗?)。

您可以使用它来强制一个单例实例或创build一个工厂类。

静态方法可以调用私有构造函数来创build该类的新实例。

例如一个单例实例:

 public class Foo { private Foo (){} private Foo FooInstance {get;set;} public static Foo GetFooInstance () { if(FooInstance == null){ FooInstance = new Foo(); } return FooInstance; } } 

这只允许创build一个类的实例。

用于在类中创build私有构造函数

  1. 限制被inheritance的类。

  2. 限制正在实例化或创build多个实例/对象的类。

  3. 实现单身devise模式。

     public class TestPrivateConstructor { private TestPrivateConstructor() { } public static int sum(int a , int b) { return a + b; } } class Program { static void Main(string[] args) { // calling the private constructor using class name directly int result = TestPrivateConstructor.sum(10, 15); // TestPrivateConstructor objClass = new TestPrivateConstructor(); // Will throw the error. We cann't create object of this class } } 

如果类只有私有的构造函数,它不能从外部实例化。

你也可以拥有不同签名的私有构造函数和公共构造函数。

如果你想为一个类创build一个工厂,你可以使用一个私有的构造器,并且为这个类添加一些静态的“工厂”方法来创build这个类。

一个例子是Graphics类,From *方法。

关于单身人士 – 单身人士是一种devise模式,当环境和要求满足模式使用的相似动机时使用; 静态类是一种语言function。

正如LBushkin的回答所讨论的那样,尽pipe使用静态类可以满足使用单例的一些目标,但单例的一个特定实现可能会超出静态类的特征集。

  • 私人构造的一个用途是当我们只有静态成员时。
  • 一旦我们提供了一个私有的,公共的或者其他的构造函数,编译器就不会允许我们在没有参数的情况下向类中添加公共构造函数。
  • 如果我们想要创build类的对象,即使我们有私有构造函数,那么我们需要有公共构造函数和私有构造函数