1) static constructors适合用来做那些不能初始化,且只需做一次的设置工作。
2) private constructors可以保证该类不被实例化。
3) property的set和get函数使数据封装更好,且比C++中手工编写set/get函数省力。
(The client can interact with the properties directly, without sacrificing the data hiding and encapsulation sacrosanct in good object-oriented design)
4) readonly保证了public数据的只读性。
5) 类及其成员有不同的可见性的时候,以较严格的为准。
6) C#用base来表示基类,而不是具体的类名。
7) 如果基类有默认的构造函数,派生类的构造函数会自动调用基类的默认构造函数。如果派生类没有构造函数,系统会为它创建一个什么都不做的构造函数,并自动调用基类的默认构造函数。
8) 派生类用new来重载基类的函数。
9) virtual和override用来实现多态性(runtime type),不使用virtual和override的时候,无法动态联编,使用的是基类的方法,且这个方法的多态性得以继承,即派生类的派生类仍能动态实现这一方法。
10) new和override: new类似于覆盖,即派生类的这个方法不会动态联编。override则可以成为重载,因为它是动态联编的。
11) virtual在C#里,总是一个虚拟派遣的根;找到一个virtual函数后,不会再往上追溯。
12) 如果有一个或多个方法是抽象的,那么这个类的定义也需要用abstract来标记。抽象方法无法被实现。
13) abstract无法保证子类的子类也自行实现这个抽象方法。
14) sealed使类无法被继承。
15) object的ToString实现的是返回类的名字。
16) 嵌套类能访问外层类的所有成员,并能对外不可见。
17) C#不能创建非静态操作符(C++中可以?)
18) is操作符用于判别动态运行类型是否是某个类。
19) 关系操作符成对重载。在重载转换操作符时,implict被用于不会丢失信息的场合,explicit用于其它场合。