【发布时间】:2022-01-24 02:00:30
【问题描述】:
在过去一周左右的时间里,我的代码遇到了问题,我一直在想弄清楚它有什么问题。我已经从我的主项目中提取并隔离了这个问题,但问题仍然不明显。
本质上,我有一个通常可以做很多事情的函数,但在这个示例中,它只更改了一个名为 FalseTable 的数组中的 1 个元素。现在,我已将此变量设置为 ByVal,这意味着原始变量(即:TrueTable)不应该改变,但是,它会改变!完整代码如下:
Dim TrueTable(7) As Char
Sub Main()
Dim FalseTable(7) As Char
For x = 0 To 7
TrueTable(x) = "T"
Next
For x = 0 To 7
FalseTable(x) = "F"
Next
Console.WriteLine("before")
For x = 0 To 7
Console.Write(TrueTable(x))
Next
Console.WriteLine()
Test(TrueTable)
Console.WriteLine("result")
For x = 0 To 7
Console.Write(TrueTable(x))
Next
Console.WriteLine()
Console.ReadLine()
End Sub
Function Test(ByVal FalseTable() As Char) As Char()
FalseTable(0) = "0"
Return FalseTable
End Function
现在,我以前认为是函数中“FalseTable”名称的重复,但是即使我将函数更改为:
Function Test(ByVal SomeTable() As Char) As Char()
SomeTable(0) = "0"
Return SomeTable
End Function
并且不修改其余部分,问题仍然存在 - 出于某种原因,由于 ByVal 状态,TrueTable 正在更新,而不应该更新。
对此的任何帮助将不胜感激;这可能是我忽略的一些愚蠢的事情,但它把我的头发拉了出来!
非常感谢, 阿尔菲:)
【问题讨论】:
-
为什么您认为将引用类型的集合传递给方法并更改其内容不应该影响集合本身?
-
ByVal 适用于数组对象,而不是数组内容。复制数组以使原始内容不能更改必须显式完成,提醒您成本,使用 Array.Copy()。
-
现在和永远开启 Option Strict。项目属性 -> 编译选项卡。也适用于未来的项目工具 -> 选项 -> 项目和解决方案 -> VB 默认值
标签: vb.net visual-studio