文档资料

访问修饰符

  1. public:完全可访问。enuminterface 的成员默认都是整个级别。
  2. internal:当前 assembly 或朋友 assembly 可访问,非嵌套类的默认访问级别。
  3. private:本类可访问。classstruct 的成员的默认访问级别。
  4. protected:本类或其子类可以访问。
  5. protected internal:联合了 protectedinternal 的访问级别。
class Class1 {}	// Class1 is internal (default)
public class Class2 {}
class ClassA { int x; }	// x is private (default)
class ClassB { internal int x; }

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
}

朋友 Assembly

  • 通过添加 System.Runtime.CompilerServices.InternalsVisibleTo 这个 Assembly 的属性,并指定朋友 Assembly 的名字,就可以把 internal 的成员暴露给朋友 Assembly。
[assembly: InternalsVisibleTo("FriendAssemblyName")]
  • 如果朋友 Assembly 有 Strong name,那么就必须指定其完整的 160 字节的 public key。
[assembly: InternalsVisibleTo("StrongFriendName, PublicKey = 0024f000048c...")]
  • 朋友 Assembly 的使用场景是单元测试时。

访问级别限制

  • 外层限制内层的最大访问范围。
class C	// C is internal
{
	public void Foo() {}	// Foo() is internal not public because C is internal
}
  • 当重写父类的函数时,重写后的函数和被重写的函数的访问级别必须一致。
class BaseClass { protected virtual void Foo() {} }
class SubClass1 : BaseClass { protected override void Foo() {} }	// Ok
class SubClass2 : BaseClass { public override void Foo() {} }	// Error
  • 有一个例外:当在其他 Assembly 重写 protected internal 的方法时,重写后的方法必须是 protected