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

.NET containers - when are members By Reference, By Value?

提问人:Brian Webster 提问时间:10/25/2009 更新时间:10/27/2009 访问量:421

问:

我在编码企业中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 中的原始条目将被修改。

但是,我遇到过这样的情况,我认为某些东西是参考的,而且是按价值的。

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

我很困惑。

。网 vb.net 列表 队列 器皿

评论

0赞 ℍ ℍ 10/25/2009
你应该告诉我们一些关于分享价值的“情况”。您的 MyArray 示例是正确的。

答:

2赞 Alex Reitbort 10/25/2009 #1

您可以使用此规则:如果可以将 null 赋值到 object 中,则它将通过引用传递。否则,它将按值传递。

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

4赞 Jon Skeet 10/25/2009 #2

这真的不是“按参考”或“按价值”的情况。将复制传递给 Add 方法的值。但是,对于引用类型,该值是对对象的引用 - 如果通过对该对象的其他引用来操作该对象,则无论对对象进行何种操作,都可以看到这些更改。

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

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

我认为,一旦您了解了值类型值和引用之间的区别,集合对您来说将更有意义。

1赞 Ilya Khaprov 10/25/2009 #3

我认为这取决于物品的类型。不在集合中。

例如:

int[] ints = 新 int[10];

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

在本例中,只要 1 是 ValueType,就会被复制。