464

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

10个答案10

重置为默认值
575

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

例如:

命名空间MyCompany{类外部{无效Foo(){}类内部{}}}

等于

命名空间MyCompany{内部类外部{私有void Foo(){}私有类内部{}}}

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

公共字符串名称{获取{…}私有集{…}//这不是默认值,必须显式执行}

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

取决于上下文仅进行成员声明某些类型的声明允许访问。此外,当成员声明不包括任何访问修饰符,声明的上下文发生决定默认值声明的可访问性。

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

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

1
  • 注意:在C#8中,接口中允许使用访问修饰符,默认为public。 评论 2020年9月14日10:42
189
顶级类:内部方法:私有成员(除非是接口或枚举):私有(包括嵌套类)成员(接口或枚举的):public构造函数:private(注意,如果没有显式定义构造函数,则会自动定义公共默认构造函数)委托:内部接口:内部显式实现的接口成员:public!
  • 18
    这并没有明确说明,如果类也是成员(由于是嵌套类型),那么它默认为private。此外,接口和枚举的成员始终是公共的。
    – 斯基特
    评论 2010年3月26日8:16
  • 1
    @不不,这不是私人的。它是公开的。它只是在实现类型中没有槽,因此如果类Foo:IFoo{IFoo.M(){}}。。。Foo a=新的Foo();,您无法访问M(M)具有a.M(),但您可以使用访问它(a作为IFoo)。M()(有关详细信息,请查看规范) 评论 2016年10月20日9:54
  • 因为我们没有为接口方法指定任何访问修饰符,所以它们总是公共的。 评论 2020年9月7日12:00
159

简短回答:尽可能少的访问(cf Jon Skeet的答案)。

详细答案:

未测试类型、枚举和委托可访问性(只能进行内部或公共访问)

|默认|允许的声明可访问性------------------------------------------------------------------namespace|public|none(始终隐式公开)enum|public|public,内部接口|内部|公共,内部类|内部|公共,内部struct|internal|public,内部委托|内部|公共,内部

嵌套类型和成员可访问性

|默认|允许的声明可访问性------------------------------------------------------------------namespace|public|none(始终隐式公开)enum|public|全部¹接口|public|All¹class|private|All¹类struct|private|public、internal、private²委托|私人|全部构造函数|私有|所有¹enum成员| public | none(总是隐式public)接口成员|公共|无(始终隐式公开)方法|private|All¹字段|私有|全部¹用户定义运算符|none|public(必须声明为public)

¹所有===公共、受保护、内部、私有、受保护内部

²结构不能继承自结构或类(尽管它们可以继承接口),因此protected不是有效的修饰符

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

注: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
(老兄,我喜欢微软的URL……)

  • 1
    这个答案部分不正确。非嵌套枚举也可以是内部的。嵌套枚举和接口可以是从公共到私有的任何内容。
    – 索尔
    评论 2020年9月18日11:54
  • 如果你对自己的理解有信心,可以随意编辑。我不再知道C#。。。 评论 2020年9月18日11:55
  • 1
    使用C#8,我们现在还可以拥有私有和受保护的接口成员。看一看jeremybytes.blogspot.com/2019/11/…
    – 二郎355
    评论 2022年3月30日21:47
12

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

类和结构可访问性

直接在命名空间中声明的类和结构(换句话说,不嵌套在其他类或结构中)可以是公共的,也可以是内部的。如果未指定访问修饰符,则默认为“内部”。

结构成员(包括嵌套类和结构)可以声明为public、internal或private。类成员(包括嵌套类和结构)可以是public、protected internal、protecting、internal或private。默认情况下,类成员和结构成员(包括嵌套类和结构)的访问级别是私有的。无法从包含类型外部访问私有嵌套类型。

派生类的可访问性不能大于其基类型。换句话说,您不能拥有从内部类a派生的公共类B。如果允许这样做,则会使a成为公共类,因为a的所有受保护或内部成员都可以从派生类访问。

您可以使用内部可见到属性。有关详细信息,请参阅朋友集合。

类和结构成员可访问性

类成员(包括嵌套类和结构)可以用六种访问类型中的任何一种进行声明。结构成员不能声明为受保护,因为结构不支持继承。

通常,成员的可访问性不大于包含该成员的类型的可访问度。但是,如果成员实现接口方法或重写公共基类中定义的虚拟方法,则可以从程序集外部访问内部类的公共成员。

作为字段、属性或事件的任何成员的类型必须至少与成员本身一样可访问。类似地,作为方法、索引器或委托的任何成员的返回类型和参数类型必须至少与成员本身一样可访问。例如,除非C也是公共的,否则不能有返回类C的公共方法M。同样,如果a声明为private,则不能具有类型a的受保护属性。

用户定义的运算符必须始终声明为public和static。有关更多信息,请参阅操作员过载。

终结器不能具有可访问性修饰符。

其他类型

直接在名称空间中声明的接口可以声明为公共或内部,就像类和结构一样,接口默认为内部访问。接口成员始终是公共的,因为接口的目的是使其他类型能够访问类或结构。没有访问修饰符可以应用于接口成员。

枚举成员始终是公共的,不能应用任何访问修饰符。

委托的行为类似于类和结构。默认情况下,在命名空间中直接声明时,它们具有内部访问权限,在嵌套时具有专用访问权限。

11

类是内部默认情况下。

  • 班级成员是私有的默认情况下。

接口是内部默认情况下。

  • 接口成员包括公众的默认情况下。(接口不允许我们将指定其成员的任何类型的可访问性。)

    注:如果您尝试为接口的成员指定任何访问说明符,则会显示编译错误。

结构是内部默认情况下。

  • 结构构件为私有的默认情况下。
7

我想添加一些文档链接。查看更多详细信息在这里.

在此处输入图像描述

5
  • 默认情况下,类是内部的,而不是私有的。 评论 2016年12月22日2:53
  • 1
    我在哪里写的课是私密的? 评论 2017年4月5日16:05
  • 1
    此表仅对嵌套类型有效。
    – 蓝银
    评论 2017年6月21日11:04
  • 默认情况下,类是内部的,命名空间中的类不能是私有的。但是类(嵌套类)中的类可以是私有的
    – 阿伦
    评论 2017年10月12日5:27
  • 接口的访问修饰符为内部默认情况下。
    – 卡马拉
    评论 2018年10月15日7:07
6

最简单的答案如下。。。。。

默认情况下,C#中的所有成员总是使用尽可能少的可访问修饰符。

这就是为什么程序集中的所有顶级类默认情况下都是“内部”的,这意味着它们对所在的程序集是公共的,但对外部程序集是私有的或被排除在访问之外。顶级类的唯一其他选项是更容易访问的public。对于嵌套类型,除了少数罕见的异常,如枚举成员和只能是公共的接口,它都是私有的。一些例子。

C中有两类访问修饰符#

顶级。。。

类MyClass{...}

…和成员级别(在另一个类中,等等)

类MyClass{类MySubClass{...}}

每个都有自己不同的默认值。一般来说,所有顶层都可以内部的(默认设置,与无访问修饰符相同,并阻止外部程序集访问)或公众的(对装配和外部装配通道开放)。

顶级访问修饰符

对于顶级类、结构、接口等,默认值都是内部的默认情况下如使用“animal”类作为示例所示。这意味着他们对外部组件默认访问:

类动物{}与相同内部的类动物{}

界面动物{}与相同内部的界面动物{}

构件级访问修改器

对于嵌套类和接口(内部类型),默认值通常为私有的除了以下接口和枚举公众的。这通常意味着类中的成员被排除在两个内部组件它在和中外部组件:

类动物{}与相同私有的类动物{}

界面动物{}与相同公众的界面动物{}

了解顶级类型也控制着它们内部的成员。因此,如果您更改顶级访问修饰符内部的公众的,类内的任何公共成员或受保护的派生成员都可能突然被外部程序集访问!

请记住,当从控制可访问性的基类派生时,这些规则可能会被破坏。但是如果你只是假设C#类型的默认值总是私有的,则不需要使用自定义访问修饰符,直到需要更改默认值。它们是安全的!

1

命名空间级别:内部的

类型级别:私有的

1
  • 回答正确,但未提及权威人士来源必须盲目信任。
    – 分钟
    评论 2020年8月6日10:05
0

内部的是类的默认访问修饰符。

私有的是类成员的默认访问修饰符。

-1

内部是默认修饰符

1
  • 不适用于班级成员 评论 2021年11月20日2:56

不是你想要的答案吗?浏览已标记的其他问题问你自己的问题.