C#中私有构造函数的需求是什么? 我把它作为C#测试的问题。
答案 0 :(得分:32)
例如,如果您的类只应通过工厂方法创建。或者,如果您有构造函数的重载,并且其中一些应该只由其他构造函数使用。可能还有其他原因=)
答案 1 :(得分:12)
如果你知道一些设计模式,那很明显:一个类可以在内部创建一个自己的新实例,而不是让别人去做。 Java中的一个例子(我不太了解C#,对不起)有一个单例类:
class Meh
{
private Meh() { }
private static Meh theMeh = new Meh();
public static Meh getInstance() { return theMeh; }
}
答案 2 :(得分:11)
每当您想要阻止从其外部直接实例化类时,您将使用private
构造函数。例如,在引入static
类的C#2.0之前,您使用private
构造函数来完成大致相同的事情:
sealed class StaticClass {
private StaticClass() {
}
public static void DoSomething() {
}
}
答案 3 :(得分:9)
当您想要阻止类的用户直接实例化该类时。一些常见的情况是:
答案 4 :(得分:7)
我可以回忆起它的几个用法:
答案 5 :(得分:2)
例如,当您提供工厂方法来控制实例化时......
public class Test(){
private Test(){
}
void DoSomething(){
// instance method
}
public static Test CreateCoolTest(){
return new Test();
}
}
答案 6 :(得分:2)
私有构造函数用于在没有实例字段或方法(例如Math类)时或在调用方法来获取类的实例时阻止创建类的实例。如果类中的所有方法都是静态的,请考虑使整个类保持静态。有关更多信息,请参阅静态类和静态类成员。
class NLog
{
// Private Constructor:
private NLog() { }
public static double e = System.Math.E; //2.71828...
}
以下是使用私有构造函数的类的示例。
public class Counter
{
private Counter() { }
public static int currentCount;
public static int IncrementCount()
{
return ++currentCount;
}
}
class TestCounter
{
static void Main()
{
// If you uncomment the following statement, it will generate
// an error because the constructor is inaccessible:
// Counter aCounter = new Counter(); // Error
Counter.currentCount = 100;
Counter.IncrementCount();
System.Console.WriteLine("New count: {0}", Counter.currentCount);
}
}
答案 7 :(得分:1)
虽然this link is related to java,但我认为它应该可以帮助您理解为什么这个想法几乎相同。
私有构造函数阻止调用者显式实例化类。有一些常见的情况,私有构造函数可能有用:
- 仅包含静态实用程序方法的类
- 仅包含常量的类
- 类型安全枚举
- 单身
答案 8 :(得分:1)
如果基类的构造函数的参数与子类构造函数的参数类型不同,但您仍需要子类的基类功能,例如,您可以将它与继承一起使用。受保护的方法。
一般情况下,应尽可能避免这种情况,因为这是一种糟糕的继承形式。
答案 9 :(得分:1)
我已经迟到了,但是通过阅读所有其他答案,我没有看到这种用法:
我在具有多个(公共)构造函数的场景中使用私有构造函数,并且它们都有一些共同的代码。使用构造函数链接,代码变得非常整洁和干燥。
请记住,私有只读变量只能在构造函数中设置,所以我不能使用常规方法。
示例:
public class MyClass
{
private readonly int _a;
private readonly int _b;
private readonly string _x;
public MyClass(int a, int b, string x)
: this(x)
{
_a = a;
_b = b;
}
public MyClass()
: this("(not set)")
{
// Nothing set here...
}
private MyClass(string x)
{
_x = x;
}
}
答案 10 :(得分:1)
当您遵循单一设计模式时,基本上您使用私有构造函数。在这种情况下,您在类内部定义了一个静态方法,该方法在内部调用私有构造函数。
因此,要首次创建类的实例,用户将调用classname.static_method_name。在这个方法中,由于类的对象尚不存在,静态方法在内部调用私有构造函数并返回类的实例。
如果类的实例已经存在,那么静态方法只是将实例返回给调用方法。
答案 11 :(得分:0)
当然,您可以使用私有构造函数来防止子类化。