1

クラスオブジェクト(それが呼ばれるものだと思います)をクラスのジェネリックリストに追加しようとしています。次のコードでは、TempQuoteReturnFromExecuteEstimate の値を変更するたびに、ジェネリック リストのすべての行の値が変更されます。オブジェクトを参照しているだけだと思います。値を汎用リストにコピーするにはどうすればよいですか? ありがとう

Dim AllEstimatesReturn As New List(Of QuoteReturnData)
Dim TempQuoteReturnFromExecuteEstimate As New QuoteReturnData
...
AllEstimatesReturn.Add(TempQuoteReturnFromExecuteEstimate)
4

3 に答える 3

2

あなたの仮定は正しいです。クラス型 (参照型) 変数を作成すると、それは単にオブジェクトを参照します。同時に同じオブジェクトを参照する多くの異なる変数を持つことができます。

この場合、AllEstimatesReturnリスト内の各項目は個別のQuoteReturnData変数のようになります。各アイテムは、オブジェクトへの単なる参照であり、コピーではありません。したがって、理論的には、リスト内のすべての項目がすべて同じオブジェクトを参照できますが、通常はそれが必要なわけではありません。

Newリスト内の項目ごとに個別のオブジェクトを作成する場合は、次のキーワードを使用して毎回作成する必要があります。

'Add the first item
Dim TempQuoteReturnFromExecuteEstimate As New QuoteReturnData
...
AllEstimatesReturn.Add(TempQuoteReturnFromExecuteEstimate)

'Add the second item
TempQuoteReturnFromExecuteEstimate = New QuoteReturnData  ' Use New to create another object
...
AllEstimatesReturn.Add(TempQuoteReturnFromExecuteEstimate)

上記の例では、同じ変数を再利用し、値を変更して新しいオブジェクトを参照していることに注意してください。古いオブジェクトは、リスト オブジェクトによって参照されているため、まだ存在しています。別の方法として、毎回新しい変数を宣言することもできますが、明確にするためにそうしたくない場合を除き、そうする必要がある技術的な理由はありません。

于 2013-02-26T19:00:37.963 に答える
1

クラス型は参照型です。したがって、これは同じオブジェクトへの 3 つの参照をリストに追加します。

Dim AllEstimatesReturn As New List(Of QuoteReturnData)
Dim TempQuoteReturnFromExecuteEstimate As New QuoteReturnData

AllEstimatesReturn.Add(TempQuoteReturnFromExecuteEstimate)
AllEstimatesReturn.Add(TempQuoteReturnFromExecuteEstimate)
AllEstimatesReturn.Add(TempQuoteReturnFromExecuteEstimate)

毎回新しいオブジェクトを作成するか

Dim AllEstimatesReturn As New List(Of QuoteReturnData)

AllEstimatesReturn.Add(New QuoteReturnData())
AllEstimatesReturn.Add(New QuoteReturnData())
AllEstimatesReturn.Add(New QuoteReturnData())

または、クローンを作成するメソッドを実装しQuoteReturnDataます。

Class QuoteReturnData

    ' Creates an exact copy of the current QuoteReturnData object.
    Public Function SwallowCopy() As QuoteReturnData
        Return DirectCast(Me.MemberwiseClone(), QuoteReturnData)
    End Function

End Class

MemberwiseCloneから継承されObject、必要なことを正確に実行します。ただし、このメソッドは保護されており、クラス内からのみ呼び出すことができます。したがって、パブリック関数にラップします。

今、あなたはこれを行うことができます

Dim AllEstimatesReturn As New List(Of QuoteReturnData)
Dim TempQuoteReturnFromExecuteEstimate As New QuoteReturnData

AllEstimatesReturn.Add(TempQuoteReturnFromExecuteEstimate.SwallowCopy())
AllEstimatesReturn.Add(TempQuoteReturnFromExecuteEstimate.SwallowCopy())
AllEstimatesReturn.Add(TempQuoteReturnFromExecuteEstimate.SwallowCopy())

これは浅いクローンを作成するだけであることに注意してください。オブジェクトに他のオブジェクトへの参照が含まれている場合、これらの他のオブジェクトは自動的に複製されません。これでいいのか、ディープ クローンが必要なのかは、あなた次第です。

于 2013-02-26T19:10:27.230 に答える
0

オブジェクトは参照に格納されます。値型のみがコピーされます (つまり、structs )。

オブジェクトのコピーを作成するには、クローンを作成する必要があります。これを行わない限り、常に同じオブジェクトへの参照を多数作成することになります。あなたのリストも例外ではありません。

ICloneable.NET Framework に存在するインターフェイスの実装を開始します。

アップデート

として型付けされたオブジェクトを返すICloneableためにインターフェイスが気に入らない場合は、次のようなインターフェイスを実装できます。Clone()object

Public Interface ICloneable(Of T)
{
      Function Clone() As T;
}

リストに項目を追加するコードは次のようになります (もちろん、QuoteReturnData実装する場合ICloneable(Of T)):

AllEstimatesReturn.Add(TempQuoteReturnFromExecuteEstimate.Clone());
于 2013-02-26T18:55:58.333 に答える