[No0000178]改善C#程序的建議1:非用ICloneable不可的理由

好吧,我承認,這是一個反標題,實際的情況是:我找不到一個非用ICloneable不可的理由。事實上,接口ICloneable還會帶來誤解,因為它只有一個Clone方法。

我們都知道,對象的拷貝分為:淺拷貝和深拷貝。ICloneable僅有一個Clone方法使我們無法從命名的角度去區分到底是哪個拷貝。

淺拷貝:將對象的字段復制到副本(新的對象)中,同時將字段的值也賦值過去,但是引用類型字段只復制引用,而不是引用類型本身。這意味著,源對象引用類型字段的值改變了,會影響到副本中對應的值也改變;

深拷貝:將對象的字段復制到副本(新的對象)中,無論是值類型還是引用類型字段,都會復制類型本身及類型的值。這意味著,源對象引用類型字段的值改變了,不會影響到副本中對應的值;

于是問題來了,如果類型繼承了ICloneable接口,那么類型中的Clone是淺拷貝還是深拷貝。微軟的解釋是:你既可以在Clone方法中實現淺拷貝,也可以實現深拷貝。那么,為什么不直接提供兩個方法呢?比如:DeepClone或者ShallowClone。還是,一般類型的創建,只要實現了淺拷貝就不需要再實現深拷貝(或者反之),所以我們沒有必要提供兩個方法。

下面是一個既實現了淺拷貝也實現深拷貝的例子:

復制代碼
代碼
[Serializable]
class?Employee : ICloneable
{
publicstring?IDCode {?get;?set; }
publicint?Age {?get;?set; }
public?Department Department {?get;?set; }

#region?ICloneable 成員

publicobject?Clone()
{
returnthis.MemberwiseClone();
}

#endregion

public?Employee DeepClone()
{
using?(Stream objectStream?=new?MemoryStream())
{
IFormatter formatter?=new?BinaryFormatter();
formatter.Serialize(objectStream,?this);
objectStream.Seek(0, SeekOrigin.Begin);
return?formatter.Deserialize(objectStream)?as?Employee;
}
}

public?Employee ShallowClone()
{
return?Clone()?as?Employee;
}
}
復制代碼

