C# 浅拷贝与深拷贝区别 解惑篇
2010-09-05 14:20
211 查看
问题起源:
昨天被同事问到一个浅拷贝与深拷贝区别的问题,说实在的,记得在学校时在书在看过相关概念区别。
只是,那时的在校生,又有几个能对书本上那写的尽量让鬼都看不懂知识能清晰的理解呢。
工作后虽然也有用到Clone相关的内容,不过也仅是应用,基础的概念还是没去仔细的理解,以于后来DataTable内部那不深不浅的架构拷贝都混和这些概念混在一起了。
曾经的以为:
让得一年多以前,我去面试,被一个人问到浅拷贝与深拷贝区别,我答:浅拷贝就是拷贝就是拷贝架构,不包括值,深拷贝就是连值也一同拷贝。
当我答出这样错误的答案时,对方没有纠正,反而似乎对我的答案还挺满意的。
唉,面试管自己不懂还问我这问题,还让我一直以为到现在都是这个样。
同事的质问:
接着同事说它的示例里,发现值是有拷贝的,于是我意识到我的认知是有问题了,我重新百度了一下。
网上乱七杂八的答案,让我得一个模糊的似乎正确的答案:浅拷贝不拷贝内部类的对象
引申出的错乱:
接着同事的疑问更一度把我引向这个容易迷乱的错误深渊:浅拷贝是对引用类型拷贝地址,对值类型直接进行拷贝。
最后,为了解惑,还是用示例来说话了:
public static void Compare()
{
DemoClass baseClass = new DemoClass();
DateTime start = DateTime.Now;
for (int i = 0; i < 1000000; i++)
{
DemoClass newClass = (DemoClass)baseClass.Clone();
}
TimeSpan ts = DateTime.Now - start;
System.Console.WriteLine("浅拷贝:" + ts.Ticks);
DateTime start2 = DateTime.Now;
for (int j = 0; j < 1000000; j++)
{
DemoClass newClass = (DemoClass)baseClass.CloneNew();
}
TimeSpan ts2 = DateTime.Now - start2;
System.Console.WriteLine("深拷贝:" + ts2.Ticks);
System.Console.Read();
}
最后得出结果:
![](http://images.cnblogs.com/cnblogs_com/cyq1162/201009/copy_demo_2.jpg)
看来直接用浅拷贝性能还不如直接返回一个new的对象。
同样的,用克隆返回object最后还得对类型转换进行一些开销,教人情何以堪!
附言:
这两天刚好感冒,插了这两篇解惑篇,都是临时插进来的的问题了,接下来会继续写 CYQ.Data 轻量数据层之路 框架 的相关文章。
昨天被同事问到一个浅拷贝与深拷贝区别的问题,说实在的,记得在学校时在书在看过相关概念区别。
只是,那时的在校生,又有几个能对书本上那写的尽量让鬼都看不懂知识能清晰的理解呢。
工作后虽然也有用到Clone相关的内容,不过也仅是应用,基础的概念还是没去仔细的理解,以于后来DataTable内部那不深不浅的架构拷贝都混和这些概念混在一起了。
曾经的以为:
让得一年多以前,我去面试,被一个人问到浅拷贝与深拷贝区别,我答:浅拷贝就是拷贝就是拷贝架构,不包括值,深拷贝就是连值也一同拷贝。
当我答出这样错误的答案时,对方没有纠正,反而似乎对我的答案还挺满意的。
唉,面试管自己不懂还问我这问题,还让我一直以为到现在都是这个样。
同事的质问:
接着同事说它的示例里,发现值是有拷贝的,于是我意识到我的认知是有问题了,我重新百度了一下。
网上乱七杂八的答案,让我得一个模糊的似乎正确的答案:浅拷贝不拷贝内部类的对象
引申出的错乱:
接着同事的疑问更一度把我引向这个容易迷乱的错误深渊:浅拷贝是对引用类型拷贝地址,对值类型直接进行拷贝。
最后,为了解惑,还是用示例来说话了:
public static void Compare()
{
DemoClass baseClass = new DemoClass();
DateTime start = DateTime.Now;
for (int i = 0; i < 1000000; i++)
{
DemoClass newClass = (DemoClass)baseClass.Clone();
}
TimeSpan ts = DateTime.Now - start;
System.Console.WriteLine("浅拷贝:" + ts.Ticks);
DateTime start2 = DateTime.Now;
for (int j = 0; j < 1000000; j++)
{
DemoClass newClass = (DemoClass)baseClass.CloneNew();
}
TimeSpan ts2 = DateTime.Now - start2;
System.Console.WriteLine("深拷贝:" + ts2.Ticks);
System.Console.Read();
}
最后得出结果:
![](http://images.cnblogs.com/cnblogs_com/cyq1162/201009/copy_demo_2.jpg)
看来直接用浅拷贝性能还不如直接返回一个new的对象。
同样的,用克隆返回object最后还得对类型转换进行一些开销,教人情何以堪!
附言:
这两天刚好感冒,插了这两篇解惑篇,都是临时插进来的的问题了,接下来会继续写 CYQ.Data 轻量数据层之路 框架 的相关文章。
相关文章推荐
- C# 浅拷贝与深拷贝区别 解惑篇
- C# 浅拷贝与深拷贝区别 解惑篇
- C# 浅拷贝与深拷贝区别 解惑篇(转)
- C# 浅拷贝与深拷贝区别
- C# 浅拷贝与深拷贝区别
- C# 浅拷贝与深拷贝区别
- C# 浅拷贝与深拷贝区别
- C# 浅拷贝与深拷贝区别
- C# 浅拷贝与深拷贝区别
- 又一篇 C# 浅拷贝与深拷贝区别
- c# 深拷贝与浅拷贝的区别分析及实例
- c# 深拷贝与浅拷贝的区别分析及实例
- C# 浅拷贝与深拷贝区别
- C# 浅拷贝与深拷贝区别
- C#中的接口与类的区别
- C# 值类型,引用类型区别
- Java和C#中String直接赋值与使用new创建(==与equals进行比较)的区别
- C#中堆和栈的区别分析
- 学习:C#中struct与class的区别(转)
- C#中hashtable 与 dictionary的区别