退伍军人请原谅我提出愚蠢的问题。我知道有一个私有构造函数的类会阻止实例的创建。
class InterestRate
{
// static constructor
static InterestRate()
{
}
//private constructor
private InterestRate()
{
}
// private overloaded constructor
private InterestRate(double d1,double d2)
{
}
// overloaded constructor
public InterestRate(int a,int b)
{
Console.WriteLine("a={0},b={0}",a,b);
}
}
static void Main()
{
//As it is private constructor invokation i can not create a instance
InterestRate firstInstance=new InterestRate();
// non-private overloaded constructor allow me to craete instance
InterestRate r=new InterestRate(10,10);
}
我的问题是,如果具有私有构造函数的类阻止实例创建,为什么该类支持具有非私有构造函数?
答案 0 :(得分:6)
私有构造函数不仅阻止来自外部世界的实例化 - 它们通常在类中启用构造。实际上,私有构造函数经常用于防止实例化的唯一原因是避免编译器默认添加公共无参数构造函数。这是私有构造函数阻碍其他调用者的唯一方式。
例如,假设您有一个需要在其构造函数中接受集合的类。公共构造函数可能总是采取防御措施,复制集合。但是,您可能遇到某些情况,其中类中的代码想要创建新实例并且知道不需要复制集合,只需要复制引用。这只是私有构造函数很有意义的一种情况。
但确实取决于具体情况。
答案 1 :(得分:2)
向类添加私有构造函数意味着您将无法创建该类的实例。相反,它只意味着您可以在类本身的上下文中访问构造函数(例如,通过使用静态工厂方法)。
答案 2 :(得分:1)
在这个问题的上下文中,构造函数的行为与任何其他方法一样 - 私有的方法在类外是不可访问的,而公共的方法是可访问的。正如Jon所提到的,通常添加一个没有参数的私有构造函数只会阻止编译器添加一个没有参数的默认公共构造函数。如果类中已经存在另一个构造函数(private parametersless或者其他),编译器将不会添加此默认构造函数。
因此,私有构造函数不会阻止实例创建 - 它只是将实例创建限制为仅在类的方法内完成(可能是公共静态方法)。而这只与该特定私有构造函数的使用有关。任何其他构造函数都允许根据自己的修饰符创建实例。
答案 3 :(得分:0)
此外,如果你有一个带有参数的私有构造函数,以及一个不带参数的公共构造函数,你仍然可以从公共构造函数中调用私有构造函数。