2011-01-27 9 views
13

私は、プライベートメッセージングシステムを備えたC#/ NHibernate Webサイトを設計しています。私は管理者に、メッセージがユーザーによって読み取られたかどうかをチェックし、ユーザーがまだ読み取っていないメッセージを一緒に強調表示したいと思います。より良いDateTime? NULLにはデフォルト(DateTime)を使用しますか?

オプション1

Read==nullはまだ

オプション2

class Message 
{ 
    DateTime Read; 
} 

Read==default(DateTime)(1月1日1つのAD、0を読まないことを意味

class Message 
{ 
    DateTime? Read; 
} 

:両方を達成するために、私は2つのオプションを発見しました:00:00)はまだ読み込まれていないことを意味します。

大学で、私はすべての特別例を処理するためにNULL値を使用するように教えられてきた、そしてそれはのかどうかをチェックすることにより、未読メッセージを照会するが容易になりますので、また、NULL可能タイプを使用すると、良い選択です彼らはNULLかどうかです。

しかし、null可能な型を使用するには、少なくともパフォーマンスが低下するコードでボクシングとアンボックスが必要です。一方、未読メッセージを照会することは

私の質問は

あなたの提案のアプローチは、この何のためにあるのです(しかし、それはインデックスを作成することができます)の値を比較する意味しますか?この場合、ベストプラクティスは何を示唆しますか?

答えて

17

DateTime?を使用してください。その具体的な目的は、nullなどの特別な場合を表すために予約値(別名「マジックナンバー」)を使用しないようにすることです。

また、null可能型を使用すると、ボクシング自体は導入されません。まだボクシングされていたどんな値もありますが、単に切り替えてボクシングを導入することはありません。 Nullable<T>タイプは実際には構造体であり、null(またはVB.NETのNothing)と比較する能力は厳密には言語規約です。カバーの下では、HasValueプロパティのチェックに変換されます。

7

null可能な型を使用しても、代替アプローチに比べてパフォーマンスが大幅に低下することはありません。 DateTimeDateTime?は両方とも構造体であり、ボクシングはここには含まれていません。 nullableを使用するのが正しい選択です。

0

マークとアダムは言ったように、ヌル可能な型の方法があります。パフォーマンスヒットが表示されず、クエリがはるかに簡単になります。

0

クライアントコードでnull可能な型を使用することに懸念があった場合は、DateTime.MinValueに設定してから、有効なレイヤーに変更してnullを指定することができます。次に、nullable型をDataAccessに供給することができます。これは、ヌル値を使用するための不満の層を維持するのに役立ちます。

3

数値を扱うときに同じ質問をしてください。 0を使用しますか? 0が本当の意味を持っているとしたら? NULLは価値の欠如です。 100回のうち99回は、コードの意図を最も明白にしています。性能に関しては、たとえそれがあったとしても、自分のコードが持つパフォーマンス上の問題と比較して、淡色になります。

0

トリックがありませんか?

class Message 
{ 
    DateTime LastRead; 
    bool Read; 
} 
+3

このバージョンは、(他の条件が正しいと仮定している 'NULL可能'缶)スタック割り当てを活用することができなくなり、それはカプセル化しないが、これは、 'NULL可能 'を使用することに意味的に等価です論理は単一のメンバーになります。 –

+0

@Adam Robinson、大部分は同意します。 1人のメンバーを使うことは、質問の前提条件だとは思っていませんでした(私はそれが暗示されていると思います)。そして、2つの情報を1つのフィールドにカプセル化しないことによって、私はスタックの割り当てポイントに従っていません - あなたはこれを展開できますか? – Brett

+0

これは前提条件ではありませんでしたが、2人ではなく1人のメンバーでエラーのないCRUD操作を実行する方が簡単です。私はスタック割り当てについて知らなかった:ポイントは、null可能な値がヒープに割り当てられていると思った点です!とにかく、私の質問はベストプラクティスに集中していました。 –

関連する問題