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

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

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

举个例子:

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

相当于

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

对此的一种例外是使财产(通常是二传手)的一部分比声明的财产本身的可访问性更受限制:

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

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

根据成员声明发生的环境,只允许某些types的声明可访问性。 此外,当成员声明不包含任何访问修饰符时,声明发生的上下文决定默认的声明可访问性。

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

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

 top level class: internal method: private members (unless an interface or enum): private (including nested classes) members (of interface or enum): public constructor: private (note that if no constructor is explicitly defined, a public default constructor will be automatically defined) delegate: internal interface: internal explicitly implemented interface member: public! 

简短的回答:尽可能less的访问(参见Jon Skeet的回答)。

很长的回答:

非嵌套types,枚举和委托可访问性可能只有内部或公共可访问性

  | Default | Permitted declared accessibilities ------------------------------------------------------------------ namespace | public | none (always implicitly public) enum | public | none (always implicitly public) interface | internal | public, internal class | internal | public, internal struct | internal | public, internal delegate | internal | public, internal 

嵌套types和成员可访问性

  | Default | Permitted declared accessibilities ------------------------------------------------------------------ namespace | public | none (always implicitly public) enum | public | none (always implicitly public) interface | public | none class | private | All¹ struct | private | public, internal, private² delegate | private | All¹ constructor | private | All¹ interface member | public | none (always implicitly public) method | private | All¹ field | private | All¹ user-defined operator| none | public (must be declared public) 

¹所有===公共,受保护,内部,私人,受保护的内部

²结构体不能从结构体或类inheritance(尽pipe它们可以,接口),因此受保护的不是有效的修饰符

嵌套types的可访问性取决于其可访问性域,该域由成员声明的可访问性和直接包含types的可访问性域确定。 但是,嵌套types的可访问性域不能超过包含types的域。

注:CIL也提供了保护和内部 (而不是现有的保护“或”内部),但据我所知,这是目前不可用于C#。


看到:

http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
http://msdn.microsoft.com/en-us/library/ms173121.aspx
http://msdn.microsoft.com/en-us/library/cx03xt0t.aspx
(我爱微软的URI …)

看看访问修饰符(C#编程指南)

类和结构可访问性
如果未指定访问修饰符,则内部是默认值。

类和结构成员可访问性
类成员(包括嵌套类和结构体)可以用五种访问types中的任何一种来声明。 结构成员不能被声明为受保护的,因为结构不支持inheritance。

成员的可访问性永远不会超过其包含types的可访问性

用户定义的操作符必须始终声明为公共。 有关更多信息,请参阅运算符(C#参考)。

析构函数不能有可访问性修饰符。

其他types
直接使用名称空间声明的接口可以声明为public或internal,并且类和结构类似,接口默认为内部访问。

枚举成员总是公开的,不能使用访问修饰符。

默认情况下,代表具有内部访问权限。

内部是默认的修饰符

我想添加一些文档链接。 在这里查看更多细节。

在这里输入图像描述

名字空间级别: internal

types级别: private