访问权限修饰符

访问权限修饰符

为了提高封装性,类型或类型成员可以在声明中添加访问权限修饰符(Access Modify)来限制其他类型和程序集对它的访问。

可访问性含义
public完全访问权限
internal仅可以在当前程序集内访问,或供友元程序集访问。非嵌套类型的默认可访问性
private仅可以在当前类中访问。类和结构体成员默认可访问性
protected仅可在当前类和其子类中访问
protected internalprotectedinternal 可访问性的并集

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
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值