关闭

C#成员可访问性

601人阅读 评论(0) 收藏 举报
一、已声明可访问性
C#成员的已声明可访问性可以是下列之一:
1.       public:访问不受限制;
2.       protected:访问仅限于包含该成员的类或从包含该成员的类所派生的类型;
3.       internal:访问仅限于此程序;
4.       protected internal:访问仅限于此程序或包含该成员的类所派生的类型;
5.       private:访问仅限于包含该成员的类型。
二、默认已声明可访问性
1.       命名空间隐式地具有public已声明可访问性。在命名空间的声明中不允许使用访问修饰符;
2.       编辑单元或命名空间中声明的类型可以具有public或internal已声明可访问性,其默认的已声明可访问性为internal;
3.       类的成员可以具有5种已声明可访问性的任意一种,其默认的已声明可访问性为private。(注意:生命为类成员的类型可以具有5中已声明可访问性中的任意一种,但是声明为命名空间成员的类型只能具有public或internal已声明可访问性);
4.       结构的成员可以具有public,internal或private等已声明可访问性,其默认的已声明可访问性为private,这是因为结构是隐式的密封的。
5.       接口的成员隐式地具有public已声明可访问性。在接口成员的声明中不允许使用访问修饰符;
6.       枚举的成员隐式地具有public已声明可访问性。在枚举成员的声明中不允许使用访问修饰符。
三、可访问性约束
1.       类类型的直接基类必须至少与该类类型本身具有相同的可访问性;
2.       借口类型的显示基接口必须至少与该接口类型本身具有相同的可访问性;
3.       委托类型的返回类型和参数类型必须至少与该委托类型本身具有相同的可访问性;
4.       常量的类型必须至少与该常量本身具有相同的可访问性;
5.       域的类型必须至少与该域本身具有相同的可访问性;
6.       方法的返回类型和参数类型必须至少与该方法本身具有相同的可访问性;
7.       属性的类型必须至少与该属性本身具有相同的可访问性;
8.       事件的类型必须至少与该事件本身具有相同的可访问性;
9.       索引器的类型和参数类型必须与该索引器本身具有相同的可访问性;
10.   运算符的返回类型和参数类型必须至少与该运算符本身具有相同的可访问性;
11.   市里构造函数的参数类型必须至少与该实例构造函数本身具有相同的可访问性。
例:B类将引起一个编译时错误,因为A并不至少与B具有相同的可访问性
class A {…}
public class B: A {…}
例:B中的方法H将引起一个编译时错误,因为返回类型A并不至少与该方法具有相同的可访问性。
class A {…}
public class B
{
       A F() {…}
       internal A G() {…}
      public A H() {…}
}
四、可访问域
1.       预定义类型(例如object、int或double)可访问域是无限的;
2.       在程序P中声明的顶级类型(不是在某个类型中声明的成员)T的可访问域是指:
l         如果T的已声明可访问性为public,则T的可访问域将是P以及引用P的任何程序的程序文本;
l         如果T的已声明可访问性为internal,则T的可访问域将是P的程序文本。
可见,定及类型的可访问域始终至少是在其中声明该类型的程序的程序文本。
3.       在程序P的类型T中声明的嵌套成员(在其他类型中声明的成员)M,其可访问域是如下所指之一(M本身也可能是一个类型):
l         如果M的已声明可访问性为public,则M的可访问域将是T的可访问域;
l         如果M的已声明可访问性为protected internal,设D表示P的程序文本和所有从T派生的类型(这些类型是在P的外部声明的)的程序文本的并集,则M的可访问域将是T与D的可访问域的交集;
l         如果M的已声明可访问性为protected,设D表示T的程序文本和所有从T派生的类型的程序文本的并集,则M的可访问域将是T与D的可访问域的交集;
l         如果M的已声明可访问性为internal,则M的可访问域将是T的可访问域与P的程序文本的交集;
l         如果M的已声明可访问性为private,则M的可访问域将是T的程序文本。
可见,嵌套成员的可访问域总是至少为声明该成员的类型的程序文本,并且绝不会大于声明该成员的类型的可访问域。
public class A
{
       public static int X;
       internal static int Y;
       private static int Z;
}
internal class B
{
       public static int X;
       internal static int Y;
       private static int Z;
       public class C
       {
              public static int X;
              internal static int Y;
              private static int Z;
       }
       private class D
       {
              public static int X;
              internal static int Y;
              private static int Z;
       }
}
       在这个例子中,类和成员具有以下可访问域:
l         A和A.X的可访问域无限制;
l         A.Y、B、B.X、B.Y、B.C、B.C.X和B.C.Y的可访问域是包含这段代码的程序的程序文本;
l         A.Z的可访问域是A的程序文本;
l         B.Z和B.D的可访问域是B的程序文本,包括B.C和B.D的程序文本;
l         B.C.Z的可访问域是B.C的程序文本;
l         B.D.X和B.D.Y的可访问域是B的程序文本,包括B.C和B.D的程序文本;
l         B.D.Z的可访问域是B.D的程序文本。
例:基类的所有成员(实例构造函数、析构函数和静态构造函数除外)都由派生类型继承,这些成员甚至包括基类的私有成员。然而,私有成员的可访问域只包括声明该成员的类型的程序文本。在下面的示例中,类B继承了类A的私有成员x:
class A
{
       int x;                                   //类的成员的默认可访问性为private
       static void F(B b){
             b.x = 1;                            //允许
       }
}
class B: A
{
       static void F(B b){
             b.x = 1;                            //错误,不能访问x
       }
}
       由于该成员是私有的,所以只能在A的类主体中对他进行访问。因此,A.F方法中对b.x的访问可以成功,但是B.F方法中对b.x的访问却会造成错误。 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:39999次
    • 积分:498
    • 等级:
    • 排名:千里之外
    • 原创:5篇
    • 转载:31篇
    • 译文:0篇
    • 评论:15条
    文章分类
    最新评论