2012-02-07 8 views
8

なぜ私が使用している場合:構造体 - Layout.Explicit - コンストラクタ - 完全にアサインフィールド

struct MyStruct 
{ 
     [FieldOffset (0)] public uint Data; 
     [FieldOffset (0)] public byte Something; 
} 

public MyStruct (uint pData) 
{ 
    Data = pData; // setting Data field also sets Something field 
} 

C#は、i 'は何か' フィールドを割り当てる必要が言う:/私は、「コンストラクタ行うことができます知っている。これを() " コンパイラは 'データ'フィールドに 'Something'フィールドが含まれていることを知っておく必要があります。

だから、私はパラメータのないコンストラクタを最初に呼び出す必要があります、それは唯一の方法ですか?

答えて

-2

カスタムコンストラクタを定義する場合は、構造体のすべてのフィールドを初期化する必要があります。詳細については、具体的にはConstructors and Inheritence見出しの下のthis MSDNチュートリアルを参照してください。ここで

はこのに関してそのリンクから抽出された段落です:

構造体は、コンストラクタを宣言することはできますが、パラメータを取る必要があります。構造体のデフォルトの(パラメータのない)コンストラクタを宣言するのは誤りです。構造体メンバには初期化子を設定できません。構造体メンバをデフォルト値に初期化するためのデフォルトコンストラクタが常に提供されます。

+0

私は他のことについて話しています。 – zgnilec

+0

@zgnilecその場合、私はあなたの質問を検討することをお勧めします。 –

+0

さて、誰かが私を理解するかもしれない。 – zgnilec

5

はい、デフォルトのコンストラクタを呼び出す必要があります。

public MyStruct (uint pData) : this() 
{ 
    //... 
} 

コンパイラは、あなたのコンストラクタの先頭に以下のIL命令を生成します。それができないように

ldarg.0   // Push address of struct onto stack 
initobj MyStruct // Pop address of struct and initialize it with "all zeros" 
+0

これは非常に便利です。これにより、コードのスピードが1ナノ秒(フィールドの数に応じて)になります。 – Forestrf