2

以下のコードで私の質問が明確になると思います。それらが両方とも値を渡す場合、なぜそれらは異なるのですか。

以下の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を返します。

食い違いがわかりません。

4

3 に答える 3

7

foreachループと通常のループの違いがわかりforます。
Javaコードは、ローカルitem変数のみを割り当てます。実際にはリストを変更しません。

と書くgoods.set(i, 23)と、リストが変更されます。

于 2012-10-29T00:48:39.807 に答える
5

「不一致」は、値の受け渡しとは何の関係もありません。Javaで別の種類のループを使用しています。これは、リストが変更されていないループです。だから違いがわかります。

Javaループをfor (int i = 0 ... )種類に置き換えるか、C#ループをに置き換える場合foreach、2つのプログラムに違いはありません。実際、ループ変数の割り当ては非常に一般的なエラーであるため、C#プログラムはコンパイルされません。

    foreach(int item in list)
    {
        item = 23; // <<=== This will not compile in C#
    }
于 2012-10-29T00:48:59.010 に答える
1

どちらの場合も、リストは参照によって渡されます。ただ、でも

for(int item: goods)
{
    item = 23;
}

リストからアイテムへの参照を抽出しませんが、それを変数にコピーします。x=list[i]の後にx=23を記述した場合、C#でも同じようになります。使用する必要があります

for(int i=0;i<goods.size() )
{
    goods.set(i, 23);
}
于 2012-10-29T00:54:50.493 に答える