2011年08月11日

.NETの構造体とクラス

今回はあまり使われていない(?).NETの構造体にスポットを当てたいと思います。




構造体って何ですか?


構造体はクラスに似た入れ物です。
クラスが持てるメンバー、例えばメソッド、フィールド、プロパティなどは、だいたい構造体も持てると思ってOKです。




構造体とクラスってどこが違うんですか?


詳しくはMSDNのページを参照してください。
めぼしい特徴を抜き出してみます。

・構造体は継承できない
 そういう仕様です。
 よって構造体のメンバーにprotectedを付けることはできません。

・構造体は値型
 構造体はプリミティブ(言語が持つintやdoubleなどの型)と同じ値型です。
 なのでメモリ的にはスタック領域に配置されます。

・構造体にはガベージコレクションが効かない
 プリミティブと同様に、スコープを抜けたら勝手に破棄されます。

・構造体をnullにすることはできない
 nullを代入すると勝手にデフォルト値に初期化されます。




使い分けのポイントは?


これも詳しくはMSDNのページを参照してください。
簡単に言うと、以下の全ての条件に当てはまるときに構造体を使うほうがパフォーマンス的に有利です。

1.プリミティブに似た単一の値を論理的に表す
2.インスタンスのサイズが16バイト未満
3.変更できない(しない)
4.頻繁にボックス化する必要がない

1番、2番の条件から、あまり複雑な構造体はお勧めできません。

2番をわかりやすく言うと「intのメンバー変数なら4個まで」ということです。
とても小規模のデータ構造にしか使えないですね。

3番は、構造体が値型であることと関係しています。
変更や代入を行うときに値をコピーしなきゃならんので、それが重荷になります。

4番のボックス化とは、値型から参照型に変換することです。
プログラムでいうとこんな感じです。
2行目でボックス化が行われます。
int i = 0;
object o = i;
ボックス化は内部的に勝手に行われるので注意しましょう。
例えばジェネリックのListの要素が構造体の場合とか、どうなるんでしょうね・・・。




構造体ってどこで使うの?


これまで書いてきたことから、構造体の使いどころはかなり限定的だと思います。
私がパッと思いついたころで、例えば複素数を表すのに使えるでしょうか。
複素数は実部と虚部の和として表されるので、それぞれをメンバー変数として定義します。
ついでに演算子のオーバーロードを利用して、複素数同士の和や積を計算できるようにすると良いかもしれません。
同様に、ベクトルを表現するのにも使えそうですね。




結論


構造体ってあまり使う機会はないかもしれないけど、忘れないでね!
私は存在そのものを忘れてましたけど。





posted by ぺるたご at 16:33| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。