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# 编程指南——类和结构及其成员的可访问性

访问修饰符是一en些关键字,用于指定声明的成员或类型的可访问性。 public, protected,...
  • dongyue786
  • dongyue786
  • 2014年10月15日 18:53
  • 953

C#类,类成员访问修饰符

今天想不起C#中类的默认访问修饰符是internal了还以为是public呢,单元测试时候一直是黄色敬告。所以把csdn的东西翻出了(在百度上搜不到的)。当用internal修饰类(c#默认不加修饰符...
  • u014511737
  • u014511737
  • 2015年09月10日 15:07
  • 602

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

术语: 封装(encapsulation)或者称为“信息隐藏(infor)”
  • u014723123
  • u014723123
  • 2014年06月28日 14:18
  • 500

C#成员可访问性

根据网上资料整理而成。  一、C#中已声明的可访问性:  1. public:访问不受限制;  2. internal:访问仅限于所属程序集;  3. protected:访问仅限于当前类...
  • monsterXD
  • monsterXD
  • 2013年08月08日 19:41
  • 446

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

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

C#如何取出非公共成员

简述: 一般而言,非公共成员是受保护的,不能被外部访问的,这些都是基于安全性考虑。可是有时,我们很想取到非公共成员的某个对象。那我们就得用到两个方法: GetType().GetField(); ...
  • yueguangzhiyuan
  • yueguangzhiyuan
  • 2013年05月14日 16:26
  • 2417

C# 入门(5) 类和结构,静态,访问器,虚成员和抽象成员,扩展方法,操作符重载,匿名类型

C#的类和结构 参考书籍: 《C#图解教程》   在C++中,类和结构体的区别只有默认成员访问级别不同,类默认访问级别是private,而结构体是public。   在C#中,类和结构就很大不同...
  • l773575310
  • l773575310
  • 2017年05月03日 00:40
  • 180

C#—静态成员和实例成员

在C#中,类中的数据成员分为静态成员和实例成员,那么它们是什么,之间又有什么关系呢?我们来看一下。 静态成员(static member)又叫类成员,指的是在成员类型或返回值类型前用static关键字...
  • fightfaith
  • fightfaith
  • 2015年09月11日 10:09
  • 2227

c#的默认访问权限

[csharp] view plain copy  print? C# 方法默认访问级别 : private   C# 类默认访问级别 : internal   ...
  • qq_26597393
  • qq_26597393
  • 2017年04月17日 17:25
  • 747

c++ 成员可见性

在C++语言中,一个派生类可以从一个基类派生,也可以从多个基类派生。从一个基类派生的继承称为单继承;从多个基类派生的继承称为多继承。 派生类的定义格式 单继承的定义格式如下: cla...
  • kuangsong
  • kuangsong
  • 2014年01月02日 14:35
  • 913
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#成员可访问性
举报原因:
原因补充:

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