一尘不染

C#中的默认访问修饰符是什么?

c#

类,方法,成员,构造函数,委托和接口的默认访问修饰符是什么?


阅读 549

收藏
2020-05-19

共1个答案

一尘不染

C#中所有内容的默认访问权限是 “您可以为该成员声明的最严格的访问权限”

因此,例如:

namespace MyCompany
{
    class Outer
    {
        void Foo() {}
        class Inner {}
    }
}

相当于

namespace MyCompany
{
    internal class Outer
    {
        private void Foo() {}
        private class Inner {}
    }
}

这种情况的一种例外是,使属性(通常是setter)的一部分比声明的属性本身可访问性受到更多限制:

public string Name
{
    get { ... }
    private set { ... } // This isn't the default, have to do it explicitly
}

这是C#3.0规范要说的(第3.5.1节):

根据成员声明发生的上下文,仅允许某些类型的声明的可访问性。此外,当成员声明中不包含任何访问修饰符时,声明发生的上下文将确定默认的声明可访问性。

  • 命名空间隐式具有公共声明的可访问性。名称空间声明中不允许使用访问修饰符。
  • 在编译单元或命名空间中声明的类型可以具有公共或内部声明的可访问性,并且默认为内部声明的可访问性。
    * 类成员可以具有五种声明的可访问性中的任何一种,并且默认为私有声明的可访问性。(请注意,声明为类的成员的类型可以具有五种声明的可访问性中的任何一种,而声明为命名空间的成员的类型只能具有公共或内部声明的可访问性。)
    * Struct成员可以具有public,internal或private声明的可访问性,并且默认为private声明的可访问性,因为结构是隐式密封的。在结构中引入的Struct成员(即不被该结构继承)不能具有受保护的或受保护的内部声明的可访问性。(请注意,声明为结构成员的类型可以具有公共,内部或私有声明的可访问性,而声明为命名空间成员的类型只能具有公共或内部声明的可访问性。)
  • 接口成员隐式具有公共声明的可访问性。接口成员声明上不允许使用访问修饰符。
  • 枚举成员隐式具有公开声明的可访问性。枚举成员声明中不允许使用访问修饰符。

(请注意,嵌套类型将位于“类成员”或“结构成员”部分下,因此默认为私有可见性。)

2020-05-19