- - PR -
構造体のNULL表現
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-06-11 20:51
お世話になっております。
構造体のNULL表現についてお聞きしたいです。 構造体DateTimeをあるクラスのプロパティとして使っています。 そして、それが設定されている時はこの処理 されていない時はこの処理というようなことを行いたいのですが、 構造体にNULL(Nothing)はなく、00:00:00で初期化されているため 判断のしようがありません。 これが仕様なのは分かっているのですが、 このような状況になった場合の回避策として適切な方法は どのようなものでしょうか? DateTimeのラッパクラスを作るしかないでしょうか? ちなみにCompareTo(New DateTime)で判定できますが、一応 00:00:00も使う予定なので適切ではありません。 よろしくお願いします。 | ||||
|
投稿日時: 2004-06-11 21:23
int型の場合はどうしますか?
int型をあるクラスのプロパティとして使っています。 そして、それが設定されている時はこの処理 されていない時はこの処理というようなことを行いたいのですが、 int型にNULL(Nothing)はなく、0で初期化されているため 判断のしようがありません。 | ||||
|
投稿日時: 2004-06-11 22:37
todoさん
レスありがとうございます。 > int型の場合はどうしますか? おっしゃる通りです。 しかし、その場合はIntegerクラスを使います。 ご教示お願いいたします。 | ||||
|
投稿日時: 2004-06-12 00:36
DateTime.MinValueで初期化して、それで判断するってのはだめしょうか?
どうしてもNullで判別したいなら、ラッパー作るしかないと思います。 それと、私が知らないだけかもしれないですが、Integerっていうクラスってありましたっけ? Int16,32,64は知ってますが、それらはすべて構造体なのでNull判別はできないかと思われます。 | ||||
|
投稿日時: 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-06-12 11:48
元投稿が 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/ | ||||
|
投稿日時: 2004-06-14 10:15
返信遅れました。皆様ありがとうございます。
Integerについてですが、確認しないで書き込んでしまいました。 Javaのそれと同じなのかと思っていました。 結局DateTime.MinValueで判断することにしようと思います。 フラグもよかったのですが、こちらの方がシンプルであるため。 (MinValueを使う判定の場合、実際に設定されてないでこの値なのか 注意が必要ですが) しかし、構造体といえども便利な関数はありますし .NETのライブラリ内で構造体とクラスで用意しているのは なぜなのでしょうか? とても不便に思えますが。 | ||||
|
投稿日時: 2004-06-14 11:04
私の読んだ本によると
クラスは参照型、構造体は値型で Intなど頻繁に使用されるものを参照型にすると 1.ポインタの参照先を探しにいく処理がオーバーヘッドになる 2.ポインタ変数分のメモリがもったいない(Intは4byte、ポインタ変数も4byteと2倍になってしまう) だからだそうです。。。 でもNULLが使用できないのは不便ですよね(´Д⊂グスン |