読者です 読者をやめる 読者になる 読者になる

構造体

C++の構造体とクラスはデフォルトのアクセスレベルが違うだけで、それ以外は全く同じだが、C#の構造体とクラスはかなりの違いがある。

class struct
格納場所 ヒープ スタック*1
継承 不可*2 *3
メンバの制限 なし あり*4
フィールドの宣言箇所での初期化 可能 不可能
コレクションとの相性 良い 悪い*5

また、ボックス化解除は明示的に行わなければならないのに、ボックス化は何も考えずにできるから思わぬところでボックス化が起こったりする点も注意が必要。

int i = 0;
// ここで勝手にボックス化
Console.WriteLine("{0}", i);
// 勝手にボックス化されないように明示的にToStringで文字列に
Console.WriteLine("{0}", i.ToString());
// むしろこの例だったらこれでOK
Console.WriteLine(i.ToString());

*1:もしくは参照型オブジェクトの一部分

*2:Objectを暗黙的に継承

*3:インターフェイスの実装は可能

*4:デストラクタとユーザ定義の引数なしコンストラクタを持てない

*5:ボックス化が必要だから