类,方法,成员,构造函数,委托和接口的默认访问修饰符是什么?
答案 0 :(得分:422)
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节):
取决于其中的上下文 成员声明仅发生 某些类型的申报 允许访问。 此外,当一个成员声明 不包含任何访问修饰符, 声明的背景 发生确定默认值 声明可访问性。
- 命名空间隐式具有公共声明的可访问性。无法访问 命名空间上允许使用修饰符 声明。
- 在编译单元或命名空间中声明的类型可以具有public或 内部声明的可访问性和 默认为内部声明 可访问性。
- 类成员可以具有五种声明的可访问性中的任何一种 并默认为私有声明 可访问性。 (注意一种类型 声明为类的成员即可 有五种声明中的任何一种 可访问性,而声明的类型 作为命名空间的成员可以拥有 仅公开或内部声明 可访问性。)
- Struct成员可以声明public,internal或private 可访问性和默认为私有 声明可访问性因为结构 是隐含的密封。结构成员 在结构中引入(即不是 由该结构继承)不能有 保护或保护内部 声明可访问性。 (注意一个 声明为结构成员的类型 可以有公共,内部或私人 声明可访问性,而类型 声明为命名空间的成员 可以只有公共或内部 声明可访问性。)
- 接口成员隐式具有公共声明的可访问性。没有 允许访问修饰符 接口成员声明。
- 枚举成员隐式具有公开声明的可访问性。没有 允许访问修饰符 枚举成员声明。
(请注意,嵌套类型将属于“类成员”或“结构成员”部分 - 因此默认为私有可见性。)
答案 1 :(得分:135)
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!
答案 2 :(得分:114)
简答:最低限度的访问权限(参见Jon Skeet的回答)。
答案很长:
非嵌套类型,枚举和委托可访问性(可能只有内部或公共可访问性)
| 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
嵌套类型和成员可访问性
| 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)
¹所有=== public,protected,internal,private,protected internal
2结构不能从结构或类继承(尽管它们可以,接口),因此受保护不是有效的修饰符
嵌套类型的可访问性取决于其可访问性域,该域由成员的已声明可访问性和直接包含类型的可访问性域确定。但是,嵌套类型的可访问性域不能超过包含类型的可访问性域。
注意:CIL还提供 protected和internal (与现有受保护的“或”内部“相对),但据我所知,目前无法在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的人......)
答案 3 :(得分:11)
查看Access Modifiers (C# Programming Guide)
类和结构可访问性
如果没有访问权限,则内部是默认值 修饰符已指定。班级和结构会员辅助功能
班级成员 (包括嵌套类和结构) 可以用五个中的任何一个来宣布 访问类型。结构成员不能 被宣布为受保护因为 结构不支持继承。会员的可访问性可以 永远不会超过 其包含类型的可访问性
用户定义的运算符必须始终如一 宣布为公开。更多 信息,见运营商(C# 参考)。
析构函数不具备可访问性 改性剂。
其他类型
直接使用命名空间声明的接口可以是 宣称为公共或内部和 喜欢类和结构,接口 默认为内部访问。枚举成员永远是公开的, 并且没有访问修饰符可以 应用
默认情况下,委托具有内部 访问。
答案 4 :(得分:3)
我想添加一些文档链接。详细了解here。
答案 5 :(得分:2)
最简单的答案如下:....
默认情况下,C#中的所有成员始终使用最小可访问修饰符。
这就是为什么程序集中的所有顶级类默认情况下都是“内部”的原因,这意味着它们对所在的程序集是公共的,但对于外部程序集则是私有的或被排除在外。顶级课程的唯一其他选择是公开,这更易于访问。对于嵌套类型,除少数罕见例外(如枚举的成员和只能公开的接口)外,它都是私有的。一些例子。对于顶级类和接口,默认值为:
动物类与内部动物类
相同界面动物与公共界面动物
相同对于嵌套的类和接口(内部类型),默认值为:
动物类与动物类
相同界面动物与私有界面动物
相同如果仅假定默认值始终是最私有的,则无需使用访问器,直到需要更改默认值。容易。
答案 6 :(得分:1)
内部是默认修饰符
答案 7 :(得分:1)
默认情况下,类为内部。
默认情况下,接口为内部。
接口成员是公开。 (接口不允许 我们指定对其成员的任何类型的可访问性。)
注意: :如果您尝试为接口成员指定任何访问说明符,则会显示编译错误。
结构默认为内部。
答案 8 :(得分:0)
命名空间级别:internal
类型级别:private