C#访问修饰符
分类
C#访问修饰符一共有五种,分别为private, internal, protected, protected internal, public。
它们都可以用来修饰类中的成员,如字段,属性,方法,事件等。对于修饰class,enum,struct,嵌套类,及其各自默认修饰符的情况,我们稍后讨论,先来看类内部成员的访问范围。
访问范围
首先贴出MSDN上关于访问修饰符的访问范围限制说明。
上图中的五种访问修饰符修饰的是类的成员,假设类名为TestClass,并且这5种修饰符分别在类TestClass中以下修饰了5种方法:
class TestClass
{
private void Foo_Private()
{
}
internal void Foo_Internal()
{
}
protected void Foo_Protected()
{
}
protected internal void Foo_ProtectedInternal()
{
}
public void Foo_Public()
{
}
}
那么访问修饰符的解释如下:
- public : 访问无限制。
- protected : 访问限制为包含此成员的类TestClass内部,或者TestClass派生类内部。
- internal : 访问限制为当前程序集内。
- protected internal : 访问限制为当前程序集,或者TestClass的派生类。
- private : 访问限制为TestClass内部
五种方法的访问测试结果如下:
可以看出,private的访问范围最小,访问范围只限于类的内部。public的访问范围最大,无限制。internal的访问范围限制为当前程序集,在当前类内部,派生类内部,程序集内其它类内部都可以访问。protected的访问范围是当前类内部和派生类内部,无论是当前程序集还是其它程序集,只要是它的派生类,那么就可以访问。protected internal是protected和internal的并集,它们是或的关系,即符合protected或者internal的访问范围,都是protected internal的访问范围。
class, enum, struct, interface修饰符
在命名空间下,可以用于修饰class, enum, struct, interface的修饰符只有internal和public,指定该结构的访问范围是程序集内,还是无限制。
其余的修饰符private, protected, protected internal不能用来修饰命名空间下的class, enum, struct, interface。为什么这样呢?举个例子,使用private修饰class之后,这个类对于程序集内其它类不可见,那么这个类就没有办法使用,也就毫无意义了。
class, enum, struct, interface默认修饰符
在命名空间下,class, enum, struct, interface的默认修饰符为internal,即:
internal class TestClass
{
}
和
class TestClass
{
}
这两种定义等价。
class, enum, struct, interface内部成员默认修饰符
先贴MSDN上关于默认修饰符的说明:
其中,enum和interface内部成员默认访问修饰符为public,而class和struct内部成员的默认访问修饰符为private。在class中,五种访问修饰符都可以使用,在struct中,由于不存在继承关系,protected和protected internal都不能使用。
嵌套类修饰符
嵌套类可以看做是类的内部成员,因此,其访问修饰符和类的字段,属性,方法一样。来看一段代码示例:
class TestClass1
{
public class TestClass2
{
}
internal class TestClass3
{
}
protected class TestClass4
{
}
protected internal class TestClass5
{
}
private class TestClass6
{
}
class TestClass7
{
}
}
这样定义嵌套类没有任何问题,相当于定义了类的普通成员。嵌套类的默认修饰符为private。