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

二方面深感自己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. 由SOAP说开去 - - 谈谈WebServices、RMI、RPC、SOA、REST、XML、JSON

    引子: 关于SOAP其实我一直模模糊糊不太理解,这种模模糊糊的感觉表述起来是这样: 在使用web服务时(功能接口),本来我就可以通过安卓中固有的http类(使用http协议),来发送http请求,并且 ...

  2. 符合语言习惯的 Python 优雅编程技巧

    Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净.整洁.一目了然.要写出 Pythonic(优雅的.地道的.整洁的)代码,需要多看多学大牛们写的代码,github 上有很多非常优秀 ...

  3. 【python】Python3 循环语句

    [python]几种常见的循环 注意:如果涉及到程序中print语句中含有%d,%s,那么要在脚本最开始写语句:#coding=utf-8,才能够正常输出想要的数字或者字符串. Python3 循环语 ...

  4. [sql] 同库表(结构)的备份和sql聚合&navicat使用

    同库表的备份-赋值表结构和数据SQL语句 参考 有时候我们处理某个表时,需要先备份下这个表到当前这个库,然后再执行sql. 站在sql角度,就无需在mysqldump或者诸如导出sql的方式来备份了. ...

  5. (转)JSON Web Token - 在Web应用间安全地传递信息

    JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息. 让我们来假想一下一个场景.在A用户关注了B用户的时候,系统发邮件给B用户, ...

  6. 1059. C语言竞赛(20)

    原题: https://www.patest.cn/contests/pat-b-practise/1059 思路: 参赛者id是数组下标, 数组值是参赛者排名位置(从1开始), 每次判断0不存在, ...

  7. WHCTF2017线上小记

    第四届XCTF开始,首战因素,加上团队刚加入了两个新人的原因,还是决定一块参与一下.水了3题.2个RE和1个MISC,照顾新人,写的比较啰嗦. [MISC] PY-PY-PY 下载题目之后是一个pyc ...

  8. Java文件IO流的操作总结

    Java中的IO操作涉及到的概念及相关类很多,很容易弄混,今天特来整理总结一下,并附上一份完整的文件操作的代码. 概念解析 读和写 流就是管道,向管道里面写数据用输出流:write 从管道里面读数据, ...

  9. SpringMVC中@pathVariable和@RequestParam注解的区别

    @pathVariable和@RequestParam的区别 @pathVariable:是从路径中获取变量,也就是把路径当做变量 @RequestParam:是从请求里面获取参数 案例分析: /Sp ...

  10. linux及安全第五周总结——20135227黄晓妍

    (注意:本文总结备份中有较多我手写笔记的图片,其中重要的部分打出来了.本文对分析system_call对应的汇编代码的工作过程,系统调用处理过程”的理解,以及流程图都写在实验部分.) 实验部分 使用g ...