2013-04-29 20 views
39

値がある場合は、DateTimeの値をチェックする必要があります。デフォルトのDateTime値を確認するにはどうすればよいですか?

if (dateTime == default(DateTime)) 

または

if (dateTime == DateTime.MinValue) 

または個人的に私はそのかなり良い読めることから、3番目のバージョンを好むだろう

if (nullableDateTime.HasValue) 

NULL可能DateTime?を使用して:

は、私はいくつかのオプションがあります。 しかし、私たちのデータベースには、nullでないと定義されているdatetime列があります。 場合によっては、最初の2つのオプションを使用する必要があります。

defaultキーワードは、ジェネリックスで作業するときに使用する必要がありますが、この場合ははるかに読みやすくありません。 2番目のオプションを使用するときは、新しい空のDateTimeインスタンスのデフォルト値がDateTime.MinValueであることがわかります。このDateTime.MinValueは実装の詳細の匂いがしています。

"ベストプラクティス"の使用にはどのオプションを使用する必要がありますか?

// Or private, or maybe even public 
internal static readonly DateTime MagicValueForNullDateTimeInNonNullableColumns 
    = DateTime.MinValue; 

がわかりましたので、私は少しが少なく長ったらしい名前を作ると思いますが、あなたは私が何を意味するかを取得:

+0

コードブロックの後の最初の文では、「第2のバージョン」を意味しますか、「第3のバージョン」を意味しましたか? –

+0

更新されました;)変数が値を持っているかどうかをプロパティで明確に説明しているので、3番目のバージョンを意味しました。 – dasheddot

+0

実際に何が起こっても何が起きますか? – Servy

答えて

42

私はおそらく、これは本当に、明示的になるだろう。その値をどのように初期化するかはそれほど重要ではありません。あなたがしようとしていることは明らかです。

(もちろん、このためにNULL可能タイプにすることができます任意の時間を使用しています。私はあなたは、特定の状況でそうすることができなかったので、質問が聞かれたと仮定しています。)

+0

私のコンテキスト(null可能なdatetimeカラムをサポートするようにデータベースを適応させることはできません)では、残念ながらNullableを使わずに行かなければなりません。したがって、あなたの提案は最も受け入れやすいものです。なぜなら、チェックの背後にあるビジネスルールを明示的にすることは、より容易に実現できるからです。私はこのように行きます。それを受け入れ、ありがとう! – dasheddot

+2

@dasheddot:私はあなたのデータレイヤーにこのロジックを入れてNullable に変換して、他のすべてのコードが素敵なコードを使用し、上記のチェックを一度しか使わないようにします。 – Chris

14

私がする必要があります値がある場合はDateTimeの値をチェックしてください。

Nullable<DateTime>を必要としている教科書の状況をかなり説明しました。私はその選択肢に行くだろう。

(NULL以外のdbカラムに値を保持する必要がある場合は、明らかに何らかの変換層が必要ですが、できるだけdbに近い「魔法の」値を保持しようとします。あなたのC#コードをきれいで慣用的に保つようにしてください)。

4

"ベスト"プラクティスは、null可能なDateTimeを使用しています。 "マジック"番号を信頼しないため、ヌル値タイプはというように作成されました。

このアプローチで最も重要なのは、その意図です。は、の意味で、「デフォルトの」日付/時刻を持っていますか?

+0

私の文脈では、実際には、ビジネスルールの視野から有効な日付がユーザによって定義されていないことを意味します。だから私はNullableが最高だと思いますが、残念ながら私は最初の2つのバージョンに固執させてデータベースを適応させることはできません。 – dasheddot

0

おそらく、あなたのデータベースでgetdate()を使ってデフォルト値を設定し、すべてのnull値をmin値または好きなものに更新することができます。少なくとも1つの条件があります

関連する問題