protected void Page_Load(object sender, EventArgs e) { List<int> list1 = new List<int>(); List<int> list2 = new List<int>(); List<int> list3 = new List<int>(); List<int> list4 = new List<int>(); list1.Add(0); list2.Add(0); list3.Add(0); list4.Add(0); Change1(list1); Change2(list2); Change3(list3); Change4(list4); string result = ""; result += "list1.Count = " + list1.Count; // 3 result += "list2.Count = " + list2.Count; // 2 result += "list3.Count = " + list3.Count; // 1 result += "list4.Count = " + list4.Count; // 1 Response.Write(result); } private void Change1(List<int> list) { list.Add(1); list.Add(2); } private void Change2(List<int> list) { list.Clear(); list.Add(1); list.Add(2); } private void Change3(List<int> list) { list = new List<int>(); list.Add(1); list.Add(2); } private void Change4(List<int> list) { List<int> myList = new List<int>(); myList.Add(1); myList.Add(2); list = myList; }
如上,结果是:3、2、1、1
Change1、Change2 我们都容易想到,要注意的是 Change3、Change4 容易忽略,也就是说:new 一个,或者将其他对象赋给参数,都不会影响外部值。相当于内外就断开了。
Visual Studio 也帮我们侦测到了这点,建议我们改进,当我们鼠标移到参数上时,可以会获得提示:
像 Change3、Change4,如果我们确实想影响外部值,怎么办呢?
使用 AddRange,比如 Change4,我们可以改为:
private void Change4(List<int> list) { List<int> myList = new List<int>(); myList.Add(1); myList.Add(2); list.Clear(); list.AddRange(myList); }