c# Clone方法

clone是深拷貝,copy是淺拷貝,如果是值類型的話是沒什么區別的,如果是引用類型的話深拷貝拷貝的事整個對象的數據,而淺拷貝僅僅拷貝對象的引用。因為類的實例是引用類型,要想用原有的類中的實例的數據的話,既要想創建原對象的一個副本的話,只能用clone方法。Clone方法分為深clone和淺clone 。

實現Clone的方法

手工克隆

一個能夠保證對象完全按照你所想的那樣進行克隆的方式是手工克隆對象的每一個域(field)。這種方式的缺點是麻煩而且容易出錯:如果你在類中增加了一個域,你很可能會忘記更新Clone方法。還要在克隆引用對象指向原始對象的時候,注意避免無限循環引用。

使用MemberWiseClone方法

MemberWiseClone是Object類的受保護方法,能夠通過創建一個新對象,并把所有當前對象中的非靜態域復制到新對象中,從而創建一個淺拷貝。對于值類型的域,進行的是按位拷貝。對于引用類型的域,引用會被賦值而引用的對象則不會。因此,原始對象及其克隆都會引用同一個對象。注意,這種方法對派生類都是有效的,也就是說,你只需在基類中定義一次Clone方法。

用反射進行克隆

用反射進行克隆是使用Activator.CreateInstance方法來創建一個相同類型的新對象,然后用反射對所有域進行淺拷貝。這種方法的優點是它是全自動的,不需要在對象中添加或刪除成員的時候修改克隆方法。另外它也能被寫成提供深拷貝的方法。缺點是使用了反射,因此會比較慢,而且在部分受信任的環境中是不可用的。

使用序列化進行克隆

克隆一個對象的最簡單的方法是將它序列化并立刻反序列化為一個新對象。和反射方法一樣,序列化方法是自動的,無需在對對象成員進行增刪的時候做出修改。缺點是序列化比其他方法慢,甚至比用反射還慢,所有引用的對象都必須是可序列化的(Serializable)。另外,取決于你所使用的序列化的類型(XML,SOAP,二進制)的不同,私有成員可能不能像期望的那樣被克隆。

代碼

