Java和C#通过值差异传递

时间:2012-10-29 00:46:07

标签: c# java

我认为下面的代码会让我的问题清楚。如果他们都通过价值,为什么他们不同。

以下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。

我不明白这种差异。

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