2010-12-17 5 views
2

興味深い質問があります。です.netフレームワークのどこかに構造体がありますか?構造体である.NETコレクション

genericパラメータを値型に設定しても、既存のコレクション(リスト、配列など)はすべて参照型です。しかし、実際に構造体であるコレクションを作成する方法があるかどうかを知りたいと思います。私は明らかにこれを渡す計画はしていません(これは大量のコピーをもたらすでしょう)...私はクラス(内部状態)の私的メンバーとしてそれを保つので、一度しか定義されません。私はガベージコレクタを呼び出すだけで小さなコレクション(XNAと思う)を作るのを避けることができます。

これが理想的なデータ構造になるのは、問題の第二の部分です。リンクされたリスト?

+1

理論的には、構造体を作成して、IListまたはIcollectionインターフェイスを実装して、値型を持つことができます。それが多くを助けるかどうか分からない。 – Arseny

答えて

8

いいえ、そのようなタイプは存在しません。それは良い考えではありません。構造体は、マイクロソフトのガイドラインに従って不変の小さな値型にする必要があります。 Value Type Usage Guidelinesから

:プリミティブ型のような

  • 法。
  • インスタンスサイズが16バイト未満です。
  • 不変です。
  • 値セマンティクスが望ましい。

リンクリストは、一般的に再帰的に定義されているので、値型とリンクリストを実装することは困難です。これは正常に動作します:

class Node<T> 
{ 
    public T Value; 
    public Node<T> Next; 
} 

しかし、構造体は、構造体が定義されている場合、固定サイズと、そのサイズがわかっていなければならない必要があるため、これは失敗します。

struct Node<T> 
{ 
    public T Value; 

    // Error: Struct member 'Node<T>.Next' of type 'Node<T>' 
    // causes a cycle in the struct layout 
    public Node<T> Next; 
} 
+5

しかし、Eric Lippertは、不変なコレクションの種類に関するブログシリーズ全体を持っています:) http://blogs.msdn.com/b/ericlippert/archive/2007/12/04/immutability-in-c-part-two-a- simple-immutable-stack.aspx – Oded

+0

ああ、あなたが言っていることを見る...コンパイルエラーが発生するかどうかはわかりませんでした。ありがとうございます:-) –

4

実際のコレクションである構造体があります。 BitVector32は構造体であり、32ブール値、つまり4バイトまたは2つのショートカットのコレクションのように動作します。あなたがちょっとしたことをしたいが、マスクなどを作ることについてあまり考えたくないときは、かなり便利です。あなたが実際にあなた自身をロールに計画している場合

はまた、あなたはそれがIList<Int32>のようなものを実装して作ればそれはそれと各メンバーのボックスになるとして、あなたは

public static void SomeMethod(IList<Int32> list) 
{ 
     .... 
} 

のように読み取るコードに送信してはならないことを警告しますアクセスはボクシングに最も可能性の高い鉛の代わりに構造体を呼び出すときにボクシングを避けることができます各callvirt前constrainedオペコードを放出する第2の例として、この署名::

public static void SomeMethod<T>(T list) where T:IList<Int32> 
{ 
     .... 
} 

を持つメソッドに送信しますメンバー。しかし、幸運。

+0

ああ、私はそれが既知のサイズのコレクションだということを考えています。私は少し曖昧なものを探していた –

+0

多少。非常に奇妙な2つのほとんどサポートされていない項目である 'ArgIterator'と' __arglist'もあります。あなたはまた、次のノードメンバーにアクセスするためにインターフェイスを使用してそれを偽造することができますが、あなたのボクシングは吸う。 –

+0

良い点ですが、あなたの 'あなたは決してコードにしてはいけません* 'を*時には*に変更しません。 – nawfal