当前位置: 首页 > news >正文

由struct 和class 想到的浅度复制和深度复制 c#

 

记得c++里面,struct 和class 的唯一不同点是,class的成员默认是private,struct的则默认是public。

在c#里则不然,struct 默认仍然是private。所以,不禁要问,struct和class有什么区别呢?

struct 是值类型的,而calss是引用类型的。

举个例子,

1 struct Mystruct
2 {
3     public int x;
4 }
5 
6 class Myclass
7 {
8     public int x;
9 }

如果执行以下代码,

1 Mystruct st1 = new Mystruct();
2 st1.x = 1;
3 Mystruct st2 = st1;
4 st2.x = 2;
5 
6 Myclass cs1 = new Myclass();
7 cs1.x = 1;
8 Myclass cs2 = cs1;
9 cs2.x = 2;

那么修改st2不会影响st1,但是修改cs2则同时也修改了cs1. 这就是值类型和引用类型的区别。cs1 和cs2只是一个指针,他们指向同一个地址。所以修改其中任何一个,他们都会同时被修改。

既然有值类型和引用类型之分,我们看一看下面这个初学者容易出错的例子:

 1 Myclass [] array = new Myclass[5];
 2 
 3 Myclass tmp = new Myclass();
 4 
 5 for (int i=0;i<5;i++)
 6 
 7 {
 8 
 9     tmp.x = i;
10 
11     array[i] = tmp;
12 
13 }

array是不是一个x值等于下标的一个类数组呢?答案是否定的,array数组里面,所有的x都等于4.

于是对于类复制,引发了有浅度复制和深度复制等概念。

浅度复制是用过派生于System.Object 的MemberwiseClone()实现的,它可以复制所有值类型,但是对于引用类型,还是只复制了指针。

深度复制需要实现ICloneable借口的Clone()函数,实现引用类型的复制。

看一个例子:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace ConsoleTest
 7 {
 8     class Program
 9     {
10         static void Main(string[] args)
11         {
12             CloneExample a = new CloneExample();
13             a.content = new Content() { con = 1 };
14             a.x = 2;
15 
16             // 浅度复制
17             CloneExample b = (CloneExample) a.ShallowCopy();
18             b.content.con = 11;
19             b.x = 22;
20             Console.WriteLine("a.content.con = {0}",a.content.con); 
21             Console.WriteLine("a.x = {0}", a.x);
22 
23             //再试一试深度复制
24             a.content.con = 1;
25             b = (CloneExample)a.Clone();
26             b.content.con = 11;
27             b.x = 22;
28             Console.WriteLine("a.content.con = {0}", a.content.con);//浅度复制和深度复制的区别体现在,引用类型会不会受影响
29             Console.WriteLine("a.x = {0}", a.x);
30 
31 
32 
33             Console.ReadKey();
34         }
35 
36 
37     }
38 
39     class Content {
40         public int con;
41     }
42 
43     class CloneExample:ICloneable
44     {
45         public int x;
46         public Content content;
47 
48         public object ShallowCopy()
49         {
50             return this.MemberwiseClone();
51         }
52 
53         public object Clone()
54         {
55             CloneExample instance = new CloneExample();
56             instance.x = this.x;
57             instance.content = new Content() { con = this.content.con };
58             return instance;
59         }
60     }
61 }

使用深度复制,新的变量和就的变量是独立的,互不影响。

运行结果:

a.content.con = 11
a.x = 2
a.content.con = 1
a.x = 2

 

转载于:https://www.cnblogs.com/sylvanas2012/archive/2012/07/12/2588468.html

相关文章:

  • 深入理解C#之 参数传递 ref out params
  • Spring表单校验解析
  • flex 学习笔记 动态改变 样式文件
  • CLI配置和编址
  • 【转】解决启动memcached启动时报”memcached:error while load...
  • MySql跨服务器备份数据库
  • 语音提示倒计时小工具
  • Unicode
  • Cisco 路由器硬件信息查询命令
  • LaTeX空白距离
  • switch语句
  • 下了班----你干啥
  • 进位标志位
  • [转载]C++引用浅谈
  • 七月总结 八月安排
  • angular2 简述
  • CentOS从零开始部署Nodejs项目
  • github指令
  • js ES6 求数组的交集,并集,还有差集
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • mysql innodb 索引使用指南
  • SOFAMosn配置模型
  • Webpack 4 学习01(基础配置)
  • 从0实现一个tiny react(三)生命周期
  • 第十八天-企业应用架构模式-基本模式
  • 解决iview多表头动态更改列元素发生的错误
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 微信开源mars源码分析1—上层samples分析
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (12)Linux 常见的三种进程状态
  • (145)光线追踪距离场柔和阴影
  • (2)Java 简介
  • (C++)八皇后问题
  • (Note)C++中的继承方式
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (算法设计与分析)第一章算法概述-习题
  • (转)Google的Objective-C编码规范
  • .bashrc在哪里,alias妙用
  • .naturalWidth 和naturalHeight属性,
  • .NET 4.0中的泛型协变和反变
  • .NET Core 成都线下面基会拉开序幕
  • .net core 连接数据库,通过数据库生成Modell
  • .net 流——流的类型体系简单介绍
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景