访问权限修饰符
为了提高封装性,类型或类型成员可以在声明中添加访问权限修饰符(Access Modify)来限制其他类型和程序集对它的访问。
可访问性 | 含义 |
---|---|
public | 完全访问权限 |
internal | 仅可以在当前程序集内访问,或供友元程序集访问。非嵌套类型的默认可访问性 |
private | 仅可以在当前类中访问。类和结构体成员默认可访问性 |
protected | 仅可在当前类和其子类中访问 |
protected internal | protected 和 internal 可访问性的并集 |
1 示例
Class2
可以从本程序集外访问,而 Class1
不可以:
class Class1 {} // Class1 is internal (default)
public class Class2 {}
ClassB
的字段 x
可以被本程序集的其他类访问,而 ClassA
的则不可以:
class ClassA { int x; } // x is private (default)
class ClassB { internal int x; }
SubClass
中的函数可以调用 Bar
但不能调用 Foo
:
class BaseClass
{
void Foo() {} // Foo is private (default)
protected void Bar() {}
}
class Subclass : BaseClass
{
void Test1() { Foo(); } // Error - cannot access Foo
void Test2() { Bar(); } // OK
}
2 友元程序集 Friend Assemblies
通过添加 System.Runtime.CompilerServices.InternalsVisibleTo
程序集特性就可以将 internal
成员提供给其他的友元程序集访问。
使用如下方法指定友元程序集:
[assembly: InternalsVisibleTo ("Friend")] // Friend 为友元程序集的名称
如果友元程序集有强名称,必须提供其完整的 160 字节公钥:
[assembly: InternalsVisibleTo ("StrongFriend, PublicKey=0024f000048c...")]
3 可访问性封顶 Accessibility Capping
类型的可访问性是其内部声明成员可访问性的封顶。
class C { public void Foo() {} }
C
的可访问性是 internal
,它作为 Foo
的最高访问权限。
4 访问权限修饰符的限制
-
当重写父类的函数时,重写函数的可访问性必须和父类保持一致。
class BaseClass { protected virtual void Foo() {} } class Subclass1 : BaseClass { protected override void Foo() {} } // OK class Subclass2 : BaseClass { public override void Foo() {} } // Error
-
若在另外一个重写集中重写
protected internal
方法,则重写方法必须为protected
。 -
编译器会阻止任何不一致的访问权限修饰符,例如子类可以比父类的访问权限低,但不能比父类的访问权限高。
internal class A {} public class B : A {} // Error