c#中的可访问性(小结)

一、C#中已声明的可访问性
1. public:访问不受限制;
2. internal:访问仅限于所属程序集;
3. protected:访问仅限于当前类和其子类;
4. internal protected:访问仅限于当前程序集或其子类(子类可以不属于当前程序集);
5. private:访问仅限于包含该成员的类型。

二、默认可访问性
1. 命名空间(namespace)隐式地具有public访问性,且不允许有访问修饰符;
2. 编辑单元或命名空间中声明的类型可以具有public或internal可访问性,默认为internal;
3. 类(class)的默认访问级别为internal;
4. 结构体(struct)默认访问级别为private;
5. 接口(interface)默认访问基本为internal;但是如果在其他public类中使用时,必须为public;
6. 类和结构体成员(成员函数和成员变量)默认访问级别为private;(但是声明为命名空间成员的类型只能具有public或internal可访问性);
7. 接口的成员隐式地具有public可访问性,在接口成员的声明中不允许使用访问修饰符;
6. 枚举的成员隐式地具有public可访问性,声明中不允许使用访问修饰符。

三、可访问性约束
1. 类类型的直接基类必须至少与该类类型本身具有相同的可访问性;
2. 接口类型的基接口必须至少与该接口类型本身具有相同的可访问性;
3. 委托类型的返回类型和参数类型必须至少与该委托类型本身具有相同的可访问性;
4. 常量的类型必须至少与该常量本身具有相同的可访问性;
5. 域的类型必须至少与该域本身具有相同的可访问性;
6. 方法的返回类型和参数类型必须至少与该方法本身具有相同的可访问性;
7. 属性的类型必须至少与该属性本身具有相同的可访问性;
8. 事件的类型必须至少与该事件本身具有相同的可访问性;
9. 索引器的类型和参数类型必须与该索引器本身具有相同的可访问性;
10. 运算符的返回类型和参数类型必须至少与该运算符本身具有相同的可访问性;
11. 实例构造函数的参数类型必须至少与该实例构造函数本身具有相同的可访问性。

四、可访问域
1. 预定义类型(例如object、int或double)可访问域是无限的;
2. 在程序P中声明的顶级类型(不是在某个类型中声明的成员)T的可访问域是指:
1).如果T的已声明可访问性为public,则T的可访问域将是P以及引用P的任何程序的程序文本;
2).如果T的已声明可访问性为internal,则T的可访问域将是P的程序文本。
可见,定及类型的可访问域始终至少是在其中声明该类型的程序的程序文本。
3. 在程序P的类型T中声明的嵌套成员(在其他类型中声明的成员)M,其可访问域是如下所指之一(M本身也可能是一个类型):
1).如果M的已声明可访问性为public,则M的可访问域将是T的可访问域;
2).如果M的已声明可访问性为internal protected,设D表示P的程序文本和所有从T派生的类型(这些类型是在P的外部声明的)的程序文本的并集,则M的可访问域将是T与D的可访问域的交集;
3).如果M的已声明可访问性为protected,设D表示T的程序文本和所有从T派生的类型的程序文本的并集,则M的可访问域将是T与D的可访问域的交集;
4).如果M的已声明可访问性为internal,则M的可访问域将是T的可访问域与P的程序文本的交集;
5).如果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;
}
}
在这个例子中,类和成员具有以下可访问域:

1) A和A.X的可访问域无限制;
2) A.Y、B、B.X、B.Y、B.C、B.C.X和B.C.Y的可访问域是包含这段代码的程序的程序文本;
3) A.Z的可访问域是A的程序文本;
4) B.Z和B.D的可访问域是B的程序文本,包括B.C和B.D的程序文本;
5) B.C.Z的可访问域是B.C的程序文本;
6) B.D.X和B.D.Y的可访问域是B的程序文本,包括B.C和B.D的程序文本;
7) 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的访问却会造成错误。

时间: 2024-08-11 01:35:27

c#中的可访问性(小结)的相关文章

Effective Java 第三版——15. 使类和成员的可访问性最小化

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 类和接口是Java编程语言的核心.它们是抽象的基本单位.该语言提供了许多强大的元素,可以使用它们来设计类和接口.本章包含指导原则,帮助你充分利用这些元素,使你的类和接口是可

