我的程序中有一堆类型的Double变量,例如
Dim Area as Double = 0
Dim Perimeter as Double = 0
在我的程序中某处我想计算这些值,所以我定义了
Public Sub TheSquare(ByRef TheArea as Double, ByRef ThePerim as Double, ByVal TheSide as Double)
TheArea = TheSide^2
ThePerim = 4 * TheSide
End Sub
在程序中的某个地方我正在收集边长并计算面积和周长;说
While True
S = GetSideValueFromSomewhere()
TheSquare(Area, Perimeter, S)
End
在我的真实计划中,我有20个我想要计算的数量。显然每个人都有不同的等式。但最后我想将所有20个输出到一个文件,所以为了节省输入,我创建了一个数量数组,如下所示:
Dim TypingSaver() as Double = {Area, Perimeter}
这样我就可以使用三行for循环将值转储到文件,而不是复制和粘贴20个变量名。
如果Area和Perimeter是像Objects这样的引用类型,那么这正是我想要的。但由于它们是双打,因此TypingSaver仅包含它们的值,而不包含对实际变量的引用。因此,在使用我的TheSquare函数后,Area和Perimeter的值被正确更新,但是当我声明数组时,TypingSaver只会保留Area和Perimeter的值。
所以问题是:如何在VB.NET中创建双精度引用数组?
答案 0 :(得分:3)
使用您正在执行的方法,您无法执行此操作,因为只要您创建了数组,就会将所有变量复制到数组中,并且您对变量所做的任何更改都不会反映在数组变量上(就像您指出的那样) )。
我建议创建另一个类,它将包含所有变量(20个变量名称)作为属性(get和set),然后重写ToString方法,该方法将返回所有变量的列表。因此,当您需要转储这些变量时,您将调用ToString()方法,它将返回所有参数的当前值。
答案 1 :(得分:0)
有一种令人讨厌的方法可以做到这一点。所有数字类型都是值类型,但数组是引用类型。所以我可以将我的所有双打改为双打阵列,如下:
Dim Area(0) as Double
Dim Perimeter(0) as Double
所以现在Area和Perimeter是双元素的1元素数组。我的“循环数组”然后变成
Dim TypingSaver() as Array = {Area, Perimeter}
现在,TypingSaver存储对Area和Perimeter的引用。对我来说这是一个简单的改变,因为我可以搜索和替换Double声明,更改TypingSaver的类型,然后在其他两个地方我必须更改此表单的直接访问:
TypingSaver(1) = 7
到
TypingSaver(1).SetValue(7, 0)
不漂亮,但它保持我的代码一致,因为我有其他所有彼此相关的对象的“循环数组”。
虽然在我的问题中我不清楚真正的解决方案是重构所有内容所以不是将所有内容存储在数组中,而是创建一个具有我需要的所有对象的类,并创建一个单独的数组,如Blezden的部分建议
答案 2 :(得分:0)
单元素阵列的想法实际上很糟糕。代码变得极其缓慢。朋友建议围绕另一项工作:创建一个这样的包装类:
Public Class DoubleWrapper
Public Value As Double
End Class
然后,当创建一个DoubleWrappers数组时,它当然是通过引用。
我理解这不太理想,但我正在寻找的是一种解决方法,直到我有时间从头开始重写代码。
答案 3 :(得分:0)
与您最近的答案非常类似,您希望将您的类型包装为“Nullable”,这基本上使它成为一个可以为null的对象,但也是一个引用类型。
IE中。 Dim testDouble as Nullable(Of Double)
或Dim testDouble2 as Double?
请参阅: