2010-05-18 81 views
2

我想知道,我真的不確定,但幫助我在​​這裏。從列表中選擇它後,對象仍然鏈接(引用)?

如果您有一個List項目,並且有一個對象需要更改它的一個屬性。假設myClass有一個字符串屬性「status」。我在尋找一個for循環我的列表,並讓我的對象,所以我做

myClass item = items[i]; 

,如果我想改變「身份」屬性,我這樣做,例如:

item.Status = "new status"; 

我的問題/問題是這樣的:爲「項目」仍掛列表項的,所以如果我執行上面的線,將在列表中也改變了,而不必設置此:

items[i] = item; 

希望這很清楚。

在此先感謝。

回答

0

代碼item.Status = "new status";將改變列表項

items[i]指向一個MyClass的對象。

當你說myClass item = items[i];時,它被itemitems[i]引用。

所以當你改變這樣item.Status = "new status";你實際上你myClass的對象,現在有兩個名字itemitems[i]更改的屬性之一。您可以使用item[i].Status = "new status";。兩者都做同樣的工作。

設置items[i] = item;沒有效果,因爲兩者都已經引用同一個對象。

2

是的,你正在改變列表中的項目。您不需要再次將其分配給列表。

+0

是什麼讓這種情況發生? – Terry 2010-05-18 11:56:35

+0

假設myClass確實是一個類而不是結構體:-) – 2010-05-18 11:57:16

+0

@Jakob:即使它是一個結構體,它也是如此,只要它不是不可變的。 – 2010-05-18 12:49:29

3

這兩個列表和item變量都有引用到實際的對象。您對該對象所做的任何更改都可以通過任一參考進行查看。

換句話說......假設你翻閱電話簿,並選擇一個特定的地址。您將地址複製到一張紙上,然後在那裏開車。然後你把房子塗成紅色。現在,任何在電話簿中查找相同地址的人都會看到紅房子,即使他們沒有看到您的紙張。

看看我的article about value types and reference types瞭解更多信息。

(這是所有假設myClass真的是一類,順便說一句。)

2

是的,如果myClass是一類顧名思義(而不是一個結構),它是一個reference type。因此,當您編寫myClass item = items[i];時,它不會被複制。 item僅僅是對items[i]引用的同一對象的引用。

相關問題