- - PR -
変数の割り当てあるいはクラスのインスタンス化の状態をチェックしたい
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-02-28 12:36
質問1
値型の変数(例 int)が"未割り当て"であるかを条件分岐の判別式に直接組み込むことができるでしょうか? 質問2 参照型の変数あるいはクラスがインスタンス化されているかどうかを条件分岐の判別式に直接組み込むことができるでしょうか?(コンストラクタに判別用のフラグを持てば可能ではありますが、そういう意味ではなくてインスタンス化されているかどうか自体を直接判別する方法を知りたい) | ||||||||
|
投稿日時: 2005-02-28 14:33
値型(構造体)はnewを使用しないでもインスタンスが生成されます(引数なしのデフォルトコンストラクタが呼ばれる) 未割り当てというのはどのような状態でしょうか? デフォルトコンストラクタによってインスタンスが生成された状態でしょうか?
この質問もよくわからないのですが 参照変数(ポインタ)がnullならインスタンス化されていないって意味ではないんですか? Class1 obj = null; // この時点ではインスタンスが生成されていない obj = new Class1(); //この時点ではインスタンスが生成されている | ||||||||
|
投稿日時: 2005-02-28 15:21
ご回答ありがとうございます。
マルチスレッド(System.Threading)のロジックを記述しているとき、 変数あるいはクラスのインスタンスにアクセスする前に対象がきちんと初期化 されているかチェックしておきたい場合があります。 簡潔な方法は無いでしょうか? ★質問1の補足説明 // ***** aが"未割り当て"とは… { int a; // 変数aは値が未割り当ての状態 a = 1234; // 変数aは値1234が割り当てられている … } // ***** 下記のようなチェックロジックを作りたい { if(変数aが未割り当てなら) { // aが未割り当ての場合の処理 // … } else { // aが割り当てられている場合の処理 // … } } ★質問2の補足説明 { Class1 b; // bがインスタンス化されていない b = new Class1(); // bがインスタンス化されている … } // ***** 下記のようなチェックロジックを作りたい { if(クラスbが未割り当てなら) { // bが未割り当ての場合の処理 // … } else { // bが割り当てられている場合の処理 // … } } | ||||||||
|
投稿日時: 2005-02-28 15:33
.Net1.x -> フラグ
.Net2.0 -> Nullable<int> | ||||||||
|
投稿日時: 2005-02-28 15:37
SqlTypesと言うのも手かな
_________________ 甕星 <mikahosi@abox9.so-net.ne.jp> http://blogs.msmvp.jp/mikahosi/ | ||||||||
|
投稿日時: 2005-02-28 16:42
ご回答ありがとうございます。
ご指摘どおり、 System.Data.SqlTypes.SqlInt32.Nullで判別できました。 | ||||||||
|
投稿日時: 2005-02-28 18:39
質問1への回答:
例えば、 int a; と宣言しておくと、これは0がアサインされています。Date型はnullがアサインされています。このように、初期割り当て値と比較すれば、検査できると思います。もっとも、プログラム中でその値が取りうる範囲が明確であるなら、その範囲外に初期化しておくというのが安全かと思います。そういうことではない? 質問2への回答: 1への回答と同じですが、 Object a; と宣言しておくと、nullに初期化されています。このため、 if (a == null) { // 未インスタンス化 } else { // インスタンス化済 } と判別できます。もっとも、少々注意が必要ですが。 変数というのは「割り当てられたものへの参照」ですから、クラスインスタンスが作成されたかどうかはわからないんですよね。それが知りたい、その目的が「一つしかインスタンス化したくない」という時は、デザインパターンの…なんだっけ?GoFデザインパターンの中にあります。方法は、小野@どっとねっとふぁんさんのウェブページにソース付きであります。 > ご指摘どおり、 > System.Data.SqlTypes.SqlInt32.Nullで判別できました。 ん〜?なんか、勘違いのにおい。。。 _________________ | ||||||||
|
投稿日時: 2005-02-28 20:06
"シングルトンパターン"ですね _________________ 甕星 <mikahosi@abox9.so-net.ne.jp> http://blogs.msmvp.jp/mikahosi/ |