C# List 参数传递时需要注意内部重新赋值不影响外部

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);
}

你可能感兴趣的