Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.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
Vb.net 通过引用传递添加到列表中的列表是否是预期行为?_Vb.net_List_Byref - Fatal编程技术网

Vb.net 通过引用传递添加到列表中的列表是否是预期行为?

Vb.net 通过引用传递添加到列表中的列表是否是预期行为?,vb.net,list,byref,Vb.net,List,Byref,我在使用列表时注意到了一些东西。如果我有一个List(Of String)和List(Of List(Of String))的话,当我把List(Of String)添加到List(Of List(Of String))中时,字符串列表会通过引用传递 例如,在以下代码中: Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click Dim listRow As New List(Of

我在使用列表时注意到了一些东西。如果我有一个
List(Of String)
List(Of List(Of String))
的话,当我把
List(Of String)
添加到
List(Of List(Of String))
中时,字符串列表会通过引用传递

例如,在以下代码中:

Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click

    Dim listRow As New List(Of String)
    Dim listTable As New List(Of List(Of String))

    listRow.Add("Apple")
    listRow.Add("Red")

    listTable.Add(listRow)

    MsgBox(listTable(0)(0))
    MsgBox(listTable(0)(1))

    listRow(0) = "Banana"
    listRow(1) = "Yellow"

    MsgBox(listTable(0)(0))
    MsgBox(listTable(0)(1))

End Sub
第一对消息将显示“苹果”和“红色”。然后,在更新listRow之后,它将显示“香蕉”和“黄色”。对我来说,这意味着列表是通过引用而不是通过值添加的。我正在寻找对这一点的确认,如果有更好的解释,也许还有更好的解释

我就是这样处理的:

Sub AddListItemToMainList(myListRow As List(Of String), myListTable As List(Of List(Of String)))

    Dim newList As New List(Of String)

    newList.Add(myListRow(0))
    newList.Add(myListRow(1))

    myListTable.Add(newList)

End Sub
然后用
AddListItemToMainList(listRow,listTable)
替换
listTable.Add(listRow)
。显然,我的代码不是很动态,我正在硬编码第一个和第二个元素,但我现在只是在测试,以获得正确的逻辑和其他东西


如果有更优雅的解决方案,我会随时听取建议。

listTable.Add(新列表(字符串)(listRow))
@Jimi这肯定是一个更优雅的解决方案。也许吧。不过,这是完全一样的。重要的是取消对原始列表的引用。有时,如果它更可见,则更好。类类型的对象总是通过引用传递(即使它们是标识为
ByVal
的参数;令人困惑的是,这意味着引用是通过值传递的,因此不能在调用方中重定目标,而不是对象本身是通过值传递的)。@Craig,Class:Type类型的对象是且不知道,找出对象是否属于该类的最简单方法是什么?
listTable.Add(新列表(字符串)(listRow))
@Jimi这肯定是一个更优雅的解决方案。也许吧。不过,这是完全一样的。重要的是取消对原始列表的引用。有时,如果它更可见,则更好。类类型的对象总是通过引用传递(即使它们是标识为
ByVal
的参数;令人困惑的是,这意味着引用是通过值传递的,因此不能在调用方中重定目标,而不是对象本身是通过值传递的)。@Craig,Class:Type类型的对象是且不知道,找出对象是否属于该类的最简单方法是什么?