最近踩到一個legacy code 在C#物件複製的陳年小雷,拆解炸彈的同時也寫筆記!
有時我們會在類別(class)中加入Object.MemberwiseClone方法來提供物件的複製(clone),舊程式使用新物件裡的屬性剛好都是用new關鍵字建立,大概像下面的方式使用屬性:
p2.IdInfo = new IdInfo(17);
很幸運一直沒發生參考問題,最近改用直接指派,類似下面的寫法:
p2.IdInfo.IdNumber = 17;
測試時大驚!原始物件p1的值竟然被覆蓋了,花了時間才發現自己對MemberwiseClone的定義不夠清楚。