2012-10-29 103 views
2

我認爲下面的代碼將使我的問題清晰。如果它們都是有價值的,爲什麼它們是不同的。Java和C#通過價值差異

下面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

我不瞭解差異。

回答

7

您將看到foreach循環與常規for循環之間的區別。
您的Java代碼只分配本地item變量;它實際上並沒有修改列表。

如果您編寫goods.set(i, 23),您將修改列表。

+0

那麼,清理的事情吧。感謝所有爲你提供幫助的人。 –

5

「差異」與傳遞價值無關。您正在Java中使用不同類型的循環,該列表未被修改。這就是你看到差異的原因。

如果用for (int i = 0 ...)種類替換Java循環或將C#循環替換爲foreach,那麼這兩個程序之間就沒有區別。事實上,C#程序將無法編譯,因爲分配循環變量是一個很常見的錯誤:

foreach(int item in list) 
    { 
     item = 23; // <<=== This will not compile in C# 
    } 
1

名單是由於兩種情況下引用傳遞。只是,但

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

不提取從列表中的項目的參考,但其複製到一個變量,你會得到在C#相同的,如果你寫X =列表[我]其次爲x = 23 。 你必須使用

for(int i=0;i<goods.size()) 
{ 
    goods.set(i, 23); 
}