C# 私有构造函数和公共参数构造函数

C# 私有构造函数和公共参数构造函数,c#,oop,constructor,C#,Oop,Constructor,我听说私有构造函数阻止从外部世界创建对象 当我有密码的时候 public class Product { public string Name { get;set;} public double Price {get;set;} Product() { } public Product(string _name,double _price) { } } 在这里我仍然可以声明一个公共构造函数(参数),它不会破坏私有构造函数的用途吗?什么时候我们需

我听说私有构造函数阻止从外部世界创建对象

当我有密码的时候

public class Product
{
   public string Name { get;set;}
   public double Price {get;set;}
   Product()
   {
   }

   public Product(string _name,double _price)
   {
   }
}
在这里我仍然可以声明一个公共构造函数(参数),它不会破坏私有构造函数的用途吗?什么时候我们需要在代码中同时使用私有和公共构造函数(参数)


我需要一个详细的解释。

您使用所描述的模式的原因是当您想要控制对象的实例化方式时

例如,在您的示例中,您说创建产品的唯一方法是指定其名称和价格。当然,这是对外部世界的尊重。您也可以使用其他访问修饰符来执行类似的操作,这会有不同的含义,但归根结底,这都是为了控制您希望如何根据谁来执行操作来实例化对象

如果您想完全阻止对象创建,那么必须将所有构造函数设置为私有(或受保护)。这将强制从对象本身(或继承的类)中创建对象


另外,正如Matti在下面的评论中指出的,当定义参数化的构造函数时,不需要指定私有的默认构造函数。在这一点上,它是隐含的。

当您想要强制调用代码将值传递给构造函数以创建类的实例时,您将使用带参数的构造函数。在您的示例中,调用代码必须使用构造函数的参数版本,以便创建
产品

当您只希望从类本身内部调用该构造函数时,您需要一个私有构造函数。在您的示例中,您正在强制调用对象在创建对象时提供2个参数

使用私有构造函数,您可以执行以下操作:

public static GetInstance ()
{
   return new YourObject();
}
但是除了对象之外,没有其他东西可以调用无参数构造函数

它通常用于创建单例模式:


构造函数可以链接在一起,以避免重复代码,因此很常见的情况是,私有构造函数没有人应该在类外调用,但每个公共构造函数都只是链接到

例如:

public class Test
{
    private Test(int? a,string b) { }
    public Test(int a) : this(a, null) { }
    public Test(string b) : this(null, b) { }
}
这里有两个公共构造函数,一个接受字符串,一个接受int,它们都链接到接受两个参数的公共私有构造函数

当然,您也可以使用私有构造函数从同一个类中构造新对象,例如,您可能希望只有通过静态工厂方法才能使用专用构造函数:

public static Test Create()
{
    int? a = ReadConfigurationForA();
    string b = ReadConfigurationForB();
    return new Test(a, b);
}

在这里,向外界公开私有构造函数可能不是一个好主意,而是添加一个静态工厂方法,该方法获取正确的参数以传递给构造函数。

私有构造函数是一个特殊的实例构造函数。它通常用于仅包含静态成员的类中。如果一个类有一个或多个私有构造函数而没有公共构造函数,则不允许其他类(嵌套类除外)创建该类的实例

有关更多详细信息,请参阅:

使用参数定义构造函数会自动禁用默认无参数构造函数的创建,因此在这种情况下,不需要单独声明无参数构造函数private。