C#中List泛型集合引用問題(深度拷貝)
阿新 • • 發佈:2019-01-25
List 集合引用問題
這段時間公司有個Silverlight專案要加幾個報表模組,之前從未接觸過這個叫“銀光”的東西,之前在學校也是做的Net,迫於無賴就接手了,說說這個把月的心得以及遇到的問題。
首先說下什麼是Silverlight,官網的解釋是:Microsoft Silverlight 是一個跨瀏覽器、跨平臺的 .NET Framework 實現,用於生成 Web、桌面和 Windows Phone 的媒體體驗和豐富互動式應用程式。我個人的理解是:
- Silverlight類似一種B/S架構的東西,只不過它能在瀏覽器上跑起來而已(在IE上按F12後DOM元素無法選中)
- Silverlight提供一系列的控制元件(DataGrid,Button,Label……等這些東西)
- Silverlight最常用的佈局是Grid佈局
- Silverlight後臺語言用的是C#
- Silverlight現在好像只能在IE上用(好像停止維護了)
公司這老專案用的最多的東西就是:匿名委託,Http非同步請求,Lambda表示式,Linq(這些東西還是蠻有用的,也是C#語言強悍的地方,有興趣可以看看看)
廢話就說到這兒了,現在是我遇到的問題:
一. 值傳遞和引用問題
程式碼塊
List<T> oldList = new List<T>();
oldList.Add(..);//新增元素
List<T> newList = new List<T>(oldList);
如果說T是值型別,那麼oldList和newList是兩個物件;如果說T是物件(如自己定義的實體類),那麼就會出現問題,更改oldList集合的實體物件,newList集合也會更改。(我遇到的問題是:程式初始化的時候會給oldList賦值,這個原始值是為了還原用的,newList是使用者對oldList集合修改後的集合,後面就不用說了,我自己也是夠逗逼的…….)
解決辦法
public static IList<T> Clone<T>(this IList<T> listToClone) where T: ICloneable
{
return listToClone.Select(item =>(T)item.Clone()).ToList();
}
說明
ICloneable介面中含有一個Clone的方法,可以建立作為當前例項副本的新物件。