我认为下面的代码会让我的问题清楚。如果他们都通过价值,为什么他们不同。
以下C#:
static void Main(string[] args)
{
var list = new List<int> {1, 2, 3,};
ChangeVars(list);
foreach (var i in list)
{
Console.WriteLine(i);
}
Console.Read();
}
private static void ChangeVars(List<int> list)
{
for(int i = 0; i < list.Count; i++)
{
list[i] = 23;
}
}
返回23,23,23,
下面的Java:public static void main(String[] args)
{
List<Integer> goods = new ArrayList<Integer>();
goods.add(1); goods.add(2); goods.add(3);
ChangeThings(goods);
for(int item: goods)
{
System.out.println(item);
}
}
private static void ChangeThings(List<Integer> goods)
{
for(int item: goods)
{
item = 23;
}
}
返回1,2,3。
我不明白这种差异。
答案 0 :(得分:7)
您看到foreach
循环和常规for
循环之间存在差异
您的Java代码仅分配本地item
变量;它实际上并没有修改列表。
如果你写goods.set(i, 23)
,你将修改列表。
答案 1 :(得分:5)
&#34;差异&#34;与价值传递无关。您在Java中使用了一种不同类型的循环,即未修改列表的循环。这就是你看到差异的原因。
如果用for (int i = 0 ... )
类替换Java循环或用foreach
替换C#循环,则两个程序之间不会有任何差异。实际上,C#程序不会编译,因为分配循环变量是一个非常常见的错误:
foreach(int item in list)
{
item = 23; // <<=== This will not compile in C#
}
答案 2 :(得分:1)
在这两种情况下,列表都通过引用传递。只是,但是
for(int item: goods)
{
item = 23;
}
不会从列表中提取对项目的引用,而是将其复制到变量中,如果写入x = list [i],则x = 23,您将在C#中获得相同的内容。 你必须使用
for(int i=0;i<goods.size() )
{
goods.set(i, 23);
}