///
///?Reference?Article?http://www.codeproject.com/KB/tips/SerializedObjectCloner.aspx
///?Provides?a?method?for?performing?a?deep?copy?of?an?object.
///?Binary?Serialization?is?used?to?perform?the?copy.
///
public?static?class?ObjectCopier
{//////?Perform?a?deep?Copy?of?the?object.//////?The?type?of?object?being?copied.///?The?object?instance?to?copy.///?The?copied?object.public?static?T?Clone(this?T?source){if?(!typeof(T).IsSerializable){throw?new?ArgumentException("The?type?must?be?serializable.",?"source");}//?Don't?serialize?a?null?object,?simply?return?the?default?for?that?objectif?(Object.ReferenceEquals(source,?null)){return?default(T);}IFormatter?formatter?=?new?BinaryFormatter();Stream?stream?=?new?MemoryStream();using?(stream){formatter.Serialize(stream,?source);stream.Seek(0,?SeekOrigin.Begin);return?(T)formatter.Deserialize(stream);}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/279994.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/279994.shtml
英文地址,請注明出處:http://en.pswp.cn/news/279994.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用MyQ打開車庫門時如何接收警報

Chamberlain’s MyQ technology is great for opening and closing your garage door remotely with your smartphone, but you can also receive alerts whenever your garage door opens and closes (as well as receive alerts when it’s been open for an extended amount…

踏實工作,實現價值

工作,為實現自我價值 若想在漫長的職場生涯中穩步高升,首先要踏踏實實,專心致志、充滿激情的去完成工作中的每一項任務,無論工作是繁重的還是瑣碎的,都要嚴格要求自己全身心的去完成。而不是一味的抱怨,一味…

mac 防火墻禁止程序聯網_如何允許應用程序通過Mac的防火墻進行通信

mac 防火墻禁止程序聯網If you use a Mac, chances are you might not even realize that OS X comes with a firewall. This firewall helps ensure unauthorized app and services can’t contact your computer, and prevents intruders from sniffing out your Mac on a ne…

WPF-22 基于MVVM員工管理-02

我們接著上一節,這節我們實現crud操作,我們在EmployeeViewMode類中新增如下成員,并在構造函數中初始化該成員code snippetpublic EmployeeViewMode() {employeeService new EmployeeService();BindData();Employee new Employee();AddComma…

linux 3

-- Linux -- 開心的一天 vi   所有的 unix like 系統都會內置 vi 文本編輯器 vim  較多使用的,可以主動的以字體顏色辨別語法的正確性,方便程序設計 vi/vim 的使用 -- 命令模式(Command mode) 輸入模式(Insert mode&#x…

從零開始搭建一個簡單的ui自動化測試框架02(pytest+selenium+allure)

二、先搭一個架子 在我還是小白連py語法都不太熟悉的時候,經常在網上看關于自學ui自動化測試的博客,最熟悉的套路莫過于先給你介紹一下selenium的各個api,然后寫一套代碼去登陸微博或者百度什么的,但我今天不愿意這么寫&#xff0…

DML語言DDL

DML(data manipulation language): 它們是SELECT、UPDATE、INSERT、DELETE,就象它的名字一樣,這4條命令是用來對數據庫里的數據進行操作的語言 。 DDL(data definition language): D…

什么是Adobe Lightroom,我需要它嗎?

Adobe Photoshop Lightroom confuses a lot of new photographers. It has Photoshop in the name, but it isn’t Photoshop? What gives? Adobe Photoshop Lightroom使許多新攝影師感到困惑。 它的名稱是Photoshop,但不是Photoshop嗎? 是什么賦予了&…

jquery中的serializeArray方法的使用

轉載于:https://blog.51cto.com/11871779/2359556

新冠病毒中招|第一天

感染新冠病毒后具體如何治療,需要根據感染者病情輕重情況而定,嚴重的要聽醫生的。昨天是我個人感染奧密克戎毒株第一天,今天跟大家分享一下我的情況。我昨天感覺渾身無力,也有點發燒37.9,我就吃了感冒藥睡了一上午&…

機器學習(一)—— 線性回歸

機器學習(一)—— 線性回歸 目錄 0. 回歸(Regression)的由來 1. 回歸關系 2. 線性回歸的整體思路 (1)根據數據提出假設模型 (2)求解參數 1)梯度下降法 2)正規…

Java EE啟示錄

前言 最近的這段時間一直在學習Java EE,剛剛完成了從0到1的蛻變,所以順便整理一下我所了解到的Java EE,給剛入門學習的新人一些頭緒,而所謂“啟示錄”,就是這個意思。 一.Java EE是什么? Java EE&#xff0…

又到年末“團建”!某企業員工吐槽:這真是一場噩夢……

這是頭哥侃碼的第270篇原創2022年即將結束,很多公司又到了一年一度的年末團建。前天晚上,之前的同事找我聊天,說他們公司因為最近疫情的原因,準備把年末“團建”放到春節后進行。但是計劃的時間是2月份的某個周末,并且…

天梯 L2 這是二叉搜索樹嗎?

L2-004 這是二叉搜索樹嗎? (25 分)一棵二叉搜索樹可被遞歸地定義為具有下列性質的二叉樹:對于任一結點, 其左子樹中所有結點的鍵值小于該結點的鍵值;其右子樹中所有結點的鍵值大于等于該結點的鍵值&#xf…

三星筆記本進入BIOS后找不到U盤啟動項/快速啟動鍵F12沒有反應

分析:BIOS開啟了 Fast Bios Mode 解決方法: 開機按F2進入BIOS設置,選擇Advanced菜單下Fast Bios Mode,設置為 Disabled,按F10鍵保存退出,重啟時按F12鍵即可進入快速啟動界面選擇。或按F2進入BIOS設置&#…

IP別名與多網卡綁定(RHEL5/RHEL6)

RHEL6的網絡管理與RHEL5的有比較大的改變。雖然在RHEL5、6中均安裝有NetworkManager,在RHEL5中2、3、4、5級別中默認是不啟用的。但在RHEL6中,默認是啟用的,NetworkManager會一直監控網卡狀態,修改網卡參數立即生效不用重啟服務。…

基于.NetCore開發博客項目 StarBlog - (25) 圖片接口與文件上傳

1前言上傳文件的接口設計有兩種風格,一種是整個項目只設置一個接口用來上傳,然后其他需要用到文件的地方,都只存一個引用ID;另一種是每個需要文件的地方單獨管理各自的文件。這倆各有優劣吧,本項目中選擇的是后者的風格…

pta7-7旅游規劃(dijkstra算法)

題目鏈接:https://pintia.cn/problem-sets/1101307589335527424/problems/1101314114762387456 題意:給n給城市,m條公路,公路是雙向的,起點S,終點D,并給出每條公路連接的兩個city的編號以及路費…

context:annotation-config vs context:component-scan

<context:annotation-config> 用來注入已經在上下文注冊的bean&#xff0c;無論bean是定義在XML中還是被 package scanning。 <context:component-scan>僅scans packages 去注冊應用上線文中的Bean。 example&#xff1a; Lets start with a basic setup of three …

Cactiz中文版安裝使用

#----------------------------------------------------------# # > 紅色字體 -特指煮酒個人所見。加粗則為需要重點注意。 ## > 藍色加粗 -特指與本文相關人員&#xff0c;包括參與修正的朋友。 ## > 煮酒品茶 -Http://cwtea.blog.51cto.com # #----------…