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
}
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!
class Foo : IFoo { IFoo.M() {} } ... Foo a = new Foo();
,你不能使用 a.M()
访问 M
,但是你可以使用 (a as IFoo).M()
访问它。(查看规范以获取更多详细信息) - M.Stramm简短回答:最小可能访问权限(参考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)
嵌套类型的可访问性取决于其可访问性域,该域由成员的声明可访问性和直接包含类型的可访问性域确定。但是嵌套类型的可访问性域不能超过包含类型的可访问性域。
注意:CIL(Common Intermediate Language)还提供了 protected and internal(而不仅仅是现有的 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
(我真爱微软的 URL……)
任何作为字段、属性或事件的成员类型,必须至少与该成员本身具有相同的访问权限。类似地,任何作为方法、索引器或委托的成员的返回类型和参数类型都必须至少与该成员本身具有相同的访问权限。例如,如果C是公共的,则不能有返回类C的公共方法M。同样,如果A被声明为私有的,则不能有类型为A的受保护属性。类和结构体的可访问性
在命名空间内直接声明的类和结构体(也就是没有嵌套在其他类或结构体中的)可以是 public 或 internal。如果没有指定访问修饰符,则默认为 internal。
结构体成员(包括嵌套类和结构体)可以声明为 public、internal 或 private。类成员(包括嵌套类和结构体)可以是 public、protected internal、protected、internal、private protected 或 private。类成员和结构体成员(包括嵌套类和结构体)的访问级别默认为 private。私有嵌套类型无法从包含它们的类型外部访问。
派生类的可访问性不能比其基类型更高。也就是说,您不能有一个从 internal 类 A 派生的 public 类 B。如果允许这样做,A 的所有受保护或内部成员将可从派生类访问,效果就是将 A 设为 public。
您可以使用
InternalsVisibleToAttribute
来启用特定的其他程序集访问您的内部类型。有关更多信息,请参见友元程序集。类和结构体成员的可访问性
类成员(包括嵌套类和结构体)可以用任何一种访问修饰符声明。结构体成员不能声明为 protected,因为结构体不支持继承。
通常,成员的访问性不能比包含它的类型的访问性更高。但是,如果成员实现了在公共基类中定义的接口方法或重写虚方法,则来自内部类的公共成员可能会从程序集外部访问。
类默认情况下是内部的(Internal)。
接口默认情况下是内部的(Internal)。
接口成员默认情况下是公共的(public)。(接口不允许我们指定任何类型的成员可访问性。)
注意: 如果您尝试为接口成员指定任何访问修饰符,则会显示编译错误。
结构体默认情况下是内部的(Internal)。
class MyClass {
...
}
...和会员级别(在另一个类内部等)
class MyClass {
class MySubClass {
...
}
}
class Animal{}和private
class Animal{}是一样的。
interface Animal{}和public
interface Animal{}是一样的。
请理解,顶级类型也控制着它们内部的成员。所以,如果你将一个顶级访问修饰符从internal
改为public
,那么类内的任何公共成员或受保护的派生成员都可以被外部程序集访问!
请记住,当从控制可访问性的基类派生时,这些规则也可能被打破。但是,如果你假设C#类型的默认值始终是最私有的,那么在不需要更改默认值之前,你就不需要使用自定义访问修饰符。它们已经默认提供了安全性!
我想添加一些文档链接。在这里查看更多详细信息。
命名空间级别:internal
类型级别:private
internal
是类的默认访问修饰符。
private
是类成员的默认访问修饰符。
Internal 是默认的修饰符