代码改变世界

C#功能派的进阶2--类型的那些事

2010-12-09 11:08  撞破南墙  阅读(677)  评论(1编辑  收藏  举报

1装箱是一个什么样的过程?

1.从托管堆中分配好内存。(包括各个字段和两个额外成员)。

2.值类型的字段复制到新分配好的托管堆的内存。

3.返回对象的地址。

2拆箱的过程呢?

1.从指针中取值。 

3实践建议

1.尽量减少(拆)装箱。

         比如可以使用List<System.ValueType(int,float等)>的时候就不要用List<object>。

 比如:调用参数的时候,如果有值类型的重载版本的话,就使用值类型的。能减少拆装箱的次数。

        3. 对于多次需要装拆箱的一个变量可以做一次装拆箱,之后就可以统一调用拆装箱后的变量。

4. 重写Tostring()和compare等方法,以减少拆装箱的次数,因为他们是基类的方法,调用基类的方法需要转换成引用类型。

4使用值类型的

好处:

1.不在托管堆上分配。在栈中分配,减少堆的压力。

2. 没有类型对象指针和同步索引块。

不好:

1. 不能使用Monitor和lock做多线程的同步。

5使用值类型的接口来改变值类型的字段,为什么值没有发生变化?

执行类装换为接口后把值复制了一遍,改变的是新的字段而不是原来的值。

6 equal是如何判断相等的?

1 OBJECT中的EQUAL:   return this==object;

2 判断的是同一性而不是相等性。

3 值类型的Equal方法使用反射来判断所有字段的相等。性能不高。

   如果想要更好的控制和更高效的性能。可以重载一系列包括equal,==,!=等等方法。(crazy!----:p   )

 5.6值类型与hashcode 

1重写hashcode的理由:

1反射慢 

                2原来的实现方式只是是将字段 XOR 异或 并不总是最优方案。

3更有掌控力。

2不要将hashcode持久化,因为hashcode可能会随着CLR版本升级而改变其算法。

 

6类型和成员的种类:

 

    • 常量 const
    • 字段 fields
    • 实例构造器.ctro()
    • 类型构造器
    • 方法methods
    • 操作符重载operator
    • 转换操作符
    • 属性Properties
    • 事件 Events

 

 7c#中的类似C++的“友元”?

    类型的可见性 public 和 internal ,internal 表示程序集内可以访问,那么程序集外如何可见?

[assembly:InternalsVisibleTo ("AssemblyB, PublicKeyToken=32ab4ba45e0a69a1")] 

 还有一种方法是使用 StrongNameIdentityPermission

参考 http://www.cnblogs.com/wdxinren/archive/2004/11/10/62259.html 

还有这里 http://www.cnblogs.com/oec2003/archive/2010/11/15/1877390.html