VB.NET中Fluid类数组字段赋值引发原对象被修改的问题
Fluid对象数组字段按引用传递导致原数据意外覆盖
我定义了如下Fluid类用于存储流体数据,同时声明了Fluid_tbl As List(Of Fluid):
Public Class Fluid Public Index As Boolean Public MassFlow As Double Public Pres As Double Public Temp As Double Public comp(30) As Double Public str As Double Public Prop(10) As Double End Class
当我基于一个Fluid对象给另一个对象赋值计算时,原对象的字段被意外覆盖。我希望所有字段都按值传递,但数组类型字段似乎是按引用传递?
比如在以下循环中,我想根据相对总流量将流MA的各分量缩放至流AP,但Fluid_Tbl(MA).comp(i)也被修改了:
For i = 0 To 30 Fluid_tbl(AP).comp(i) = Fluid_Tbl(MA).comp(i) * Fluid_Tbl(AP).MassFlow / Fluid_Tbl(MA).MassFlow Next i
补充说明
我的问题并非对象实例唯一,而是数组属性异常——MassFlow、Pres、Temp等值类型字段赋值正常。我定位到从Stack Overflow获取的CopyProperties方法:
Sub CopyProperties(CopyTo As Object, CopyFrom As Object) For Each Prop As System.Reflection.FieldInfo In CopyFrom.GetType().GetFields CopyTo.GetType().GetField(Prop.Name).SetValue(CopyTo, Prop.GetValue(CopyFrom)) Next End Sub
我原本希望该方法实现Fluid对象的字段值复制(直接赋值会导致引用指向同一对象),但调用此方法后,上述循环中的.comp(i)会按引用传递;不调用则按值传递,符合预期。
以下是简化复现代码:
Private Sub Example() Fluid_Tbl = New List(Of Fluid) For i = 0 To 1 Dim fld As New Fluid Fluid_Tbl.Add(fld) Next Dim MA, AP As Integer MA = 0 AP = 1 Fluid_tbl(MA).comp(0) = 100 Fluid_tbl(MA).comp(1) = 50 Fluid_tbl(MA).MassFlow = 100 Fluid_tbl(AP).MassFlow = 200 CopyProperties(Fluid_tbl(AP), Fluid_tbl(MA)) Fluid_tbl(AP).MassFlow = 0 If Fluid_tbl(MA).MassFlow > 0 Then For i = 0 To 30 Fluid_tbl(AP).comp(i) = Fluid_tbl(MA).comp(i) * Fluid_tbl(AP).MassFlow / Fluid_tbl(MA).MassFlow Next i End If End Sub
内容的提问来源于stack exchange,提问作者Tarluna
相关产品推荐
相关产品推荐