【Android平台中的安全编程】の #01-限制app的敏感ContentProvider的可访问性

本文翻译自https://www.securecoding.cert.org/confluence/display/java/DRD01-J.+Limit+the+accessibility+of+an+app%27s+sensitive+content+provider,有增删改. ContentProvider类提供了与其他app管理和共享数据的机制.当与其他app共享provider的数据时,必须小心的实现访问控制,防止对敏感数据的非法访问. 限制ContentProvider的访问有三种

说说HTML5中label标签的可访问性问题——张鑫旭

一.开篇叨叨 一般稍微有些经验的页面制作人员都知道label标签可以优雅地扩大表单控件元素的点击区域,例如,单纯的单选框点击区域就鼻屎那么大的地方,经常会点不到位置.因此,label标签的使用对于提高页面的可用性可访问性是很有帮助的. 我们看看点评网的注册页面那个同意条款的复选框,非要点在复选框上才能选中: 查看HTML发现复选框id和label标签的for属性值都是空,不解~~ 像其他网站的登录或是注册处的控件的点击区域就做得蛮不错的,像是豆瓣网, 新浪微博等:  我们一般有两种方法来优雅地扩

十步优化SQL Server中的数据访问(转载)

原文地址:http://tech.it168.com/a2009/1125/814/000000814758.shtml 故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户,你开始着手调查访问变慢的原因. 经过紧张的调查,你发现问题出在数据库上,当应用程序尝试访问/更新数据时,数据库执行得相当慢,再次深入调查数据库后,你发现数据库表增长得很大,有些表

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

区别设计良好的模块和设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节.设计良好的模块会隐藏所有的实现细节,把它的API于它的实现清晰地隔离开来.然后,模块之间通过它们的API进行通信,一个模块不需要知道其他模块的内部工作情况,这个概念称为信息隐藏或封装.使类和成员的可访问性最小化可以有效的解除系统中各个模块的耦合度.实现每个模块的独立开发.使得系统更加的可维护,更加的健壮.对于顶层的(非嵌套的)类和接口,只有两种可能的访问级别,包级私有的和公有的

go:结构体的可访问性

1.要使某个符号对其他包( package)可见(即可以访问),需要将该符号定义为以大写字母开头------摘自go相关书籍2.go只限制包内外的可访问性,而不限制同包内不同文件的可访问性 本文讨论结构体三个部分的可访问性:结构体本身.结构体变量.结构体变量的成员变量 在讨论某一部分时,保证其它部分包外可访问. 1. 结构体本身   的可访问性 test1.go: package tt type Test struct { X int } main.go: package main import

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

要区别设计良好的模块与设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节.设计良好的模块会隐藏所有的实现细节,把它的API与它的实现清晰地隔离开来. 信息隐藏之所以非常重要有许多原因,其中大多数理由都源于这样一个事实:它可以有效的解除组成系统的各个模块之间的耦合关系,使得这些模块可以独立地开发.测试.优化.使用.理解和修改. 第一个规则很简单:尽可能地使每个类或者成员不被外界访问. 对于顶层的(非嵌套)的类和接口,只有两种可能的访问级别:包级私有的

web标准的可用性和可访问性

在Web前端开发界,有三个词经常被提及:可用性(Usability).可访问性(Accessibility)和可维护性(Maintainability). 可用性指的是:产品是否容易上手,用户能否完成任务,效率如何,以及这过程中用户的主观感受可好,是从用户的角度来看产品的质量.可用性好意味着产品质量高,是企业的核心竞争力. 可维护性一般包含两个层次,一是当系统出现问题时,快速定位并解决问题的成本,成本低则可维护性好.二是代码是否容易被人理解,是否容易修改和增强功能.可维护性和可复用性.可扩展性等

派生类到基类转换的可访问性

      从派生类到基类的转换的可访问性取决于派生类的派生列表中指定的访问标号. 要确定到基类的转换是否可访问,可以考虑基类的public成员是否可以访问, 如果可以,转换是可访问的,否则,转换是不可访问的. 如果是public继承,则用户代码和后代类都可以使用派生类到基类的转换: 如果是private或protected继承,则用户代码不能将派生对象类转换到基类对象: 注:如果是protected继承,则后续派生类的成员可以转换为基类类型.