我遇到了一个嵌套类的源代码,如下所示:
public class OuterClass
{
// code of the outer class
protected class NestedClass
{
private string myVar;
private NestedClass() {} // <--- empty private ctor
public NestedClass(string myVar)
{
this.myVar = myVar;
}
}
}
创建这个空私有构造函数的原因是什么?
我知道在实现单例时,构造函数必须是私有的,以防止其他类创建实例。但是在这种情况下是另一个公共构造函数,所以这不是原因。
我想到的一个原因是不允许创建没有变量值的实例,它作为参数传递给公共构造函数,但据我所知,这不应该是可能的。除了带参数的公共构造函数之外,没有其他构造函数是简单的。这是对的吗?
编辑:现在已删除的答案,提到了默认构造函数。据我所知,有一个&#34;隐藏&#34;默认构造函数仅在根本没有手动编写的构造函数时才存在。这被描述为here:
这些构造函数被注入到所有不引入其他构造函数的类声明中。
因此,我的嵌套类的空构造函数不是默认构造函数,而只是一个没有参数的构造函数。我假设顶级类和嵌套类都是这种情况。
答案 0 :(得分:1)
如果你有一个非默认构造函数并且没有指定默认构造函数,那么任何代码都不可能访问默认构造函数,因为编译器不会创建一个。
如果您有非默认构造函数并且还指定了私有默认构造函数,则NestedClass
方法可以使用默认构造函数。您的代码不会这样做,因此没有必要提供默认构造函数(私有或其他)。
还有一个不起眼的情况,它可以产生影响:通过提供默认的NestedClass
构造函数,您可以启用反射来访问它。
以下程序演示。
如果你运行它,它将打印“Demo.OuterClass + NestedClass”。
如果您注释掉私有默认NestedClass
构造函数并运行它,它将崩溃。
除了这种不太可能的情况,我认为没有明智的理由提供私人构造函数。
using System;
using System.Reflection;
namespace Demo
{
public class OuterClass
{
protected class NestedClass
{
private string myVar;
private NestedClass(){} // Commenting-out this line will cause the reflection to break.
public NestedClass(string myVar)
{
this.myVar = myVar;
}
}
}
public class MyDerivedClass: OuterClass
{
public MyDerivedClass()
{
Type type = typeof(NestedClass);
var ctor = type.GetConstructor(BindingFlags.Instance|BindingFlags.NonPublic, null, Type.EmptyTypes, null);
var nested = (NestedClass) ctor.Invoke(null);
Console.WriteLine(nested);
}
}
public static class Program
{
private static void Main()
{
var test = new MyDerivedClass();
}
}
}
如果你不想明确允许反射调用私有默认构造函数,那么我会说提供它确实没有意义,你应该从代码中删除它。
答案 1 :(得分:0)
我认为这意味着只有这个类可以使用这个构造函数创建自己的实例。类中的代码是否在任何地方调用此构造函数?
答案 2 :(得分:0)
通常你会有一个私有构造函数,如果类想要限制你调用它上面定义的某种工厂方法来创建它,但是因为有另一个构造函数定义然后这似乎不是这样的
你可以使用反射来定位私有构造函数,一旦你获得私有构造函数的ConstructorInfo,就可以调用它来创建类的实例,但这将是一个非常小的利基要做的事情!