3

VB.NETリストオブジェクトを別のオブジェクトに設定するときに問題が発生します。以下の例では、インスタンスをReadLocations作成し、オブジェクトを作成しますReadLocation。次に、ループして、に等しくReadLocations設定します。ReadLocation1rl

その後、ReadLocation1他の何か(assdfhsd)に変更すると、ReadLocationsインデックスも変更されます。「=」記号が実際に値を設定するのではなく参照することを意味しない限り、なぜそれが行われるのか、私は本当に混乱しています。私はC#開発者ですが、変更しているプログラムはVB.NETにありますので、助けてください。

Dim ReadLocations As New List(Of Model.ReadLocation)
Dim rl1 As New Model.ReadLocation
rl1.LL = "a"
Dim rl2 As New Model.ReadLocation
rl2.LL = "b"
ReadLocations.Add(rl1)
ReadLocations.Add(rl2)

Dim ReadLocation11 As New Model.ReadLocation

For Each rl As Model.ReadLocation In ReadLocations
    ReadLocation11 = rl
Next
4

1 に答える 1

6

ReadLocationが参照型 (クラス) の場合、そのクラスのオブジェクトのインスタンスに設定されたすべての変数は常に参照になります。演算子は=、参照型を操作しているときにのみ、オブジェクトへの新しい参照を設定します。オブジェクトのクローンを作成することはありません (値型でない限り)。C# でも同じです。やりたいことを行う唯一の方法は、オブジェクトを 2 番目のリストに追加するときにオブジェクトを複製することです。残念ながら、.NET には、オブジェクトを複製するための単純な自動メソッドが用意されていません。これを行う標準的な方法は、ReadLocation クラスに ICloneable インターフェイスを実装することです。次に、clone メソッドを呼び出してクローンを作成できます。

ReadLocation1 = CType(rl.Clone(), ReadLocation)

ただし、そのクローン メソッド内で、ReadLocation の新しいインスタンスを作成し、そのすべてのプロパティを手動で設定してから返す必要があります。例えば:

Public Class ReadLocation
    Implements ICloneable

    Public Function Clone() As Object Implements ICloneable.Clone
        Dim clone As New ReadLocation()
        clone.Property1 = Me.Property1
        clone.Property2 = Me.Property2
        Return clone
    End Function
于 2012-06-15T14:31:52.997 に答える