1、类型中可定义0个或多个以下种类的成员:常量、字段、实例构造器、类型构造器、方法、操作符重载、转换操作符、属性、事件、类型。
2、无论什么编程语言,编译器都必须能处理源代码,为上述每种成员生成元数据和IL代码。所有编程语言生成的元数据格式完全一致。这正是CLR成为“公共语言运行时”的原因。元数据是所有语言都生成和使用的公共信息。(疑问:面向对象语言和面向过程语言在生成元数据的时候没有区别吗?)
3、CLR利用公共元数据格式决定常量、字段、构造器、方法、属性和事件在运行时的行为。
4、源代码中定义的所有成员都造成编译器生成元数据。并且有的成员还造成编译器生成额外的成员和元数据。
1、要定义文件范围的类型(注意不是将类型定义嵌套到另一个类型中)时,可将类型的可见性指定为public或internal。public队所有程序集中的所有代码可见。internal对所在程序集的所有代码可见。类型的可见性隐式默认为internal。
2、CLR和C#通过友元程序集使某个特定的程序集中的代码访问可见性为internal的另一个程序集中的代码。
3、C#在指定友元程序集的时候需要使用System.Runtime.ComplierServices命名空间中的InternalsVisibleTo特性表明它认为是“友元”的其他程序集。
1、定义类型的成员时,可指定成员的可访问性。在访问一个成员时,除了考虑成员本身的可访问性之外,还需要考虑定义成员的类的可见性。
2、成员的可访问性从限制最大到最小依次为:private、protected、internal、protected internal、public。
提示:private标注的成员除了在定义类型中访问之外还可以在任何嵌套类型中的方法访问(所有可访问性都有这个特点)。protected标注的成员可以由任何程序集中的派生类型中的方法访问。
3、在C#中,如果没有显式声明可访问性,编译器通常默认选择private。
反例:CLR要求结构类型的所有成员都具有public可访问性,C#编译器知道这一点,所以禁止开发人员显示定义接口成员的可访问性,编译器自动设置为public。
4、派生类型重写基类型定义的成员时C#编译器要求原始成员和重写成员具有相同的可访问性。这是C#编译器的限制,其实CLR允许放宽但不允许收紧成员的可访问性限制。原因是CLR承诺派生类总能转型为基类,并且获取对基类方法的访问权。如果允许派生类收紧限制,CLR的承诺就无法兑现了。
1、有一些永远不需要实例化的类,这种类的唯一作用就是组合一组相关的成员。在C#中要用static关键字定义不可实例化的类。该关键字只能用于类,不能应用于结构,因为CLR总是允许值类型实例化。(这算是类型和结构的另外一个区别了)
2、C#对静态类有如下限制:①静态类必须直接从基类Object派生(因为继承只适用于对象)②静态类不能实现任何接口(因为只有使用实例时才可以调用接口方法)③静态类只能定义静态成员 ④静态类不能作为字段、方法参数和局部变量使用(因为他们都代表实例的引用)
1、partial关键字告诉C#编译器:类、结构或者接口的定义源代码可能要分散到一个或多个源代码文件中。将类型源代码分散到多个文件的原因有三:①源代码控制 ②在同一个文件中将类或结构分解成不同的逻辑单元 ③代码拆分。
暂略