嵌套类中的空私有构造函数是否有意义?

时间:2015-01-14 13:26:30

标签: c#

我遇到了一个嵌套类的源代码,如下所示:

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

  

这些构造函数被注入到所有不引入其他构造函数的类声明中。

因此,我的嵌套类的空构造函数不是默认构造函数,而只是一个没有参数的构造函数。我假设顶级类和嵌套类都是这种情况。

3 个答案:

答案 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,就可以调用它来创建类的实例,但这将是一个非常小的利基要做的事情!