1. 程式人生 > >C#中List泛型集合引用問題(深度拷貝)

C#中List泛型集合引用問題(深度拷貝)

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的方法,可以建立作為當前例項副本的新物件。