.NET容器 - 何时成员按引用,按值?

时间:2009-10-25 07:42:04

标签: .net vb.net list queue containers

我在编码企业中在C ++和VB.NET之间进行迁移......这导致偶尔会出现关于什么是有价值的东西或VB.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中的原始内容将被修改。

但是,我遇到了一些情况,我认为某些东西是参考的,而且它是有价值的。

项目是否总是通过引用添加到容器中,还是有时会按值添加?

我很困惑。

3 个答案:

答案 0 :(得分:4)

这不是“通过引用”或“按价值”的情况。传递给Add方法的值将被复制。但是,对于引用类型,value是对象的引用 - 如果通过对它的其他引用操作该对象,您将能够看到这些更改,但是到达对象。 / p>

如果您看到数据本身的独立副本,则表示您使用的是值类型...但如果您正在进行更改,则表明您正在使用 mutable 值类型,这是一个坏主意。值类型几乎总是不可变的,否则会导致很多混乱。 (引用类型也可以是不可变的 - 字符串是一个很好的例子。)

有关引用类型和值类型的详细信息,请参阅referencesparameters上的文章。它们是从C#角度编写的,但基础知识也适用于VB。

我认为一旦你理解了值类型值和引用之间的区别,集合就会对你更有意义。

答案 1 :(得分:2)

您可以使用此规则:如果您可以将null分配给对象,那么它将通过引用传递。否则它将按值传递。

此规则的例外是Nullable类型和结构。它们总是按价值传递。

答案 2 :(得分:1)

我认为这取决于物品的类型。不是收藏品。

E.g:

int [] ints = new int [10];

整数[0] = 1; // - )

在这种情况下,只要它是ValueType,就会复制1。