私有构造函数的用途是什么?
除了单例模式之外,还有其他用途吗?
(注意:上面排除单例情况的原因是我不理解为什么需要单例,当有静态类可用时。您不必回答我在问题中的困惑。)
工厂模式
私有构造函数在使用工厂模式时非常有用(也就是说,使用静态函数获取类的实例而不是显式实例化)。
public class MyClass
{
private static Dictionary<object, MyClass> cache =
new Dictionary<object, MyClass>();
private MyClass() { }
public static MyClass GetInstance(object data)
{
MyClass output;
if(!cache.TryGetValue(data, out output))
cache.Add(data, output = new MyClass());
return output;
}
}
伪封装与嵌套子类
任何继承自外部类的嵌套类都可以访问私有构造函数。
例如,您可以使用此功能创建一个抽象类, 您可以从中继承,但其他人不能(使用internal
构造函数也可以在这里限制继承到单个程序集,但private
构造函数强制所有实现都是嵌套类)。
public abstract class BaseClass
{
private BaseClass() { }
public class SubClass1 : BaseClass
{
public SubClass1() : base() { }
}
public class SubClass2 : BaseClass
{
public SubClass2() : base() { }
}
}
基础构造函数
它们也可以用于创建“基础”构造函数,这些构造函数从不同的、更易访问的构造函数中调用。
public class MyClass
{
private MyClass(object data1, string data2) { }
public MyClass(object data1) : this(data1, null) { }
public MyClass(string data2) : this(null, data2) { }
public MyClass() : this(null, null) { }
}
在一个类中创建私有构造函数的目的
To restrict a class being inherited.
Restrict a class being instantiate or creating multiple instance/object.
To achieve the singleton design pattern.
public class TestPrivateConstructor
{
private TestPrivateConstructor()
{ }
public static int sum(int a , int b)
{
return a + b;
}
}
class Program
{
static void Main(string[] args)
{
// calling the private constructor using class name directly
int result = TestPrivateConstructor.sum(10, 15);
// TestPrivateConstructor objClass = new TestPrivateConstructor(); // Will throw the error. We cann't create object of this class
}
}
如果您的唯一目标是不希望它被实例化,那么将其设为静态即可。
如果您只是不希望它在类外被实例化(也许您只想用户通过类上的静态工厂获取一个实例),那么您需要一个私有构造函数来允许公开访问的静态工厂实例化它。
历史上,要使一个类不可实例化并没有总是使用静态关键字... 在静态关键字应用于类之前,将构造函数设为私有是一种方法来使它不可实例化。
私有构造函数是一种特殊的实例构造函数。在某些情况下,我们创建一个只有静态成员的类,因此创建该类的实例是无用的,这就是私有构造函数发挥作用的地方。
如果一个类有一个或多个私有构造函数且没有公共构造函数,则其他类(除嵌套类外)无法创建该类的实例。
例如:
class LogClass {
public static double e = Math.E; //2.71828
// Private Constructor:
private LogClass() {
}
}
空构造函数的声明会阻止自动生成无参构造函数。
如果构造函数没有使用访问修饰符,则默认为私有。 阅读更多:https://qawithexperts.com/tutorial/c-sharp/32/private-constructor-in-c-sharp
如果一个类只有私有构造函数,那么它就无法从外部实例化。
你也可以拥有不同签名的私有构造函数和公共构造函数。
public MyClass(string data2) : this(null, "Hello " + data2) { }
)此外,使用C#6的{get;}
属性,赋值代码仅在任何构造函数区域内有效,因此它们倾向于在那个“private”构造函数中。 - 5argon