1. 深拷贝和浅拷贝
单纯讲这两个词,其实不容易记住区别,但是看看他们对应的英语单词就显而易见了:
深拷贝: Clone
浅拷贝: Copy
记住了这个,下面在看看详细一点的信息:
Copy: 只是复制了一个引用,就像object类型的复制,我们用
Object a = New Object(); Object b = a; //b is a copy of a
这里b就是a的copy,b==a 会返回true;
而clone就是照着模特完全造一个一模一样的出来,这时需要实现ICloneable.Clone方法。
ICloneable a = New CloneableObject(); ICloneable b = a.Clone(); //b is cloned from a
这时候b==a会返回false。
2. lock的用法
lock(new object()) //这里一定要给引用类型变量 { object a = new object (); }
当然,如果你真按上面这个写法去写,这段代码没有任何同步效果,它每次都会试图锁一个全新的不同的对象,这一定会成功。
3. Object 与 object
Object 是一个类,碰巧这个类是.Net里所有类的基类,它就是盘古。这个类这么特殊,那我们给他一个关键字好了,那就叫object吧。
4. 装箱和拆箱
一个经典的装箱拆箱案例:
static void Main(string[] args) { ValueTypeT t = new ValueTypeT(); t.a = 5; Object o = t; //boxing ((ValueTypeT)o).SetA(6); //unboxing, t.a is not set. Console.ReadKey(); } public struct ValueTypeT { public int a; internal void SetA(int p) { this.a = p; } }
在装箱的时候,o.a的值是从t copy过来的,当需要调用SetA方法的时候,需要拆箱,将o 完全拆出来,然后就跟o没有关系了,这是调用了这个结构体的SetA方法,已经与o完全没有关系了,所以o的值不变。如下有示意图: