C#成员可访问性(可访问性不一致)

本文详细解析了C#中的不同访问修饰符及其应用规则,包括public、protected、internal等,并探讨了它们如何影响类成员的可访问性。

一、已声明可访问性
C#成员已声明可访问性可以是下列的:
1.public:访问不受限制;
2.protected:访问仅限于包含该成员类或从包含该成员类所派生类型;
3.ernal:访问仅限于此;
4.protectedernal:访问仅限于此或包含该成员类所派生类型;
5.private:访问仅限于包含该成员类型。

 

二、默认已声明可访问性
1.命名空间隐式地具有public已声明可访问性在命名空间声明中不允许使用访问修饰符;
2.编辑单元或命名空间中声明类型可以具有public或ernal已声明可访问性其默认已声明可访问性为ernal;
3.类成员可以具有5种已声明可访问性任意种其默认已声明可访问性为private(注意:生命为类成员类型可以具有五种已声明可访问性中任意种但是声明为命名空间成员类型只能具有public或ernal已声明可访问性);
4.结构成员可以具有publicernal或private等已声明可访问性其默认已声明可访问性为private这是结构是隐式密封;
5.接口成员隐式地具有public已声明可访问性在接口成员声明中不允许使用访问修饰符;
6.枚举成员隐式地具有public已声明可访问性在枚举成员声明中不允许使用访问修饰符。

 

三、可访问性约束
1.类类型直接基类必须至少和该类类型本身具有相同可访问性;
2.借口类型显示基接口必须至少和该接口类型本身具有相同可访问性;
3.委托类型返回类型和参数类型必须至少和该委托类型本身具有相同可访问性;
4.常量类型必须至少和该常量本身具有相同可访问性;
5.域类型必须至少和该域本身具有相同可访问性;
6.思路方法返回类型和参数类型必须至少和该思路方法本身具有相同可访问性;
7.属性类型必须至少和该属性本身具有相同可访问性;
8.事件类型必须至少和该事件本身具有相同可访问性;
9.索引器类型和参数类型必须和该索引器本身具有相同可访问性;
10.运算符返回类型和参数类型必须至少和该运算符本身具有相同可访问性;
11.市里构造参数类型必须至少和该例子构造本身具有相同可访问性 [Page]
例:B类将引起个编译时A并不至少和B具有相同可访问性
A{…}
publicB:A{…}
例:B中思路方法H将引起个编译时返回类型A并不至少和该思路方法具有相同可访问性
A{…}

publicB
{
  AF{…}
  ernalAG{…}
  publicAH{…}
}

 

四、可访问域
1.预定义类型(例如object、或double)可访问域是无限;
2.在P中声明顶级类型(不是在某个类型中声明成员)T可访问域是指:
  ·如果T已声明可访问性为public则T可访问域将是P以及引用P任何文本;
  ·如果T已声明可访问性为ernal则T可访问域将是P文本
  可见定及类型可访问域始终至少是在其中声明该类型文本
3.在P类型T中声明嵌套成员(在其他类型中声明成员)M其可访问域是如下所指的(M本身也可能是个类型):
  ·如果M已声明可访问性为public则M可访问域将是T可访问域;
  ·如果M已声明可访问性为protectedernal设D表示P文本和所有从T派生类型(这些类型是在P外部声明)文本并集,则M可访问域将是T和D可访问域交集;
  ·如果M已声明可访问性为protected设D表示T文本和所有从T派生类型文本并集则M可访问域将是T和D可访问域交集;
  ·如果M已声明可访问性为ernal则M可访问域将是T可访问域和P文本交集;
  ·如果M已声明可访问性为private则M可访问域将是T文本
  可见嵌套成员可访问域总是至少为声明该成员类型文本并且绝不会大于声明该成员类型可访问域

public A
{
  publicX;
  ernalY;
  privateZ;
}
ernal B
{
  publicX;
  ernalY; [Page]
  privateZ;

  public C

  {
    publicX;
    ernalY;
    privateZ;
  }
  private D
  {
    publicX;
    ernalY;
    privateZ;
  }
}
在这个例子中类和成员具有以下可访问域:
  ·A和A.X可访问域无限制;
  ·A.Y、B、B.X、B.Y、B.C、B.C.X和B.C.Y可访问域是包含这段代码文本;
  ·A.Z可访问域是A文本;
  ·B.Z和B.D可访问域是B文本包括B.C和B.D文本;
  ·B.C.Z可访问域是B.C文本;
  ·B.D.X和B.D.Y可访问域是B文本包括B.C和B.D文本;
  ·B.D.Z可访问域是B.D文本
例:基类所有成员(例子构造、析构和静态构造除外)都由派生类型继承这些成员甚至包括基类私有成员然而私有成员可访问域只包括声明该成员类型文本在下面举例中类B继承了类A私有成员x:
A
{
  x;//类成员默认可访问性为private
  voidF(Bb){ [Page]
    b.x=1;//允许
  }
}
B:A
{
  voidF(Bb){
  b.x=1;//不能访问x
  }
}
由于该成员是私有所以只能在A类主体中对他进行访问因此A.F思路方法中对b.x访问可以成功但是B.F思路方法中对b.x访问却会造成。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值