类型的成员种类:没什么好说的
类型的可见性:也没什么好说了,友元程序集可以在需要时了解一下
成员的可见性:
需要知道 assembly <--> internal family <--> protected 对应关系
C#要求基类和子类对同一成员量的访问权限必须是一致的,例如在基类中是protected的成员变量,继承到子类后,依然是protected。而CLR却不是这么规定的,可以将protected变为public。
静态类:
结构不能声明为静态的,因为CLR天生要求它必须实例化。
部分类、结构、接口:
需要说明的是partial关键字是C#提供的,CLR并对此并不知晓。不错的属性!
组件、多态和版本控制:
组件软件编程(Component Software Programming,CSP)
如何调用虚方法?
在CLR内部调用方法有两个指令call 和 callvirt。
call可以用来调用静态方法、实例方法和虚方法。调用静态方法是必须指明调用方法的类型,调用实例方法或虚方法必须指明变量引用,call指令假定变量不为null。 callvirt指令用来调用实例方法和虚方法,JIT编译器在编译调用该指令时,会验证对应的变量是否为null,则抛出异常。 为什么C#编译器不只生成call指令呢?这是因为c#编译器团度觉得应该做null检查,尽管这样会牺牲一定的效率。 那是不是对虚方法的调用都会使用callvirt指令呢?有两种例外,第一种是子类覆写虚方法时调用基类的该方法,例如base.somemethod(),这是会使用call指令,因为使用callvirt会造成循环调用。第二种情况是对结构方法是用call指令,因为值类型天生就是不能为null的。
另外需要注意,如果一个方法之前定义为非虚方法,而已经被广泛调用,就不应该再将其改为虚方法,因为之前的调用使用的是call指令,除非重新编译,否则会产生不可预期的结构。但是如果使用C#编程倒是不用担心这一点,因为C#编译器总是在调用实例方法时使用callvirt指令。
类型和成员可见性:
Jeffrey建议定义一个类时,缺省应该具有sealed关键字,并说出了几个原因,原因就不多说了,说的也对,如果仅仅是为了封装,而不需要继承,应该是sealed。但是C#缺省并无该关键字,也就是C#定义一个类,那么该类肯定可以继承,除非显示的添加了sealed关键字。但是在C#代码内,如果不加任何前缀修饰,默认是internal
类型版本控制:说了一下new的问题,就不啰嗦了
生活TMD需要激情,做事需冷静,说话需冷静!
遇事记着:办法总比困难多,困难和问题说不定就是机遇和转折!
历史证明:哪个环节没照顾到,哪个环节就会出问题!能自己来,就不要让别人来。