- PR -

変数の割り当てあるいはクラスのインスタンス化の状態をチェックしたい

投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2005-02-28 12:36
質問1
値型の変数(例 int)が"未割り当て"であるかを条件分岐の判別式に直接組み込むことができるでしょうか?

質問2
参照型の変数あるいはクラスがインスタンス化されているかどうかを条件分岐の判別式に直接組み込むことができるでしょうか?(コンストラクタに判別用のフラグを持てば可能ではありますが、そういう意味ではなくてインスタンス化されているかどうか自体を直接判別する方法を知りたい)
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2005-02-28 14:33
引用:

質問1
値型の変数(例 int)が"未割り当て"であるかを条件分岐の判別式に直接組み込むことができるでしょうか?



値型(構造体)はnewを使用しないでもインスタンスが生成されます(引数なしのデフォルトコンストラクタが呼ばれる)
未割り当てというのはどのような状態でしょうか?
デフォルトコンストラクタによってインスタンスが生成された状態でしょうか?

引用:

参照型の変数あるいはクラスがインスタンス化されているかどうかを条件分岐の判別式に直接組み込むことができるでしょうか?(コンストラクタに判別用のフラグを持てば可能ではありますが、そういう意味ではなくてインスタンス化されているかどうか自体を直接判別する方法を知りたい)



この質問もよくわからないのですが
参照変数(ポインタ)がnullならインスタンス化されていないって意味ではないんですか?

Class1 obj = null;
// この時点ではインスタンスが生成されていない
obj = new Class1();
//この時点ではインスタンスが生成されている



ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 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が割り当てられている場合の処理
// …
}
}

中博俊
ベテラン
会議室デビュー日: 2004/10/17
投稿数: 91
お住まい・勤務地: 大阪市
投稿日時: 2005-02-28 15:33
.Net1.x -> フラグ
.Net2.0 -> Nullable<int>
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-02-28 15:37
SqlTypesと言うのも手かな
_________________
甕星 <mikahosi@abox9.so-net.ne.jp>
http://blogs.msmvp.jp/mikahosi/
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2005-02-28 16:42
ご回答ありがとうございます。

ご指摘どおり、
System.Data.SqlTypes.SqlInt32.Nullで判別できました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 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で判別できました。
ん〜?なんか、勘違いのにおい。。。
_________________
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-02-28 20:06
引用:

Jittaさんの書き込み (2005-02-28 18:39) より:
質問2への回答:
 変数というのは「割り当てられたものへの参照」ですから、クラスインスタンスが作成されたかどうかはわからないんですよね。それが知りたい、その目的が「一つしかインスタンス化したくない」という時は、デザインパターンの…なんだっけ?GoFデザインパターンの中にあります。方法は、小野@どっとねっとふぁんさんのウェブページにソース付きであります。


"シングルトンパターン"ですね
_________________
甕星 <mikahosi@abox9.so-net.ne.jp>
http://blogs.msmvp.jp/mikahosi/

スキルアップ/キャリアアップ(JOB@IT)