2009-10-25 76 views
1

我在C++和VB.NET之間的編程冒險之間遷移...這會導致偶爾出現的混淆有關VB.NET中的值或引用的情況。.NET容器 - 什麼時候是成員通過引用,按值?

比方說,我有一個MyObject的數組,其中填充了一堆對象。

dim MyArr(5000) of MyObject 

現在讓我們說,從這個數組中的信息傳播遍及各種數據結構:

dim MyList as new List(of MyObject) 
for i as integer = 0 to 5000 step 1000 
    Mylist.add(MyArr(i)) 
next 

然後

dim MyTable as new HashTable 
dim i as integer = 0 
for each O as MyObject in Mylist 
    if i mod 2 = 0 then 
    MyTable.add(O.ToString(), O) 
    end if 
next 

在上述情況下,我相信一切是參考。如果我從「MyTable」中提取條目並修改其MyObject成員,我認爲MyArr中的原始文件將被修改。

但是,我遇到了一些情況,我認爲某些事情是通過引用而引起的,而且是有價值的。

項目是否總是通過引用添加到容器中,或者它們有時是按值添加的?

我很困惑。

+0

你應該告訴我們一些關於「價值共享」的情況。你的MyArray例子是正確的。 – 2009-10-25 07:49:30

回答

4

真的不是「引用」或「按價值」的情況。您傳遞給Add方法的值被複制。但是,對於參考類型,其值爲參考對象 - 並且如果通過其他引用操作該對象,則可以看到這些更改,但是您可以看到該對象。

如果你看到數據本身,即表明您使用的是值類型的獨立副本...但如果你正在做改變,那建議你使用可變值類型,這是一個壞主意。值類型幾乎總是不可變的,否則會導致很多混淆。 (引用類型也可以是不可變的 - 字符串就是一個很好的例子。)

有關引用類型和值類型的更多信息,請參見我的關於referencesparameters的文章。它們是從C#角度編寫的,但基本原理也適用於VB。

我認爲,一旦你理解了值類型值和引用之間的區別,集合將對你更有意義。

+0

謝謝,我會看看。 – 2009-10-25 07:50:47

+0

錯字?它應該是「引用類型可以是** IM **也可以變 - 字符串是一個很好的例子」 – MarkJ 2009-10-27 09:50:46

+0

@MarkJ:謝謝,修正:) – 2009-10-27 10:46:55

2

您可以使用此規則:如果您可以將null分配給對象,那麼它將通過引用傳遞。否則,它將通過值傳遞。

此規則的例外是Nullable類型和結構。它們總是以價值傳遞。

+0

請不要混淆「通過引用」和「按值傳遞引用」。請參閱http://pobox.com/~skeet/csharp/parameters.html – 2009-10-25 07:48:02

1

我認爲這取決於物品的類型。不在集合上。

例如:

int [] ints = new int [10];

ints [0] = 1; // - )

在這種情況下1將被複制,只要它是ValueType即可。

相關問題