Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NET容器-何时按引用和值定义成员? 我在我的编码项目中迁移了C++和VB.NET之间的关系…在VB.NET中,它偶尔会导致关于什么是按值还是按引用的混淆_.net_Vb.net_List_Queue_Containers - Fatal编程技术网

.NET容器-何时按引用和值定义成员? 我在我的编码项目中迁移了C++和VB.NET之间的关系…在VB.NET中,它偶尔会导致关于什么是按值还是按引用的混淆

.NET容器-何时按引用和值定义成员? 我在我的编码项目中迁移了C++和VB.NET之间的关系…在VB.NET中,它偶尔会导致关于什么是按值还是按引用的混淆,.net,vb.net,list,queue,containers,.net,Vb.net,List,Queue,Containers,比如说,我有一个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 然后 在上述情况下,我相信一切都是参考的。如果我从“MyTable”中提取一个条目并修改其MyObject成员,我认为My

比如说,我有一个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
然后

在上述情况下,我相信一切都是参考的。如果我从“MyTable”中提取一个条目并修改其MyObject成员,我认为MyArr中的原始条目将被修改

然而,我也遇到过这样的情况:我认为某个东西是通过引用的,而它是通过价值的

项目是否总是通过引用添加到容器中,或者有时是通过价值添加到容器中?


我很困惑。

您可以使用以下规则:若您可以将null赋值给对象,那个么它将通过引用传递。否则,它将按值传递


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

您可以使用以下规则:如果您可以将null赋值给对象,则它将按引用传递。否则,它将按值传递

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

这实际上不是“按引用”或“按值”传递。将复制传入Add方法的值。但是,对于引用类型,该值是对对象的引用-如果您通过对该对象的其他引用来操作该对象,则无论您如何访问该对象,都可以看到这些更改

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

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

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

这实际上不是“按引用”或“按值”的情况。将复制传入Add方法的值。但是,对于引用类型,该值是对对象的引用-如果您通过对该对象的其他引用来操作该对象,则无论您如何访问该对象,都可以看到这些更改

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

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


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

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

例如:

int[]ints=新的int[10]

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


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

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

例如:

int[]ints=新的int[10]

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


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

请不要混淆“按引用传递”和“按值传递引用”。请参阅,请不要将“按引用传递”与“按值传递引用”混淆。看,你应该告诉我们一些关于分享价值的“情况”。您的MyArray示例是正确的。您应该告诉我们一些共享是按价值进行的“情况”。你的MyArray示例是正确的。输入错误?应该是“引用类型也可以是不可变的-字符串就是一个很好的例子”打字错误?应该是“引用类型也可以是不可变的-字符串就是一个很好的例子”
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