为什么我们需要私有构造函数?

时间:2010-04-06 14:56:10

标签: c# .net asp.net

如果某个类有私有构造函数,则无法实例化它。 所以,如果我不希望我的类被实例化并仍然使用它,那么我可以使它静止。

私有构造函数有什么用?

此外,它在单身人士课程中使用,但除此之外,还有其他用途吗?

(注意:我之所以排除上面的单例案例的原因是我不明白为什么在有静态类可用时我们根本需要一个单例。你可能不会因为我在这个问题上的混乱而回答这个问题。)

10 个答案:

答案 0 :(得分:64)

<强>工厂

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

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

与嵌套儿童伪密封

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

例如,您可以使用它来创建可以继承的抽象类,但没有其他人(internal构造函数也可以在此处将继承限制为单个程序集,但private构造函数强制所有实现都是嵌套类。)

public abstract class BaseClass
{
    private BaseClass() { }

    public class SubClass1 : BaseClass
    {
        public SubClass1() : base() { }
    }

    public class SubClass2 : BaseClass
    {
        public SubClass2() : base() { }
    }
}

基础构造函数

它们还可用于创建从不同的,更易于访问的构造函数调用的“基础”构造函数。

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) { }
}

答案 1 :(得分:32)

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

要回答问题的第二部分,如果存在静态类,为什么需要单例:单例和静态类不等于

例如,单例类可以实现一个接口,一个静态类不能。单例对象可以作为参数传递给方法 - 这对于静态类来说并不容易,而不需要使用包装器对象或反射。在某些情况下,您可能希望创建一个继承层次结构,其中一个(或多个)叶类是单例 - 这对于静态类也是不可能的。作为另一个示例,您可能有几个不同的单例,并且您可能希望在运行时基于环境或配置参数实例化其中一个 - 静态类也无法实现这一点。

了解语言功能并为工作选择正确的功能非常重要 - 他们出于某种原因。

答案 2 :(得分:15)

有时你不应该能够实例化一个类。这使得它明确并在编译器级别强制执行此操作。

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

答案 3 :(得分:2)

如果您的唯一目标是您不希望它被实例化,那么将其设置为静态就足够了。

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

从历史上看,请记住,使一个类静态并不总是存在...在将静态关键字应用于类之前,使ctor变为私有是一种使其不可实例化(这是一个单词吗?)的方法。 ..

答案 4 :(得分:2)

您可以使用它来强制singleton实例或创建factory类。

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

例如单例实例:

public class Foo
{

  private Foo (){}

  private Foo FooInstance {get;set;}

  public static Foo GetFooInstance ()
  {
    if(FooInstance == null){
      FooInstance = new Foo();
    }

    return FooInstance;
  }

}

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

答案 5 :(得分:2)

用于在类

中创建私有构造函数的目的
  1. 限制继承的类。

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

  3. 实现单例设计模式。

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

答案 6 :(得分:1)

关于单身人士 - 单身人士是一种设计模式,当环境和要求满足模式使用的类似动机时使用;静态类是一种语言特性。

正如LBushkin's answer所讨论的那样,虽然使用静态类可以满足使用单例的一些目标,但单例的特定实现可能会超出静态类的特征集。

答案 7 :(得分:0)

如果类只有私有构造函数,则无法从外部实例化。

您还可以拥有具有不同签名的私有构造函数和公共构造函数。

答案 8 :(得分:0)

如果要为类创建工厂,可以使用私有构造函数,并向类本身添加一些静态“工厂”方法以创建类。

这方面的一个例子是Graphics类,使用From *方法。

答案 9 :(得分:0)

私有构造函数是一个特殊的实例构造函数。并在某些情况下用于创建仅具有静态成员的类,因此创建此类的实例是无用的,这就是私有构造函数起作用的地方。

如果一个类具有一个或多个私有构造函数而没有公共构造函数,则其他类(嵌套类除外)不能创建该类的实例。

示例:

class LogClass {

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

  // Private Constructor:
  private LogClass() { 

 }  
}

空构造函数的声明会阻止参数较少的构造函数的自动生成。

如果未在构造函数中使用access修饰符,则默认情况下它将仍然是私有的。 了解更多:https://qawithexperts.com/tutorial/c-sharp/32/private-constructor-in-c-sharp