[TestMethod]public void TestMethod1(){ List<int> list = new List<int>(); Test(list); Console.WriteLine(list.Count()); // 總數量變為 1}private void Test(List<int> list){ list.Add(1);}
可以發現:經過 Test 後,list 的元素數量由 0 變為 1 了。
如果是把變數 list 賦給另一個變數 list2,操作 list2 的話 list 也會跟著變。
這是因為這些變數實際上是指向另一個記憶體塊的,對元素數量、元素值的改變都是改變的對應的同一個記憶體塊。
但是調用他們的 ConvertAll 方法,返回的變數,就是指向另一個記憶體塊了,就與前面的不同了。
[TestMethod]public void TestMethod1(){ List<int> list = new List<int>(); Test(list); Console.WriteLine(list.Count()); // 總數量仍為 0}private void Test(List<int> list){ List<int> list2 = new List<int>(); list2.Add(1); list = list2;}
以上代碼就不同了,這是 list = list2,實際上將 list 指向了 list2 對應的記憶體塊,根據前面的結論,此時參數中的 list 跟 list2 是一夥的了,而不是和 TestMethod1 中的 list 的一夥。
以下代碼就不同了,但現在實際上建立了兩個 new List<int>(),在 TestMethod1() 中沒人再用它了。
[TestMethod]public void TestMethod1(){ List<int> list = new List<int>(); Test(ref list); Console.WriteLine(list.Count()); // 總數量變為 1}private void Test(ref List<int> list){ List<int> list2 = new List<int>(); list2.Add(1); list = list2;}
數組也是一樣的道理。