我在编码企业中在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中的原始内容将被修改。
但是,我遇到了一些情况,我认为某些东西是参考的,而且它是有价值的。
项目是否总是通过引用添加到容器中,还是有时会按值添加?
我很困惑。
答案 0 :(得分:4)
这不是“通过引用”或“按价值”的情况。传递给Add方法的值将被复制。但是,对于引用类型,value是对象的引用 - 如果通过对它的其他引用操作该对象,您将能够看到这些更改,但是到达对象。 / p>
如果您看到数据本身的独立副本,则表示您使用的是值类型...但如果您正在进行更改,则表明您正在使用 mutable 值类型,这是一个坏主意。值类型几乎总是不可变的,否则会导致很多混乱。 (引用类型也可以是不可变的 - 字符串是一个很好的例子。)
有关引用类型和值类型的详细信息,请参阅references和parameters上的文章。它们是从C#角度编写的,但基础知识也适用于VB。
我认为一旦你理解了值类型值和引用之间的区别,集合就会对你更有意义。
答案 1 :(得分:2)
您可以使用此规则:如果您可以将null分配给对象,那么它将通过引用传递。否则它将按值传递。
此规则的例外是Nullable类型和结构。它们总是按价值传递。
答案 2 :(得分:1)
我认为这取决于物品的类型。不是收藏品。
E.g:
int [] ints = new int [10];
整数[0] = 1; // - )
在这种情况下,只要它是ValueType,就会复制1。