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
作者:撞破南墙
出处:http://www.cnblogs.com/facingwaller/
关于作者:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。