VB.NET-如何创建对double的引用数组?

VB.NET-如何创建对double的引用数组?,vb.net,arrays,reference,Vb.net,Arrays,Reference,例如,我的程序中有一堆类型为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 S

例如,我的程序中有一堆类型为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}
Dim Area(0) as Double
Dim Perimeter(0) as Double
Public Class DoubleWrapper
    Public Value As Double
End Class
这样我就可以使用三行for循环将值转储到文件中,而不是复制和粘贴20个变量名

这正是我想要的,如果面积和周长是像对象一样的引用类型。但由于它们是双精度的,TypingSaver只包含它们的值,而不包含对实际变量的引用。所以在我使用TheSquare函数之后,面积和周长的值被正确地更新了,但是TypingSaver只保留了我声明数组时面积和周长的值


所以问题是:如何在VB.NET中创建对double的引用数组?

使用您正在执行的方法,您无法执行此操作,因为一旦创建数组,您就将所有变量复制到数组中,并且对变量所做的任何更改都不会反映在数组变量中(如您所指出的)


我建议创建另一个类,该类将包含所有变量(20个变量名称)作为属性(get和set),然后重写ToString方法,该方法将返回所有变量的列表。因此,当您需要转储这些变量时,您将调用ToString()方法,它将返回您所有参数的当前值。

有一种令人讨厌的方法可以做到这一点。所有数值类型都是值类型,但数组是引用类型。因此,我可以将所有的双精度数组更改为双精度数组,如下所示:

Dim TypingSaver() as Double = {Area, Perimeter}
Dim Area(0) as Double
Dim Perimeter(0) as Double
Public Class DoubleWrapper
    Public Value As Double
End Class
所以现在面积和周长都是双精度的单元素数组。然后,我的“循环数组”变为

Dim TypingSaver() as Array = {Area, Perimeter}
现在TypingSaver存储对面积和周长的引用。对我来说,这是一个简单的更改,因为我可以搜索和替换双重声明,更改TypingSaver的类型,然后在另外两个地方,我必须更改此表单的直接访问:

TypingSaver(1) = 7

不太好看,但它保持了我的代码的一致性,因为我有其他对象的“循环数组”,这些对象都是相互关联的


虽然我的问题还不清楚,但真正的解决办法是重新构造所有内容,因此我没有将所有内容存储在数组中,而是创建了一个包含我需要的所有对象的类,并创建了一个单一数组,正如Blezden部分建议的那样。

单一元素数组的想法实际上很糟糕。代码变得异常缓慢。还有一个朋友建议的工作:创建一个包装类,如下所示:

Dim TypingSaver() as Double = {Area, Perimeter}
Dim Area(0) as Double
Dim Perimeter(0) as Double
Public Class DoubleWrapper
    Public Value As Double
End Class
然后,当创建一个doublewrapper数组时,它当然是通过引用创建的


我知道这并不理想,但在我有时间从头重写代码之前,我一直在寻找一个解决方案。

与您最近的答案非常相似,您希望将类型包装为“可空”,这基本上使其成为一个可以为空的对象,但也是一个引用类型

例如,
Dim testDouble作为可为空(Double的)
Dim testDouble2作为Double?

见:


是的,您可以这样做,但它不可读,因为您不知道7或1是什么意思。使用带有属性的单独类,您将拥有类似于Shape.Area、Shape.period的内容,因此它不太容易出错,并且可读性更强。该类称为。