提问人:Brian Webster 提问时间:10/25/2009 更新时间:10/27/2009 访问量:421
.NET 容器 - 何时成员按引用、按值?
.NET containers - when are members By Reference, By Value?
问:
我在编码企业中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 中的原始条目将被修改。
但是,我遇到过这样的情况,我认为某些东西是参考的,而且是按价值的。
项目是始终通过引用添加到容器中,还是有时按值添加?
我很困惑。
答:
您可以使用此规则:如果可以将 null 赋值到 object 中,则它将通过引用传递。否则,它将按值传递。
此规则的例外是可为 null 的类型和结构。它们总是按值传递。
这真的不是“按参考”或“按价值”的情况。将复制传递给 Add 方法的值。但是,对于引用类型,该值是对对象的引用 - 如果通过对该对象的其他引用来操作该对象,则无论对对象进行何种操作,都可以看到这些更改。
如果您看到数据本身的独立副本,则表明您正在使用值类型...但是,如果您要进行更改,则表明您使用的是可变值类型,这是一个坏主意。值类型几乎总是不可变的,否则会导致很多混淆。(引用类型也可以是不可变的 - string 就是一个很好的例子。
有关引用类型和值类型的详细信息,请参阅我关于引用和参数的文章。它们是从 C# 角度编写的,但基础知识也适用于 VB。
我认为,一旦您了解了值类型值和引用之间的区别,集合对您来说将更有意义。
我认为这取决于物品的类型。不在集合中。
例如:
int[] ints = 新 int[10];
整数[0] = 1;//-)
在本例中,只要 1 是 ValueType,就会被复制。
评论