类型中的各种成员:在一个类型中可以定义0个或者多个以下种类的成员:
1.常量:只能被类型访问且不可以对常量值进行修改。
2.字段:静态字段只能被类型访问;实例字段只能被实例访问;不可以对只读的字段值进行修改;建议将字段设置成私有以防止被外部代码破坏状态。
3.类型构造器:格式为"static 类型名() {}",用来对类型的静态字段进行初始化。
4.实例构造器:格式为"public 类型名(参数列表) {}",用来对实例字段进行初始化。
5.方法:静态方法只能被类型访问;实例方法只能被实例访问。
6.操作符重载:定义了当操作符应用于实例时,应该如何操作该实例的方法。
7.转换操作符:定义了如何隐式或者显示的将实例从一种类型转换成另一种类型的方法。
8.属性:静态属性只能被类型访问,如"public static 属性名{ get{…}; set{…}; }";实例属性只能被实例访问,如:“public 属性名{ get{…}; set{…}; }”。
9.事件:通常是由注册事件,移除事件以及响应事件方法集组成。静态事件是由类型向一个或者多个类型或者实例发送通知;实例事件是由实例向一个或者多个类型或者实例发送通知。
10.类型:用来将大的,复杂的类型拆分成更小的构建单元。
类型的可见性:如下所示:
1.public表示类型在所有程序集的所有代码中可见。
2.internal表示类型在当前程序集的所有代码中可见。
3.编译当前程序集时,可以使用CompilerServices命名空间中的InternalsVisibleTo特性来设置包含的友元程序集(名称和公钥);编译友元程序集时,必须使用/out:来指明友元程序集的名称,如果友元程序集中包含模块的话,也必须使用/moduleassemblyname:开关来告诉编译器该模块属于的友元程序集名称;经过这些设置后就可以让友元程序集中所有的代码访问包含该友元程序集的程序集中的internal类型;
成员的可访问性:如下所示:
1.可访问性按照限制从大到小排列,如下表所示:
CLR术语 | C#术语 | 描述 |
---|---|---|
Private | private | 成员只能由定义类型或任何嵌套类型中的方法访问 |
Family | protected | 成员只能由定义类型或任何嵌套类型或任何派生类型中的方法访问 |
Family And Assembly | 不支持 | 成员只能由定义类型或任何嵌套类型或定义程序集中的派生类型中的方法访问 |
Assembly | internal | 成员只能由定义程序集中的方法访问 |
Family or Assembly | protected internal | 成员可以由任何嵌套类型或任何派生类型或定义程序集中任何方法访问 |
Public | public | 成员可以由任何程序集的任何方法访问 |
2.接口中不允许显示指定成员的可访问性,由编译器自动指定为public;其他类的成员如果不指定访问性的话,默认会由编译器自动指定为private。
3.CLR允许放宽但不允许收紧派生类型中基类型成员的可访问性;而C#要求派生类型中基类型成员的可访问性不能更改。
静态类型:用static关键字修饰的类型。具有以下特性:
1.静态类型只能作用于引用类型,不能作用于值类型(CLR要求值类型必须可以被实例化)。
2.静态类型只能隐式或者显示继承自System.Object。
3.静态类型不能实现任何接口。
4.静态类型里面的成员只能是静态或者常量成员。
5.静态类型不能作为变量(局部变量,参数变量,类成员变量等)使用。
分部类型:用partial关键字修饰的类型。具有以下特性:
1.分部类型可以作用于class,struct以及interface。
2.分部类型有利于代码拆分。由于可以在不同源文件进行定义,从而方便版本管理。
3.分部类型是C#编译器提供支持的,CLR对该功能一无所知。
设计类时遵循的原则:如下所示:
1.除非明确要将设计类作为基类且允许派生类对它进行特殊处理,否则我们都将设计类声明为sealed密封类。
2.默认将设计类设置成internal可见性,除非需要所有程序集可见时才设置成public可见性。
3.设计类中所有的字段设置成private访问性。
4.设计类中的方法尽量设计成非虚方法,这样调用速度会比较快。同时除了供外部访问的属性,方法和事件设置成public访问性,其他情况下都设置成private(次要选择protected internal)访问性。