代码改变世界

C#功能派的进阶--你该思考的一些事1

2010-12-04 22:53  撞破南墙  阅读(1598)  评论(5编辑  收藏  举报

写在前面的话:

《c#进阶》系列是我想深入学习一些c#的东西而记下来的笔记和思考。

1 我不能保证他是完全正确的,也不能保证他是最佳实践。

2 存在跳跃性,不会提供完整的知识体系,但是很多个笔记点都是一个点,你可以扩展去思考和了解。

3 希望能起到抛砖引玉的作用,唤起很多不深入思考的”功能“派一些思考。

 

 我参考的书籍

《CLR VIA C#》

《.NET FrameWork 2.0》

《你必须知道的.NET 》

 

 

1 实例化一个类:new 到底做了什么?

  @1 计算所需空间大小。检查该类及其所有积累所包含的字段的字节数大小和类型指针同步索引块

  @2 初始化所有field为null或0

  @3 初始化类型指针和同步索引块。

  @4 调用构造函数。

 

2 就转换而言,as 是 is 的优化。

   因为 is 操作需要两次转换  第一步判断是否是该类型。第二步进行安全转换。

   if(a is typeA) {//1次

var typeA1= a  as typeA;//第二次

或者

var typeA1=(typeA1) a;

}else{}

   as 操作 第一次直接进行安全转换 , 第二步可以判断是否为null来知道是否转换成功。

   仅就转换而言。

 

3 同一个类的多个实例类共享同一个类型方法。

      不止同一个类实例化的多个实例共用同一个。包括子类调用的父类的方法也是只存在一个地方。

       我猜测是通过类型指针实现的。

 

4 避免使用decimal。 

   虽然decimal是c#的基元类型,但是CLR可不这么看,没有了CLR的支持,decimal的所有加减乘除都没有IL指令的直接支持,

而是通过调用c#里的函数来做过一遍。效率可想而知。

   另外decimal也不能直接享受check和unchecked的待遇---对编译是否执行溢出的检查。

 

5 引用类型与值类型的那些事

  1使用值类型的好处:

  @1 创建与回收:减少垃圾回收的次数。引用类型的创建可能会触发垃圾回收(需要在托管堆上分配内存),而值类型不需要。

  @2 存储的位置:减少托管堆的压力。值类型在栈。

 2何时使用值类型?

   @1只是作为基础的数据结构 @2不继承也不派生

 3禁忌:

   值类型最好不要太大,如果过大的话不要作为参数传递和方法的返回值。因为值类型在此时是通过复制进行传递的。

 4值类型的覆写:

   值类型继承自System.ValueType,重写了equal()和hashcode等方法。但他们都效率不高,比如equal是验证包括父类的所有字段是否相等。

 

6 内存字段的布局:

   一般都用不着。。玩汇编的时候可能会用这个,两个变量共享一部分字段。。。