幸福清扬

之技术学习

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

     类型的成员种类:没什么好说的
 
     类型的可见性:也没什么好说了,友元程序集可以在需要时了解一下

     成员的可见性

          需要知道 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的问题,就不啰嗦了

posted on 2008-07-03 12:46  杨连国  阅读(238)  评论(0编辑  收藏  举报