vb.net 复制结构而不是地址
vb.net Copy Structure not Address
我正在尝试将数据从结构复制到临时结构,这样如果用户单击取消按钮,我就不会修改原始数据。看起来 = 正在将地址分配给新结构,而不是简单地复制数据。如果他们点击“保存”按钮,那么我想将修改后的结构复制到工作结构中,如果他们点击“取消”,那么我就简单地销毁临时结构。
我在临时结构中所做的任何更改都会反映在工作结构中。如何将它们分开,而不必单独复制结构的每个元素?
注意:OutputData是一个相同"SortKeysStruct"结构的数组。
谢谢!
Dim TempOutput As new OutputDataStructure
Private Sub OutputDetailsForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
TempOutput = OutputData(ActivePanelIx)
End Sub
Private Sub SaveBtn_Click(sender As Object, e As EventArgs) Handles SaveBtn.Click
OutputData(ActivePanelIx) = TempOutput
Me.DialogResult = DialogResult.OK
Me.Close()
End Sub
Private Sub CancelBtn_Click(sender As Object, e As EventArgs) Handles CancelBtn.Click
OutputData(ActivePanelIx) = TempOutput
Me.DialogResult = DialogResult.OK
Me.Close()
End Sub
在新的控制台应用程序项目中尝试 运行 这段代码,您会看到结构(值类型)的行为符合您的要求,而 class(引用类型)则不是,而是需要你自己创建一个副本:
Module Module1
Sub Main()
Dim t1A As New Type1 With {.Text = "Initial"}
Dim t2A As New Type2 With {.Text = "Initial"}
Dim t3A As New Type3 With {.Text = "Initial"}
Dim t1B = t1A
Dim t2B = t2A
Dim t3B = DirectCast(t3A.Clone(), Type3)
t1B.Text = "Final"
t2B.Text = "Final"
t3B.Text = "Final"
Console.WriteLine(t1A.Text)
Console.WriteLine(t2A.Text)
Console.WriteLine(t3A.Text)
Console.ReadLine()
End Sub
End Module
Public Structure Type1
Public Property Text As string
End Structure
Public Class Type2
Public Property Text As String
End Class
Public Class Type3
Implements ICloneable
Public Property Text As String
Public Function Clone() As Object Implements ICloneable.Clone
Return New Type3 With {.Text = Text}
End Function
End Class
该代码将显示 t1A
(值类型)和 t3A
(克隆引用类型)的 Text
属性未被修改,而 t2A
(参考类型)是。
我正在尝试将数据从结构复制到临时结构,这样如果用户单击取消按钮,我就不会修改原始数据。看起来 = 正在将地址分配给新结构,而不是简单地复制数据。如果他们点击“保存”按钮,那么我想将修改后的结构复制到工作结构中,如果他们点击“取消”,那么我就简单地销毁临时结构。
我在临时结构中所做的任何更改都会反映在工作结构中。如何将它们分开,而不必单独复制结构的每个元素?
注意:OutputData是一个相同"SortKeysStruct"结构的数组。
谢谢!
Dim TempOutput As new OutputDataStructure
Private Sub OutputDetailsForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
TempOutput = OutputData(ActivePanelIx)
End Sub
Private Sub SaveBtn_Click(sender As Object, e As EventArgs) Handles SaveBtn.Click
OutputData(ActivePanelIx) = TempOutput
Me.DialogResult = DialogResult.OK
Me.Close()
End Sub
Private Sub CancelBtn_Click(sender As Object, e As EventArgs) Handles CancelBtn.Click
OutputData(ActivePanelIx) = TempOutput
Me.DialogResult = DialogResult.OK
Me.Close()
End Sub
在新的控制台应用程序项目中尝试 运行 这段代码,您会看到结构(值类型)的行为符合您的要求,而 class(引用类型)则不是,而是需要你自己创建一个副本:
Module Module1
Sub Main()
Dim t1A As New Type1 With {.Text = "Initial"}
Dim t2A As New Type2 With {.Text = "Initial"}
Dim t3A As New Type3 With {.Text = "Initial"}
Dim t1B = t1A
Dim t2B = t2A
Dim t3B = DirectCast(t3A.Clone(), Type3)
t1B.Text = "Final"
t2B.Text = "Final"
t3B.Text = "Final"
Console.WriteLine(t1A.Text)
Console.WriteLine(t2A.Text)
Console.WriteLine(t3A.Text)
Console.ReadLine()
End Sub
End Module
Public Structure Type1
Public Property Text As string
End Structure
Public Class Type2
Public Property Text As String
End Class
Public Class Type3
Implements ICloneable
Public Property Text As String
Public Function Clone() As Object Implements ICloneable.Clone
Return New Type3 With {.Text = Text}
End Function
End Class
该代码将显示 t1A
(值类型)和 t3A
(克隆引用类型)的 Text
属性未被修改,而 t2A
(参考类型)是。