(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 ...
随机推荐
- python中super的使用
转自:http://python.jobbole.com/86787/ super() 的入门使用 在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能, ...
- jquery 获取对象
jquery 获取对象 1.引用this作为对象时,必须以$(this)的形式变为对象目标,否则,无法识别,会报错“ has no method”
- 《Java程序猿面试笔试宝典》之Java程序初始化的顺序是如何的
在Java语言中.当实例化对象时.对象所在类的全部成员变量首先要进行初始化,仅仅有当全部类成员完毕初始化后,才会调用对象所在类的构造函数创建对象. Java程序的初始化一般遵循以下三个原则(以下 ...
- List的三个子类ArrayList,LinkedList,Vector区别
一:List的三个子类的特点 ArrayList: 底层数据结构是数组,查询快,增删慢. 线程不安全,效率高.Vector: 底层数据结构是数组,查询快,增删慢. 线程安全,效率低.Vector相对A ...
- 初识MVCSharp
MVCSharp其实是MVP模式 主要内容 ITask IView IController
- [Err]1418 This function has none of DETERMINISTIC,NO SQL,or R
----------------------------------------------------------------------------------------------- ...
- Spark Shuffle(二)Executor、Driver之间Shuffle结果消息传递、追踪(转载)
1. 前言 在博客里介绍了ShuffleWrite关于shuffleMapTask如何运行,输出Shuffle结果到Shuffle_shuffleId_mapId_0.data数据文件中,每个exec ...
- monkey基础学习
原文地址https://blog.csdn.net/beyond_f/article/details/78543070 一.Monkey测试简介 Monkey测试是Android平台自动化测试的一种手 ...
- ReactNative生成android平台的bundle文件命令
ReactNative生成android平台的bundle文件命令 2016年11月03日 23:23:28 阅读数:4869 注:如果assets文件没有正确生成,需要手机创建或授权 网上的其它的很 ...
- maven-eclipse 中index.html页面乱码
maven-eclipse 中index.html页面乱码: pox.xml修改: <project> -- <properties> <argLine>-Dfil ...