【问题标题】:.NET containers - when are members By Reference, By Value?.NET 容器 - 什么时候是按引用、按值的成员?
【发布时间】:2009-10-25 07:42:04
【问题描述】:

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

但是,我遇到过一些情况,我认为某些东西是通过引用,而它是通过值。

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

我很困惑。

【问题讨论】:

  • 你应该告诉我们一些关于分享按价值的“情况”。您的 MyArray 示例是正确的。

标签: .net vb.net list queue containers


【解决方案1】:

这不是真正的“按引用”或“按值”的情况。您传递给 Add 方法的值被复制。但是,对于引用类型,该值是对对象的 reference - 如果您通过对它的其他引用来操作该对象,那么无论您如何访问该对象,您都将能够看到这些更改。

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

有关引用类型和值类型的更多信息,请参阅我关于 referencesparameters 的文章。它们是从 C# 的角度编写的,但基本原理也适用于 VB。

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

【讨论】:

  • 错字?它应该是“引用类型也可以是IM可变的——字符串就是一个很好的例子”
【解决方案2】:

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

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

【讨论】:

【解决方案3】:

我认为这取决于项目的类型。不在收藏上。

例如:

int[] ints = new int[10];

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多