回答:
通常のDateTimeの場合、それらをまったく初期化しないと、それらはと一致DateTime.MinValue
します。これは、それが参照型ではなく値型だからです。
次のように、null許容のDateTimeを使用することもできます。
DateTime? MyNullableDate;
または長い形式:
Nullable<DateTime> MyNullableDate;
そして最後に、任意のタイプのデフォルトを参照する組み込みの方法があります。これはnull
参照型の場合は戻りますが、DateTimeの例の場合は次のものと同じ結果を返しDateTime.MinValue
ます。
default(DateTime)
または、C#の最新バージョンでは、
default
DateTime.MinValue
としても
MyNullableDate=date;
、それを設定するためにMyDate = MyNullableDate.Value;
、そこから読み取るように、そしてif(MyNullableDate.HasValue)
それがnullであるかどうかを確認するために
.NET 2.0以降を使用している場合は、null許容型を使用できます。
DateTime? dt = null;
または
Nullable<DateTime> dt = null;
じゃあ後で:
dt = new DateTime();
そして、あなたは値をチェックすることができます:
if (dt.HasValue)
{
// Do something with dt.Value
}
または、次のように使用できます。
DateTime dt2 = dt ?? DateTime.MinValue;
詳しくはこちらをご覧ください:http :
//msdn.microsoft.com/en-us/library/b3h38hb0.aspx
dt.GetValueOrDefault()
-これは最も効率的なオプションです。
日付時刻?MyDateTime {get; set;}
MyDateTime = (dr["f1"] == DBNull.Value) ? (DateTime?)null : ((DateTime)dr["f1"]);
null
が機能しないことを発見するのに役立ちました。する必要があります(DateTime?)null
。
これにはnull許容のDateTimeを使用できます。
Nullable<DateTime> myDateTime;
またはこのように書かれた同じもの:
DateTime? myDateTime;
時間は常にに設定しましたDateTime.MinValue
。これにより、NullErrorExceptionが発生せず、設定されていないことがわかっている日付と比較できます。
注意してください-Nullableを使用する場合、DateTimeメンバーに直接アクセスできないため、Nullableは明らかに「純粋な」datetimeオブジェクトではなくなります。説明してみます。
Nullable <>を使用することで、基本的にはDateTimeをnullが可能なコンテナ(ジェネリックに感謝)でラップします。これは明らかにその目的です。このコンテナには、前述のDateTimeオブジェクトへのアクセスを提供する独自のプロパティを呼び出すことができます。正しいプロパティ(この場合はNullable.Value)を使用した後、標準のDateTimeメンバー、プロパティなどにアクセスできます。
つまり、DateTimeオブジェクトにアクセスするための最良の方法に関して問題が思い浮かびます。いくつかの方法があります。1番はFARが最高で、2番は「理由」です。
Nullable.Valueプロパティを使用して、
DateTime date = myNullableObject.Value.ToUniversalTime(); //Works
DateTime date = myNullableObject.ToUniversalTime(); //Not a datetime object, fails
Convert.ToDateTime()を使用してnull許容オブジェクトをdatetimeに変換し、
DateTime date = Convert.ToDateTime(myNullableObject).ToUniversalTime(); //works but why...
現時点では答えは十分に文書化されていますが、Nullableの使用法はおそらく投稿する価値があったと思います。同意しない場合は申し訳ありません。
編集:3番目のオプションは少し限定的で、ケースに依存していたため削除しました。
日付/時刻データ型の性質上、null
値を含めることはできません。つまり、値を含める必要があります。空白にすることも、何も含めることはできません。日付/時刻変数に次のようにマークnullable
を付けると、NULL値を割り当てることができます。だからあなたが探しているのは2つのうちの1つです(もっとあるかもしれませんが、私は2つしか考えられません):
値がない場合は、日付/時刻の最小値を変数に割り当てます。最大の日付/時刻値を割り当てることもできます。日付/時刻の値を確認するときは、サイト全体で一貫していることを確認してください。min
またはの使用を決定し、それmax
を使い続けます。
日付/時刻変数をとしてマークしますnullable
。このようにnull
、変数がない場合は、日付/時刻変数をに設定できます。
例を使用して、最初のポイントを説明します。DateTime
変数の型がnullに設定することはできません、それは私がそれを設定しようと思って、この場合には、値を必要としますDateTime
値がない場合の最小値。
私のシナリオは、BlogPost
クラスがあるということです。多くの異なるフィールド/プロパティがありますが、この例では2つだけを使用することを選択しました。DatePublished
投稿がWebサイトに公開された日時で、日付/時刻の値を含める必要があります。DateModified
投稿が変更されたときなので、値を含める必要はありませんが、値を含めることができます。
public class BlogPost : Entity
{
public DateTime DateModified { get; set; }
public DateTime DatePublished { get; set; }
}
ADO.NET
データベースからデータを取得するために使用します(割り当てDateTime.MinValue
は値がないことです):
BlogPost blogPost = new BlogPost();
blogPost.DateModified = sqlDataReader.IsDBNull(0) ? DateTime.MinValue : sqlDataReader.GetFieldValue<DateTime>(0);
blogPost.DatePublished = sqlDataReader.GetFieldValue<DateTime>(1);
DateModified
フィールドをとしてマークすることで、2番目のポイントを達成できnullable
ます。これnull
で、値がない場合に設定できます。
public DateTime? DateModified { get; set; }
を使用ADO.NET
してデータベースからデータを取得すると、上記の方法とは少し異なります(のnull
代わりに割り当てますDateTime.MinValue
)。
BlogPost blogPost = new BlogPost();
blogPost.DateModified = sqlDataReader.IsDBNull(0) ? (DateTime?)null : sqlDataReader.GetFieldValue<DateTime>(0);
blogPost.DatePublished = sqlDataReader.GetFieldValue<DateTime>(1);
これが混乱を解消するのに役立つことを願っています。私の回答が約8年後であることを考えると、あなたはおそらく今ではエキスパートのC#プログラマーです:)