C#成员可访问性

原创 2007年09月18日 12:08:00
一、已声明可访问性
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的访问却会造成错误。 

相关文章推荐

【C#高效编程50例】条目1:使用属性而不是可访问的数据成员

书名:《C#高效编程 改进C#代码的50个行之有效的方法》 条目1 使用属性而不是可访问的数据成员 1 属性格式 private string _scustomerName = ...
  • gjban
  • gjban
  • 2015年09月30日 10:34
  • 385

C#成员访问和抽象类与接口

一.成员访问和属性 在定义类的时候我们要考虑成员的访问权限,在这里详细说明private加深大家对private的理解;如果类的成员是private那么在其他类中调用该类对象来访问它是非法的。下面举...

C#中访问dll私有成员

首先我必须承认访问一个类的私有成员不是什么好做法。大家也都知道私有成员在外部是不能被访问的。而一个类中会存在很多私有成员:如私有字段、私有属性、私有方法。对于私有成员访问,可以套用下面这种非常好的方式...
  • skydxd
  • skydxd
  • 2012年10月24日 08:48
  • 457

C#如何定义结构体及访问结构体的成员

构结构的关键字 struct,struct类型是一种值类型通常用来封装小型变量组,如果冲结构创建一个对象并将对象赋给某个变量 则变量包含结构该变量放入结构的全部值,如果复制包含变量的结构,则将该复制所...

C#中访问私有成员

首先我必须承认访问一个类的私有成员不是什么好做法。大家也都知道私有成员在外部是不能被访问的。而一个类中会存在很多私有成员:如私有字段、私有属性、私有方法。对于私有成员访问,可以套用下面这种非常好的方式...

C# 访问类的私有成员的三种方法与区别

在程序中,难免要访问某个对象的私有成员。那么以前实现这类功能的方法有两种,第一种方法最简单,就是把成员访问符从“private”改为“public”即可;而另一个就是提供公有的成员访问函数来进行访问。...

C#属性详解(c# 通过公共属性访问私有成员 优点)

C#属性是域的扩展(即通常说的成员变量或字段等)它配合C#中的域(字段)使用,使之构造一个安全的应用程序,为什么说通过属性来替代域会提高应用程序的安全呢?     原因就在于C#属性通过访问器(...

c#类成员辨析

  • 2013年01月04日 18:58
  • 37KB
  • 下载

第十三条:使类和成员的可访问性最小化

设计良好的模块会隐藏所有色实现细节
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#成员可访问性
举报原因:
原因补充:

(最多只允许输入30个字)