- PR -

構造体のNULL表現

投稿者投稿内容
dragonball
会議室デビュー日: 2004/06/09
投稿数: 19
投稿日時: 2004-06-11 20:51
お世話になっております。

構造体のNULL表現についてお聞きしたいです。

構造体DateTimeをあるクラスのプロパティとして使っています。
そして、それが設定されている時はこの処理
されていない時はこの処理というようなことを行いたいのですが、
構造体にNULL(Nothing)はなく、00:00:00で初期化されているため
判断のしようがありません。

これが仕様なのは分かっているのですが、
このような状況になった場合の回避策として適切な方法は
どのようなものでしょうか?
DateTimeのラッパクラスを作るしかないでしょうか?

ちなみにCompareTo(New DateTime)で判定できますが、一応
00:00:00も使う予定なので適切ではありません。

よろしくお願いします。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2004-06-11 21:23
int型の場合はどうしますか?

int型をあるクラスのプロパティとして使っています。
そして、それが設定されている時はこの処理
されていない時はこの処理というようなことを行いたいのですが、
int型にNULL(Nothing)はなく、0で初期化されているため
判断のしようがありません。
dragonball
会議室デビュー日: 2004/06/09
投稿数: 19
投稿日時: 2004-06-11 22:37
todoさん
レスありがとうございます。

> int型の場合はどうしますか?

おっしゃる通りです。
しかし、その場合はIntegerクラスを使います。

ご教示お願いいたします。
karajan
ベテラン
会議室デビュー日: 2002/07/05
投稿数: 89
投稿日時: 2004-06-12 00:36
DateTime.MinValueで初期化して、それで判断するってのはだめしょうか?
どうしてもNullで判別したいなら、ラッパー作るしかないと思います。

それと、私が知らないだけかもしれないですが、Integerっていうクラスってありましたっけ?

Int16,32,64は知ってますが、それらはすべて構造体なのでNull判別はできないかと思われます。
platini
大ベテラン
会議室デビュー日: 2002/12/03
投稿数: 193
投稿日時: 2004-06-12 00:50



さて、どういうタイミングの処理を
設定とみなすのかよくわかりませんが
単純に設定するタイミングで別の監視フラグをtrueにして、
falseの場合、例外を発生させるという方法では×ですか?
(単純すぎる?)

private bool myflag = false ;
private DateTime dt ;

public void SetDateTime( DateTime _dt)
{
myflag = true ;
this.dt = _dt ;
}
public myDataTime
{
get{
if ( myflag )
{
return dt ;
}
else
{
throw new ArgumentException("InitError");
}

}


[ メッセージ編集済み 編集者: platini 編集日時 2004-06-12 09:25 ]
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-06-12 11:48
引用:

しかし、その場合はIntegerクラスを使います。



元投稿が VB.NET についての質問であれば、↑によって状況が改善されることは無いはずです。

.NET の System.IntXX はすべて構造体で、VB.NET における Integer や Long は System.IntXX へのエイリアスに過ぎません。

不便な面もあるかもしれませんが、結局のところ、ラッパクラスを作るのが一番簡単で確実な解決だと思います。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
dragonball
会議室デビュー日: 2004/06/09
投稿数: 19
投稿日時: 2004-06-14 10:15
返信遅れました。皆様ありがとうございます。

Integerについてですが、確認しないで書き込んでしまいました。
Javaのそれと同じなのかと思っていました。

結局DateTime.MinValueで判断することにしようと思います。
フラグもよかったのですが、こちらの方がシンプルであるため。
(MinValueを使う判定の場合、実際に設定されてないでこの値なのか
注意が必要ですが)

しかし、構造体といえども便利な関数はありますし
.NETのライブラリ内で構造体とクラスで用意しているのは
なぜなのでしょうか?
とても不便に思えますが。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2004-06-14 11:04
私の読んだ本によると
クラスは参照型、構造体は値型で
Intなど頻繁に使用されるものを参照型にすると

1.ポインタの参照先を探しにいく処理がオーバーヘッドになる
2.ポインタ変数分のメモリがもったいない(Intは4byte、ポインタ変数も4byteと2倍になってしまう)

だからだそうです。。。
でもNULLが使用できないのは不便ですよね(´Д⊂グスン


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