在 C# 中,私有构造函数的作用是什么?我在一次 C# 测试中看到了这个问题。
如果你了解一些设计模式,那就很明显:一个类可以在内部创建一个新的实例,不让其他人这样做。 以下是一个Java的例子(抱歉我不太熟悉C#)使用单例模式:
class Meh
{
private Meh() { }
private static Meh theMeh = new Meh();
public static Meh getInstance() { return theMeh; }
}
如果你想要防止类外部进行直接实例化,你需要使用私有构造函数(private
constructor)。例如,在C# 2.0之前引入static
类的情况下,你就需要使用私有构造函数来实现类似的功能:
sealed class StaticClass {
private StaticClass() {
}
public static void DoSomething() {
}
}
当你想要防止类的用户直接实例化该类时,可以使用以下方法。常见的情况包括:
我可以回忆起它的几个用途:
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);
}
}
public class Test(){
private Test(){
}
void DoSomething(){
// instance method
}
public static Test CreateCoolTest(){
return new Test();
}
}
我虽然来得晚,但是阅读了所有其他答案后,我没有看到提到以下用法:
我在多个(公共的)构造函数中使用私有构造函数的情况下,并且它们都有一些共同的代码。通过构造函数链接,代码变得非常整洁和DRY。
请记住,私有只读变量只能在构造函数中设置,因此我不能使用普通方法。
例如:
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;
}
}
虽然这个链接与Java有关,但我认为它应该能帮助你理解原因,因为这个想法基本上是相同的。
私有构造函数可以防止调用者显式实例化类。以下是一些常见情况,私有构造函数可能会有用:
- 只包含静态实用方法的类
- 只包含常量的类
- 类型安全枚举
- 单例模式