實際上,ICloneable還帶來一個問題(該問題Bill Wagner在Effcitive c#中曾經論述過),那就是:如果類型繼承自ICloneable,但是同時它不是一個Sealed類型的話,它們的子類的默認Clone方法會帶來BUG(子類的Clone方法會返回父類的副本,而不是子類本身)。這會逼迫所有的子類都重寫Clone方法;

ICloneable的Clone方法的另一個問題是:它不是類型安全的,它返回的是Object,使用它的時候還設計到轉型的問題,而我們自己實現的Clone方法卻可以規避掉這個問題(如上文代碼)。

綜上所述,類型確實沒必要繼承ICloneable接口,如果類型本身需要實現拷貝功能,直接公開方法就行。如果在應用中你覺得確實必須實現這個接口的,來指正我吧。

轉載于:https://www.cnblogs.com/Chary/p/No0000178.html

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

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

相關文章

uniapp網絡請求獲取數據_2.uni-app 發起網絡請求

## uni.request(OBJECT)發起網絡請求。**OBJECT 參數說明**![](https://box.kancloud.cn/a90bf284df069eddde4019c04db7d627_861x475.png)**success 返回參數說明**![](https://box.kancloud.cn/10d44a6d100bb3833b22f2d41e85d8eb_861x165.png)**data 數據說明**最終發送給服務…

SOM 的兩種算法

我參考了這篇文章http://www.scholarpedia.org/article/Kohonen_network另一個很好的演示在這里http://www.math.le.ac.uk/people/ag153/homepage/PCA_SOM/PCA_SOM.htmlSOMt是訓練步一個輸入數據是n維向量待訓練的是一堆節點,這堆節點之間有邊連著,通常是…

python集合的兩種類型_python 入門之 – 集合類型(十九)

在python中,集合是一個無序的,不重復的數據組合,他的主要工作如下:1、去重,把一個列表變成集合,就自動去重了2、關系測試,測試兩組數據之間的交集、差集、并集等關系我來舉個例子,前…

計算機數值計算的相關文章,數值計算論文.doc

數值計算論文PAGE \* MERGEFORMAT 13高斯消去法在電路分析中的應用—利用計算機求解一些復雜電路的參數雷嘉豪電子信息工程學院自動化一班100401102摘 要求解線性代數方程組的數值方法有很多,但歸納起來,可分為兩類:一種是直接法,…

bzoj 2756奇怪的游戲

2756: [SCOI2012]奇怪的游戲 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 2571 Solved: 685[Submit][Status][Discuss]Description Blinker最近喜歡上一個奇怪的游戲。 這個游戲在一個 N*M 的棋盤上玩,每個格子有一個數。每次 Blinker 會選擇兩個相鄰的格子&…

秒懂,Java 注解 (Annotation)你可以這樣學

轉自: https://blog.csdn.net/briblue/article/details/73824058 文章開頭先引入一處圖片。 這處圖片引自老羅的博客。為了避免不必要的麻煩,首先聲明我個人比較尊敬老羅的。至于為什么放這張圖,自然是為本篇博文服務,接下來我自會說明。好了…

Java技術中的三大特性

為什么80%的碼農都做不了架構師?>>> 1.虛擬機 Java虛擬機JVM(Java Virtual Machine)在Java編程里面具有非常重要的地位,約相當…

matlab圖像增強分段線性函數_圖像增強、銳化,利用 PythonOpenCV 來實現 4 種方法!...

圖像增強目的使得模糊圖片變得更加清晰、圖片模糊的原因是因為像素灰度差值變化不大,圖片各區域產生視覺效果似乎都是一樣的, 沒有較為突出的地方,看起來不清晰的感覺解決這個問題的最直接簡單辦法,放大像素灰度值差值、使圖像中的…

python多人聊天室_Python基于Socket實現簡易多人聊天室

前言套接字(Sockets)是雙向通信信道的端點。 套接字可以在一個進程內,在同一機器上的進程之間,或者在不同主機的進程之間進行通信,主機可以是任何一臺有連接互聯網的機器。套接字可以通過多種不同的通道類型實現:Unix域套接字&…

計算機考研保護一志愿,考研良心大學,保護一志愿的考研名校!

大家好,我是,今天胖胖要跟大家送一些重要的干貨,就是對于選學校的小伙伴來說也好,或者是即將要參加研究生復試的小伙伴們來好胖胖在這里要跟大家說一個關于考研白名單的事情,因為大家都知道考研是會分黑名單和白名單&a…

python變量輸出到文件_使用函數將多個變量寫入文件

首先,要獲得當前正在執行的腳本名,或者更確切地說是調用函數的模塊,必須從堆棧跟蹤中獲取它。globals()-它將在writeToValues()函數的相同上下文中執行,因此它不會從“調用者”接收globals()。要糾正這種情況,您可以使…

嵌入式linux系統移植的四大步驟_嵌入式系統移植步驟

在嵌入式系統移植中重要的一部分是操作系統的移植,與其它操作系統相比,Linux大的特點:它是一款遵循GPL的操作系統,我們可以自由地使用、修改、和擴展它。正是由于這一特色,嵌入式系統移植過程中Linux系統受到越來越多人…

sdn框架的計算機網絡管理,清華SDN實踐--SDN 系統架構與數據中心應用

清華大學在SDN 的系統架構以及其在數據中心網絡中的應用方面展開了深入研究,主要研究成果包括:1. 以數據為中心的軟件定義網絡架構 SODA(Software Defined Data Centric Networking)。與 OpenFlow 相比,SODA 大大增強了數據層面的處理能力&am…

《軟件工程》課之-調查問卷的心得體會

1.這次調查是艱辛的。 2.很多人都誤以為我在發小廣告。。 3.很多人都不認識俄羅斯方塊1010這個游戲。 4.大家對于游戲的見解千奇百怪。 5.題目出的不是很完美,下次改進。。 6.簡單分析下結果,男孩子都喜歡多人的游戲,女孩的喜歡的多種多樣&am…

python循環語句for求和_for循環簡介

## for循環簡介for循環可以用來遍歷某一對象(遍歷:通俗點說,就是把這個循環中的第一個元素到最后一個元素依次訪問一次)。for循環的基本結構如下:![](https://img.kancloud.cn/75/33/753371a9536ed9eeb159074482ec85f0_558x174.png)說明&…

華為備份歷史版本_華為手機NAS備份時提示“需處于同一局域網”的解決方法

本內容來源于什么值得買APP,觀點僅代表作者本人 |作者:噩夢飄雷創作立場聲明:在使用華為手機向群暉NAS中備份時發現一直無法成功,經過一番研究找到了解決方案,希望能幫到大家~前言最近看了一位老哥的帖子&a…

計算機系統集成難點,企業MES實施中存在的難點及建議

MES是企業生產管理服務的核心信息化系統。實施MES是為了將現代企業生產管理思想、理念引入企業生產管理,對企業生產管理流程進行重組和優化,促進企業生產管理水平的提高。可是作用如此大的MES系統在實施過程中能一路無阻嗎?MES系統的作用1.車…

【原創】自己編寫的JavaGUI一鍵生成(hibernate/spring/mvc/maven)工具(附帶視頻教程源碼)...

為什么80%的碼農都做不了架構師?>>> 帶項目源碼(https://git.oschina.net/qsyan/GeneratorFx) app下載地址(附帶視頻教程):http://download.csdn.net/detail/juyan2008/9769406 注明:此應用采用javafx編寫…

2018-2019 20165203 《信息安全系統設計基礎》第一周學習總結

2018-2019-1 20165203 《信息安全系統設計基礎》第一周學習總結 教材學習內容總結 編譯:gcc [選項] [文件名]選項參數表 參數對應功能-E僅執行編譯預處理-S將.c代碼轉換為匯編語言代碼-c僅執行編譯操作,不進行連接操作-o指定生成的輸出文件-I (大寫)指定…

普通計算機怎么算根號_大學專業介紹 | 計算機專業的真實就業情況

前兩天給大家簡單介紹了近些年比較火的計算機類相關專業具體都有哪些不同,以及就業時的行業或者崗位的側重點。今天呢我們繼續這個話題,來聊一聊整個計算機相關專業在學習和就業過程中大概是什么樣子的,希望能夠給大家提供一些實實在在的參考…