一方面感觉实在无趣,不知道做什么了,纯粹来个打字练习,于是有了这个。

二方面深感自己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#基础)深浅拷贝理解的更多相关文章

  1. python基础--深浅拷贝copy

    拷贝是音译的词,其实他是从copy这个英文单词音译过来的,那什么是copy? copy其实就是复制一份,也就是所谓的抄一份.深浅copy其实就是完全复制一份,和部分复制一份的意思. 1.赋值运算 l1 ...

  2. python基础-深浅拷贝

    深拷贝与浅拷贝 总结: # 浅拷贝:list dict: 嵌套的可变数据类型是同一个 # 深拷贝:list dict: 嵌套的不可变数据类型彼此独立 浅拷贝 # 个人理解: # 在内存中重新创建一个空 ...

  3. Python基础【3】:Python中的深浅拷贝解析

    深浅拷贝 在研究Python的深浅拷贝区别前需要先弄清楚以下的一些基础概念: 变量--引用--对象(可变对象,不可变对象) 切片(序列化对象)--拷贝(深拷贝,浅拷贝) 我是铺垫~ 一.[变量--引用 ...

  4. Python基础知识(六)------小数据池,集合,深浅拷贝

    Python基础知识(六)------小数据池,集合,深浅拷贝 一丶小数据池 什么是小数据池: ​ 小数据池就是python中一种提高效率的方式,固定数据类型使用同一个内存地址 代码块 : ​ 一个文 ...

  5. 基础数据 补充 set() 集合 深浅拷贝

    一  对字符串的操作 li = ["张曼玉", "朱茵", "关之琳", "刘嘉玲"] s = "_" ...

  6. python基础知识5——赋值与深浅拷贝——整数和字符串,列表元组字典

    深浅copy 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. 1 import copy 2 # ######### 数字.字符串 #### ...

  7. 关于:1.指针与对象;2.深浅拷贝(复制);3.可变与不可变对象;4.copy与mutableCopy的一些理解

    最近对深浅拷贝(复制)做了一些研究,在此将自己的理解写下来,希望对大家有所帮助.本人尚处在摸索阶段,希望各位予以指正. 本文包括如下方向的探索: 1.指针与对象: 2.深/浅拷贝(复制): 3.可变/ ...

  8. 【 js 基础 】 深浅拷贝

    underscore的源码中,有很多地方用到了 Array.prototype.slice() 方法,但是并没有传参,实际上只是为了返回数组的副本,例如 underscore 中 clone 的方法: ...

  9. python基础之数据类型操作补充,集合及其操作,深浅拷贝

    内容概要: 数据类型操作补充 集合及其操作 深浅拷贝1.基础数据类型补充 1.1字符串的操作补充li = ["李嘉诚", "麻花藤", "黄海峰&qu ...

随机推荐

  1. Python开发【笔记】:如何在字典遍历中删除key值?

    数据遍历时不能犯傻系列 前言: 针对字典做一些操作时,有时会遇到下面的状况,列如我们需要把data中的key值根据replace中的映射关系进行替换(Caller替换为caller) data = { ...

  2. Flex 布局:实例篇

    上一篇文章介绍了Flex布局的语法,今天介绍常见布局的Flex写法.你会看到,不管是什么布局,Flex往往都可以几行命令搞定. ​ 我只列出代码,详细的语法解释请查阅<Flex布局教程:语法篇& ...

  3. Git学习-->如何通过Shell脚本实现 监控Gitlab备份整个过程并且通过邮件通知得到备份结果?

    一.背景 Git学习–>如何通过Shell脚本自动定时将Gitlab备份文件复制到远程服务器? http://blog.csdn.net/ouyang_peng/article/details/ ...

  4. 用Python实现的数据结构与算法:双端队列

    一.概述 双端队列(deque,全名double-ended queue)是一种具有队列和栈性质的线性数据结构.双端队列也拥有两端:队首(front).队尾(rear),但与队列不同的是,插入操作在两 ...

  5. Struct2小结:

    Action小结: 实现一个Action的最常用的方式:从ActionSupport继承: DMI动态方法调用,减少配置内容: 通配符 *_* ({1},{2})的使用更方便: 接收参数的方法(一般用 ...

  6. PAT 1102 Invert a Binary Tree[比较简单]

    1102 Invert a Binary Tree(25 分) The following is from Max Howell @twitter: Google: 90% of our engine ...

  7. R语言基本语法

    R语言基本语法 基本数据类型 数据类型 向量 vector 矩阵 matrix 数组 array 数据框 data frame 因子 factor 列表 list 向量 单个数值(标量)没有单独的数据 ...

  8. Windows2003 + IIS6 安装.Net FrameWork 4.0 兼容早期版本的测试

    看到文档说.net4的框架可以向下兼容2.0.3.0.3.5这几个版本,觉得是一件好事,以后服务器上就不用费时费力的安装 2.0.3.5之类的框架了.但是又觉得奇怪,2.0和3.5的框架都是很大的,为 ...

  9. 数据挖掘-逻辑Logistic回归

    逻辑回归的基本过程:a建立回归或者分类模型--->b 建立代价函数 ---> c 优化方法迭代求出最优的模型参数  --->d 验证求解模型的好坏. 1.逻辑回归模型: 逻辑回归(L ...

  10. Android初体验之Monkey和MonkeyRunner

    原文地址https://blog.csdn.net/mad1989/article/details/38087737 Monkey 什么是Monkey Monkey是Android中的一个命令行工具, ...