轉殖 淺表副本與深層副本

2021-07-15 14:42:10 字數 1254 閱讀 8475

轉殖

當將乙個引用變數賦值紿另外乙個引用變數時,只是簡單地建立了指向同乙個物件的第二個引用。如果要製造乙個物件的副本,你就需要某種機制來建立同乙個類的新例項,並且基於原來物件的狀態初始化該例項。object.memberwiseclone方法就是做這件事情的;然而,它不是乙個公有辦法。更進一步說,如果物件要想支援轉殖( cloning),往往需要實現system.icloneable介面,該介面有乙個方法clone:

namespace system 

memberwiseclone方法執行的是淺表副本(shallow copy),這意味著它只是將原物件的每個欄位的值拷貝到轉殖體中。如果欄位是乙個物件引用,那麼,拷貝的僅僅是這個引用.而不是引用的物件。下面的類使用

淺表副本

實現了icloneable介面:

pulic sealed class marriage:system.icloneable }

圖5.9是淺表副本的結果。

深層副本

(deep copy)是指遞迴拷貝其字段所引用的所有物件,如圖5.10所示。深層副本經常是人們所期望的;但它不是預設的行為,並且在一般情形下實現深層副本也不是好主意。深層副本除了會引起額外的記憶體活動和資源消耗之外,當物件層次結構( a graph of objects)出現環路時,深層副本還會出現問題,其原因是遞迴有可能陷入無限迴圈。不過,對於簡單的物件層次結構,它全少是可以實現的,如下例5.8所示。

示例5.8 實現system.icloneable介面

public sealed class marriage:system.icloneable;

result.b=(person);

return result; }

}在示例5.8中,clone的實現居然可以不呼叫memberwisclone方法。乙個可供選擇的實現就是簡單地使用new操作符例項化第二個物件,並且手動產生它的字段。此外你還可以定義乙個私有建構函式,使這兩個部分(例項化和初始化)合併成一步。示例5.9就是這樣一種實現。

示例5.9  使用關鍵字new實現system.icloneable介面

public sealed class marriage:system.icloneable

public object clone() }

C List轉殖複製副本及比較是否相等

在程式設計中時常遇到想要去操作某個list集合而又不想破壞原有list的情況。如果僅僅是新建乙個新list,將舊list的值賦值給新list的話,改變複製後的list,那麼原有的list也會變化,並沒有起到備份原始資料的作用,對於沒有巢狀的list,可以採用遍歷重新賦值的方法去賦值 傳遞的是值型別,...

訊息軌跡 ACL 與多副本搭建

訊息軌跡含義 一條訊息什麼時候由哪台機器產生的 傳送的耗時 訊息大小 傳送狀態 儲存在哪個 broker 上 什麼時候儲存的以及儲存在哪台 broker 上 什麼時候消費的 消費狀態等資訊,這些資訊即訊息軌跡,用於追蹤訊息從誕生到被消費的整個生命週期。這些資訊對於業務同學排查定位有著重要的意義,傳送...

kafka入門之broker 副本與ISR設計

kafka把分割槽的所有副本均勻地分配到所有broker上,並從這些副本中挑選乙個作為leader副本對外提供服務,而其他副本被稱為follower副本,只能被動地向leader副本請求資料,從而保持與leader副本的同步 所謂isr,就是kafka集群動態維護的一組同步副本集合,每個topic分...