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) | 日記 | このブログの読者になる | 更新情報をチェックする

2011年08月10日

JavaScriptでnullチェックするときにひょっとしたら少しすっきりするテクニック

本日はJavaScriptの小ネタです。

適当なオブジェクトobjがあって、objがgetValueという関数を持ってるとします。
objもgetValueの戻り値もnullではない場合に何かの処理を行いたいとします。
コードは以下のような感じです。

こんなときどうする?
if (obj && obj.getValue()) {
var value = obj.getValue();
//以降、valueを使って何か処理を行う。
}


このコードの問題点はgetValueを2回呼んでいること。
2回も呼びたくないのでこんな風に書き直してみましたが・・・。

これでいいのか?
if (obj) {
var value = obj.getValue();
if (value) {
//以降、valueを使って何か処理を行う。
}
}


if文が入れ子になりました。
getValueの呼び出しは1回ですが、いまいちすっきりしません。
そこで、以下のように書けます。

これですっきり
var value;
if (obj && (value = obj.getValue())) {
//以降、valueを使って何か処理を行う。
}


ポイントはもちろん、if文の条件の中で変数に代入することです。
また、演算子の優先順位(この場合は&&と=)から、適切に括弧でくくる必要があるかも。
C#やJavaのようなお堅い言語に比べれば少々トリッキーな感じもしますが、
JavaScriptの緩さゆえの良いところってことで。





タグ:javascript
posted by ぺるたご at 16:46| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

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