【问题标题】:what is the default constructor access modifer?什么是默认构造函数访问修饰符?
【发布时间】:2014-04-01 06:38:42
【问题描述】:

我对默认构造函数访问修饰符是什么以及这个 MSDN statemtn 说什么感到困惑

 If the direct base class does not have an accessible parameterless instance constructor, a compile-time error occurs.

因为当我将它应用于测试程序时,它失败了。我可以创建一个继承另一个类的对象或类,尽管没有定义外部无参数构造函数。

class A 
{
}
class B : A
{
}
class C
{

    public void main()
    {

        B objB = new B();// as per MSDN here should be the compile time error.

    }
}

[Source]

【问题讨论】:

  • B 有一个自动生成的公共默认构造函数。
  • 所以你的意思是在 B 中,如果我在外部将无参数构造函数设为私有,那么只会出现编译时错误。
  • 但是 Jon Skeet 回答的另一个链接说 C# 中所有内容的默认访问权限是“您可以为该成员声明的最受限制的访问权限”。这与此 MSDN 链接相矛盾。
  • 如果一个类是内部的,那么它的默认构造函数也是公共的..

标签: c#


【解决方案1】:

如果直接基类没有可访问的无参数 实例构造函数,发生编译时错误。

如果类的构造函数未定义,编译器会自动生成一个public默认构造函数。

【讨论】:

    【解决方案2】:

    如果一个类不包含实例构造函数声明,默认 实例构造函数是自动提供的。该默认值 构造函数只是调用直接的无参数构造函数 基类。如果直接基类没有可访问的 无参数实例构造函数,发生编译时错误。如果 该类是抽象的,然后声明的默认可访问性 构造函数受保护。否则,声明的可访问性为 默认构造函数是公共的。

    在您的示例中,所有类 A、B、C 都是使用 默认内部 无参数构造函数创建的。

    由于这两个类都在同一个程序集中,并且默认情况下是内部构造函数,因此您不会收到编译错误。但是,如果您在 B 类中声明 non-accessible 构造函数(例如私有或受保护),您的示例中会出现编译错误。

    【讨论】:

    • A->B->C 如果基类中的任何一个有私有构造函数,会出现编译错误?
    • 如果一个类是内部的,那么它的默认构造函数也是公共的..?
    • @NoviceToDotNet:我已经更新了我的答案,因为它并不完全正确。
    【解决方案3】:

    如果您自己不创建无参数构造函数,编译器会创建无参数构造函数,因此根据 MSDN 页面,您的示例实际上最终看起来像这样;

    class A
    {
        public A(): base() {}
    }
    
    class B : A
    {
        public B(): base() {}
    }
    

    您对new B() 的调用最终将调用A 的构造函数。但是,如果您为 A 创建了一个私有的显式构造函数;

    class A
    {
       private A() {}
    }
    
    class B : A
    {
    
    }
    

    然后这转化为;

    class A
    {
       private A() {}
    }
    
    class B : A
    {
        public B(): base() {}
    }
    

    编译失败,A 的构造函数不可访问。

    【讨论】:

      【解决方案4】:

      如果一个类没有定义构造函数,编译器会自动生成一个public默认构造函数。

      但是,如果定义了构造函数限制访问,那么编译器会抛出异常。

      例如,这应该抛出异常:

      class A
      {
         private A() {}
      }
      class B : A
      {
      }
      

      【讨论】:

        【解决方案5】:

        来自Using Constructors

        Unless the class is static, classes without constructors are 
        given a public default constructor by the C# compiler in order to 
        enable class instantiation.
        

        【讨论】:

          猜你喜欢
          • 2014-03-27
          • 2012-11-12
          • 2017-01-12
          • 2011-02-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-21
          相关资源
          最近更新 更多