0

ListVB.NETプログラムに構造体があり、それらをループして、リスト内のオブジェクトの値を次のように変更します。

Dim retvals As List(Of SomeStruct) = parser.RetrieveData(new_path)

 For i As Integer = 0 To retvals.Count - 1 Step 1
 dim temp as SomeStruct = retvals(i)

  temp.A = GetValueForA()
  temp.B = GetValueForB() 

 Next

このループの後で構造体のリストを調べると、どの値も上書きされていません。なんで?リストに参照があると思ったので、参照Aを構造体に変更すると、同じ構造体への参照Bに変更が表示されますか?

私は何が欠けていますか?

4

2 に答える 2

2

構造体は値型ですが、クラスは参照型です。SomeStructの代わりにSomeClassを使用する場合、このコードは期待どおりに機能します。

クラスを使用するシナリオでは、retvalsはクラスオブジェクトへのポインタのリストになります。「dimtempas...」はポインタのコピーを作成し、temp.Aを何かに設定すると、ポインタが指すオブジェクトが変更されます。したがって、コードが完了しても、retval内のポインターは、現在変更されている同じオブジェクトを指します。ただし、構造体を使用する場合、ポインタは保存されません。retvalsは、構造体に格納されている値のリストにすぎません。「dimtempas...」は、構造体全体のコピーを作成します。この構造体はtemp.Aを変更して変更しますが、元の構造体はそのコピーを変更しただけなので変更されません。

于 2012-04-15T09:16:02.783 に答える
0

問題が何であるかを理解しましStructureた。.NETでは値型であり、コンテンツがにコピーされることを意味しListます。したがって、temp変数を変更しても、元の変数は変更されません。List

class代わりに、参照型であるを 使用して修正しました。

于 2012-04-15T09:14:40.077 に答える