コレクションの構造

私はコレクション内の束の構造体への参照を格納したいと思います。一般的な足場は次のようになります:

Structure myStructType
  Dim prop1 as String
  Dim prop2 as int
End Structure


Dim myList as new List(Of myStructType)()

'Wrongness below
Dim myStruct as new myStructType()
myStruct.prop1 = "struct1"
myStruct.prop2 = 1
myList.Add(myStruct)

myStruct = new myStructType()
mystruct.prop1 = "number two"
mystruct.prop2 = 2
myList.Add(myStruct)

今は同じメモリを参照しているので、これは機能しません。私が本当に望むのは、参照型にも使われる '値渡しの参照'の振る舞いです。そのため、より多くのものを簡単に生成し続けることができます。

構造体をクラスにする以外にこれを修正する方法はありますか?これは実際に構造体を使用する適切な方法ですか、それとも私はそれがすべて間違っていますか?

0
@ハンス、ありがとう。だから私はあなたを正しく理解している、私は値の型を保持する変数を渡すとき、私は実際に変数によって保持されている値のコピーを渡している?理にかなっているようだ。
追加された 著者 Martijn,
コードは正常に動作し、myStructTypeは値型です。リストには構造のコピーが格納されます。それを試してみてください。
追加された 著者 Hans Passant,

1 答え

このコードは、各オブジェクトに対して new myStructType()を呼び出すため、構造体であろうとクラスであろうと同じことをします。つまり、後でこれらのmyStructTypeオブジェクトを取得して変更すると、動作が異なることに注意してください。それが構造体から派生している場合は、元のデータをリストに残したまま、取得時にデータをコピーしています。クラスからデリバリーされている場合は、そのオブジェクトへの参照を取得しており、その参照を使用して行われた変更は、リスト内のインスタンスを変更します。

私はまだあなたがクラスの代わりに構造を使って達成しようとしている(または避けようとしている)のは何ですか?

1
追加された
これは、3ビットのデータで、操作はありません。そのような構造体はまさにそれである。
追加された 著者 Martijn,
私のusecaseのために、彼らはより軽いからです。しかし、それは本当に小さいので、価値の平等(私はそれを使用する予定ではない)を持っていれば、私はそれらを同調させ、初期化の後は変更されません。
追加された 著者 Martijn,
構造体を渡す(各代入またはパラメータとして使用する)ことは、構造体のサイズ全体をコピーすることに注意してください。したがって、構造体に3つの4バイトフィールド(IntegersまたはString refsなど)がある場合は、毎回12バイトをコピーしています。クラス内の同じデータは、同じシナリオで4バイトの参照のみをコピーすることになります。はるかに効率的です。
追加された 著者 tcarvin,
しかし、構造がクラスを超えていることをどのように認識していますか?私はあなたがそれが見つからないと思う。後でメンバーを変更する予定がある場合は、必ずクラスを使用する必要があります。
追加された 著者 Chris Dunaway,