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

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

286050 次浏览
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!

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

类和结构的可访问性

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

结构成员(包括嵌套类和结构)可以声明为公共、内部或私有。类成员,包括嵌套类和结构,可以是public、protected internal、protected、internal、private protected或private。类成员和结构成员(包括嵌套类和结构)的访问级别默认为私有。不能从包含类型的外部访问私有嵌套类型。

派生类不能具有比其基类型更大的可访问性。换句话说,您不能有一个派生自内部类a的公共类B。如果允许这样做,就会产生将a设为公共的效果,因为a的所有受保护成员或内部成员都可以从派生类中访问。

你可以通过使用InternalsVisibleToAttribute来使特定的其他程序集访问你的内部类型。有关更多信息,请参见友程序集。

类和结构成员的可访问性

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

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

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

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

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

其他类型

在名称空间中直接声明的接口可以声明为公共的或内部的,并且与类和结构一样,接口默认为内部访问。接口成员总是公共的,因为接口的目的是允许其他类型访问类或结构。不能将访问修饰符应用于接口成员。

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

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

命名空间级别:internal

类型级别:private

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节):

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

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

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

Internal是默认的修饰符

简短的回答:最小可能的访问(cf Jon Skeet的回答)。

长一点的回答:

非嵌套类型,枚举和委托访问 (可能只有内部或公共访问)

                     | Default   | Permitted declared accessibilities
------------------------------------------------------------------
namespace            | public    | none (always implicitly public)


enum                 | public    | public, internal


interface            | internal  | public, internal


class                | internal  | public, internal


struct               | internal  | public, internal


delegate             | internal  | public, internal

嵌套类型和成员可访问性

                     | Default   | Permitted declared accessibilities
------------------------------------------------------------------
namespace            | public    | none (always implicitly public)


enum                 | public    | All¹


interface            | public    | All¹


class                | private   | All¹


struct               | private   | public, internal, private²


delegate             | private   | All¹


constructor          | private   | All¹


enum member          | public    | none (always implicitly public)


interface member     | public    | none (always implicitly public)
     

method               | private   | All¹


field                | private   | All¹


user-defined operator| none      | public (must be declared public)

¹所有=== public, protected, internal, private, protected internal

²structs不能从struct或类继承(尽管它们可以从接口继承),因此protected不是一个有效的修饰符

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

注意:CIL也有受保护和内部的规定(相对于现有的受保护的"或"internal),但据我所知,这目前还不能在c#中使用。


看到的:

< p > 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…)

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

enter image description here

最简单的答案是.....

c#中的所有成员默认都使用LEAST accessible修饰符。

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

类动物内部类动物相同

接口的动物公共接口相同

在嵌套类和接口(内部类型)的情况下,默认值为:

类动物私人舱动物相同

接口的动物私有接口相同

如果你只是假设c#类型的默认值总是最多的私人,那么你不需要使用自定义访问器,直到你需要改变默认值。他们在箱子外面很安全!

类默认为内部

  • 类成员默认为私人

Interface默认为内部

  • 接口成员默认为公共。(接口不允许 我们不能为它的成员指定任何类型的可访问性。

    < em >注意:< / em >如果试图为接口的成员指定任何访问说明符,则会显示编译错误。< / p >

Struct默认为内部

  • Struct成员默认为私人