首页 > 解决方案 > vb.net 复制结构不是地址

问题描述

我正在尝试将数据从结构复制到临时结构,以便如果用户单击取消按钮,我没有修改原始数据。似乎 = 将地址分配给新结构,而不是简单地复制数据。如果他们点击保存按钮,那么我想将修改后的结构复制到工作结构中,如果他们点击取消,那么我只需破坏临时结构。

发生的情况是,我在临时结构中所做的任何更改都会反映在工作结构中。我如何将这些分开,而不必自己复制结构的每个元素?

注意: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

标签: vb.netcopystructure

解决方案


尝试在新的控制台应用程序项目中运行此代码,您将看到结构(值类型)的行为如您所愿,而类(引用类型)则不需要,而是需要您自己创建一个副本:

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

该代码将显示(值类型)和(克隆的引用类型)的Text属性没有被修改,而(引用类型)的属性被修改。t1At3At2A


推荐阅读