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

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

当我有一个代码

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

在这里我仍然可以声明一个公共构造函数(参数),它不会破坏私有构造函数的目的吗? 我们什么时候需要代码中的私有和公共构造函数(参数)?

我需要详细说明。

您要使用所描述的模式的原因是您希望控制对象的实例化方式。

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

如果您想完全阻止对象创建,则必须将所有构造函数设置为私有(或受保护)。 这将强制从其自身(或inheritance的类)内创建对象。

另外,正如Matti在下面的注释中指出的那样,当您定义一个参数化的构造函数时,您不需要指定私有默认构造函数。 那时隐含着。

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

例:

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

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

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

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

 public static GetInstance () { return new YourObject(); } 

但除了对象之外别无其他可以调用无参数构造函数。

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

http://www.dofactory.com/Patterns/PatternSingleton.aspx

如果要强制调用代码将值传递给构造函数以创建类的实例,则可以使用带参数的构造函数。 在您的示例中,调用代码必须使用构造函数的参数版本才能创建Product

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

有关更多详细信息,请参阅: http : //msdn.microsoft.com/en-us/library/kcfb85a6(VS.80).aspx