(C#基础)深浅拷贝理解
一方面感觉实在无趣,不知道做什么了,纯粹来个打字练习,于是有了这个。
二方面深感自己C#基础之薄弱,于是对着园友的文章一边看,一边练习,因为很多次看了,没有多久就忘了,还有练习过程中会出现一些问题,这些问题往往是自己最容易忽视的,还有可以举一反三,引申一些其他知识点,于是有了这个。
浅拷贝代码
public class Room
{
public int _maxSeat;
public string _address;
public Room(int maxSeat,string address)
{
this._maxSeat = maxSeat;
this._address = address;
}
}
public struct Film
{
public string _name;
public int _bigmax;
public Film(string name,int bigmax)
{
this._name = name;
this._bigmax = bigmax;
}
} public class Cinema
{
public Room _room;
public Film _film; public Cinema(Room room,Film film)
{
this._room = room;
this._film = film;
}
public object Clone()
{
return MemberwiseClone();// 对引用类型实施浅复制
} }
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace dazilianxi
{
class Program
{
static void Main(string[] args)
{
Room room1 = new Room(,"广州");
Film film1 = new Film("家园防线",);
Cinema cinema1 = new Cinema(room1, film1);
Cinema cinema2=(Cinema) cinema1.Clone();
Console.WriteLine("拷贝之前,结构成员的字段值为{0},地址{2},引用类型成员值是{1},最大值{3}",cinema1._film._name,cinema1._room._maxSeat,cinema1._film._bigmax,cinema1._room._address); Console.WriteLine("拷贝之后,结构成员的字段值是{0},地址{2},引用类型成员值是{1},最大值{3}", cinema2._film._name, cinema2._room._maxSeat, cinema2._film._bigmax, cinema2._room._address);
//修改拷贝之前引用类型的字段
cinema1._film._name = "极品飞车";
cinema1._film._bigmax = ;
cinema1._room._address = "香港";
cinema1._room._maxSeat = ; Console.WriteLine("拷贝之前,结构成员的字段值为{0},地址{2},引用类型成员值是{1},最大值{3}", cinema1._film._name, cinema1._room._maxSeat, cinema1._film._bigmax, cinema1._room._address); Console.WriteLine("拷贝之后,结构成员的字段值是{0},地址{2},引用类型成员值是{1},最大值{3}", cinema2._film._name, cinema2._room._maxSeat, cinema2._film._bigmax, cinema2._room._address); //说明浅度复制,结构类型值没有改变,引用类型值发生改变
Console.ReadKey();
}
}
}
运行结果:

浅拷贝关键点是对引用类型拷贝的是对象引用,这个引用指向托管堆上的对象实例。改变原对应引用类型的值,会影响到复制对象。
深拷贝代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace dazilianxi
{
public class Room
{
public int _maxSeat;
public string _address;
public Room()
{
}
public Room(int maxSeat,string address)
{
this._maxSeat = maxSeat;
this._address = address;
}
}
public struct Film
{
public string _name;
public int _bigmax;
public Film(string name,int bigmax)
{
this._name = name;
this._bigmax = bigmax;
}
} public class Cinema
{
public Room _room;
public Film _film; public Cinema(Room room,Film film)
{
this._room = room;
this._film = film;
}
public object Clone2()
{
Room room = new Room();
room._address = this._room._address;
room._maxSeat = this._room._maxSeat;//复制当前引用类型成员的值到新对象
Film film = this._film; //值类型直接赋值
Cinema cinema = new Cinema(room, film);
return cinema;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace dazilianxi
{
class Program
{
static void Main(string[] args)
{
Room room1 = new Room(,"广州");
Film film1 = new Film("家园防线",);
Cinema cinema1 = new Cinema(room1, film1);
Cinema cinema2=(Cinema) cinema1.Clone2();//深拷贝
Console.WriteLine("拷贝之前,结构成员的字段值为{0},地址{2},引用类型成员值是{1},最大值{3}",cinema1._film._name,cinema1._room._maxSeat,cinema1._film._bigmax,cinema1._room._address); Console.WriteLine("拷贝之后,结构成员的字段值是{0},地址{2},引用类型成员值是{1},最大值{3}", cinema2._film._name, cinema2._room._maxSeat, cinema2._film._bigmax, cinema2._room._address);
//修改拷贝之前引用类型的字段
cinema1._film._name = "极品飞车";
cinema1._film._bigmax = ;
cinema1._room._address = "香港";
cinema1._room._maxSeat = ; Console.WriteLine("拷贝之前,结构成员的字段值为{0},地址{2},引用类型成员值是{1},最大值{3}", cinema1._film._name, cinema1._room._maxSeat, cinema1._film._bigmax, cinema1._room._address); Console.WriteLine("拷贝之后,结构成员的字段值是{0},地址{2},引用类型成员值是{1},最大值{3}", cinema2._film._name, cinema2._room._maxSeat, cinema2._film._bigmax, cinema2._room._address); //说明浅度复制,结构类型值没有改变,引用类型值发生改变
Console.ReadKey();
}
}
}
运行结果:

深拷贝后,两个对象的引用成员已经分离,改变原先对象引用类型成员的值并不会对复制对象的引用类型成员值造成影响。
深度拷贝序列化
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO; namespace dazilianxi
{
[Serializable]
public class Room
{
public int _maxSeat;
public string _address;
public Room()
{
}
public Room(int maxSeat,string address)
{
this._maxSeat = maxSeat;
this._address = address;
}
}
[Serializable]
public struct Film
{
public string _name;
public int _bigmax;
public Film(string name,int bigmax)
{
this._name = name;
this._bigmax = bigmax;
}
} [Serializable]
public class Cinema
{
public Room _room;
public Film _film; public Cinema(Room room,Film film)
{
this._room = room;
this._film = film;
}
public object Clone3()
{
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, this); //复制到流中
ms.Position = ;
return (bf.Deserialize(ms));
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace dazilianxi
{
class Program
{
static void Main(string[] args)
{
Room room1 = new Room(,"广州");
Film film1 = new Film("家园防线",);
Cinema cinema1 = new Cinema(room1, film1);
Cinema cinema2 = (Cinema)cinema1.Clone3();//深拷贝
Console.WriteLine("拷贝之前,结构成员的字段值为{0},地址{2},引用类型成员值是{1},最大值{3}",cinema1._film._name,cinema1._room._maxSeat,cinema1._film._bigmax,cinema1._room._address); Console.WriteLine("拷贝之后,结构成员的字段值是{0},地址{2},引用类型成员值是{1},最大值{3}", cinema2._film._name, cinema2._room._maxSeat, cinema2._film._bigmax, cinema2._room._address);
//修改拷贝之前引用类型的字段
cinema1._film._name = "极品飞车";
cinema1._film._bigmax = ;
cinema1._room._address = "香港";
cinema1._room._maxSeat = ; Console.WriteLine("拷贝之前,结构成员的字段值为{0},地址{2},引用类型成员值是{1},最大值{3}", cinema1._film._name, cinema1._room._maxSeat, cinema1._film._bigmax, cinema1._room._address); Console.WriteLine("拷贝之后,结构成员的字段值是{0},地址{2},引用类型成员值是{1},最大值{3}", cinema2._film._name, cinema2._room._maxSeat, cinema2._film._bigmax, cinema2._room._address); //说明浅度复制,结构类型值没有改变,引用类型值发生改变
Console.ReadKey();
}
}
}
运行结果:

参考:http://www.cnblogs.com/darrenji/p/3601523.html
(C#基础)深浅拷贝理解的更多相关文章
- python基础--深浅拷贝copy
拷贝是音译的词,其实他是从copy这个英文单词音译过来的,那什么是copy? copy其实就是复制一份,也就是所谓的抄一份.深浅copy其实就是完全复制一份,和部分复制一份的意思. 1.赋值运算 l1 ...
- python基础-深浅拷贝
深拷贝与浅拷贝 总结: # 浅拷贝:list dict: 嵌套的可变数据类型是同一个 # 深拷贝:list dict: 嵌套的不可变数据类型彼此独立 浅拷贝 # 个人理解: # 在内存中重新创建一个空 ...
- Python基础【3】:Python中的深浅拷贝解析
深浅拷贝 在研究Python的深浅拷贝区别前需要先弄清楚以下的一些基础概念: 变量--引用--对象(可变对象,不可变对象) 切片(序列化对象)--拷贝(深拷贝,浅拷贝) 我是铺垫~ 一.[变量--引用 ...
- Python基础知识(六)------小数据池,集合,深浅拷贝
Python基础知识(六)------小数据池,集合,深浅拷贝 一丶小数据池 什么是小数据池: 小数据池就是python中一种提高效率的方式,固定数据类型使用同一个内存地址 代码块 : 一个文 ...
- 基础数据 补充 set() 集合 深浅拷贝
一 对字符串的操作 li = ["张曼玉", "朱茵", "关之琳", "刘嘉玲"] s = "_" ...
- python基础知识5——赋值与深浅拷贝——整数和字符串,列表元组字典
深浅copy 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. 1 import copy 2 # ######### 数字.字符串 #### ...
- 关于:1.指针与对象;2.深浅拷贝(复制);3.可变与不可变对象;4.copy与mutableCopy的一些理解
最近对深浅拷贝(复制)做了一些研究,在此将自己的理解写下来,希望对大家有所帮助.本人尚处在摸索阶段,希望各位予以指正. 本文包括如下方向的探索: 1.指针与对象: 2.深/浅拷贝(复制): 3.可变/ ...
- 【 js 基础 】 深浅拷贝
underscore的源码中,有很多地方用到了 Array.prototype.slice() 方法,但是并没有传参,实际上只是为了返回数组的副本,例如 underscore 中 clone 的方法: ...
- python基础之数据类型操作补充,集合及其操作,深浅拷贝
内容概要: 数据类型操作补充 集合及其操作 深浅拷贝1.基础数据类型补充 1.1字符串的操作补充li = ["李嘉诚", "麻花藤", "黄海峰&qu ...
随机推荐
- Redis缓冲区设置
对于Redis服务器的输出(也就是命令的返回值)来说,其大小通常是不可控制的.有可能一个简单的命令,能够产生体积庞大的返回数据.另外也有可能因为执行了太多命令,导致产生返回数据的速率超过了往客户端发送 ...
- ViewPager添加小圆点
ViewPager添加小圆点很简单,但是如果是网络图片可能就不太好做了,所以我这里给出一种方法,当然你也可以用其他的 1.主界面xml <?xml version="1.0" ...
- java-mybaits-00103-入门程序原生的【查、增、删、改】
一.需求 实现以下功能: 根据用户id查询一个用户信息 根据用户名称模糊查询用户信息列表 添加用户 更新用户 删除用户 二.具体步骤 1.增加pom引用 2.增加log4j.properties # ...
- ftp文件上传和下载
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...
- POJ2115:C Looooops(一元线性同余方程)
题目: http://poj.org/problem?id=2115 要求: 会求最优解,会求这d个解,即(x+(i-1)*b/d)modm;(看最后那个博客的链接地址) 前两天用二元一次线性方程解过 ...
- SVN提交修改时出现:Checksum mismatch
在使用SVN commit提交修改时,提示Checksum mismatch 问题,提示版本不一致,不能提交,类似于下图. 图片来源于网络,如有侵权,请告知删除. 搜索stackoverflow.co ...
- Keras实践:模型可视化
Keras实践:模型可视化 安装Graphviz 官方网址为:http://www.graphviz.org/.我使用的是mac系统,所以我分享一下我使用时遇到的坑. Mac安装时在终端中执行: br ...
- And Design:拓荒笔记——Form表单
And Design:拓荒笔记——Form表单 Form.create(options) Form.create()可以对包含Form表单的组件进行改造升级,会返回一个新的react组件. 经 For ...
- ruby中的回调方法和钩子方法
在ruby中,当某些特定的事件发生时,将调用回调方法和钩子方法.事件有如下几种: 调用一个不存在的对象方法 类混含一个模块 定义类的子类 给类添加一个实例方法 给对象添加一个单例方法 引用一个不存在的 ...
- CCPC-Wannafly Winter Camp Day7 (Div2, onsite)
Replay Dup4: 啥都不会? 只能看着两位聚聚A题? X: 模拟题不会写, 日常摔锅 u, v分不清, 日常演员 又是自己没理清楚就抢键盘上机导致送了一万个罚时, 日常背锅 A:迷宫 Solv ...