私はたくさん探していましたが、解決策を見つけることができませんでした。初期化されていない値(nullと同等)を含めることができるはずのDateTimeをどのように処理しますか? DateTimeプロパティの値が設定されているかどうかにかかわらず、クラスがあります。私はプロパティホルダーをDateTime.MinValueに初期化することを考えていました、そしてそれはそれから簡単にチェックされることができました。これはごくありふれた質問だと思いますが、どうしますか。
通常のDateTimeの場合、それらをまったく初期化しないと、参照型ではなく値型になるので、それらはDateTime.MinValue
に一致します。
次のように、NULL可能なDateTimeを使用することもできます。
DateTime? MyNullableDate;
または長い形式:
Nullable<DateTime> MyNullableDate;
そして最後に、あらゆる型のデフォルトを参照する方法が組み込まれています。これは参照型に対してnull
を返しますが、私たちのDateTimeの例ではDateTime.MinValue
と同じ値を返します。
default(DateTime)
.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/ja-jp/library/b3h38hb0.aspx
日付時刻? MyDateTime {get; set;}
MyDateTime = (dr["f1"] == DBNull.Value) ? (DateTime?)null : ((DateTime)dr["f1"]);
次の方法でもうまくいく
myClass.PublishDate = toPublish ? DateTime.Now : (DateTime?)null;
プロパティPublishDateはDateTimeであるべきですか?
私は null許容型 を使うことを考えます。
DateTime? myDate
の代わりにDateTime myDate
。
Null許容クラスを使用できます。
DateTime? date = new DateTime?();
これにはNULL可能なDateTimeを使用できます。
Nullable<DateTime> myDateTime;
または同じことがこのように書かれています:
DateTime? myDateTime;
私はいつもDateTime.MinValue
に時間を設定します。こうすれば私はNullErrorExceptionを得ないし、私がそれが私が設定されていないのを知っている日付と比較することができる。
DateTime
変数をnull
にすることはできませんが、コンパイラエラーなしでnull
と比較することができます。
DateTime date;
...
if(date == null) // <-- will never be 'true'
...
DateTimeをNullableに設定できます。デフォルトではDateTimeはNULL可能ではありません。いくつかの方法でそれをNULL可能にすることができます。 DateTime型の後に疑問符を使用しますか。 myTimeまたは汎用スタイルNullableを使用します。私はmsdnにいくつかのリンクを追加しました。
注意してください - Nullableを使うとき、それは明らかにもはや「純粋な」datetimeオブジェクトではありません。そのため、DateTimeメンバーに直接アクセスすることはできません。説明してみましょう。
Nullable <>を使うことで、基本的にDateTimeを入れ子にすることができます(ありがとうジェネリック) - それは明らかにその目的です。このコンテナには、前述の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の使い方はおそらく投稿する価値があると思います。同意しない場合は申し訳ありません。
edit:それは少し過度に特定的でケース依存であったので3番目のオプションを削除しました。
誰もがあなたにすでに答えを与えていますが、私はdatetimeを関数に渡すのを簡単にする方法を述べます
[エラー:system.datetimeを変換できませんか? system.datetimeへ]
DateTime? dt = null;
DateTime dte = Convert.ToDateTime(dt);
これで、問題なくdteを関数内に渡すことができます。
Throws ArgumentNullExceptionの単体テストを実行しているときに、DateTimeのパラメータとしてNullを指定しなければならなかったのと同じ問題がありました。
Assert.Throws<ArgumentNullException>(()=>sut.StartingDate = DateTime.Parse(null));
あなたが、時々、nullを期待しているなら、あなたはこのような何かを使うことができます:
var orderResults = Repository.GetOrders(id, (DateTime?)model.DateFrom, (DateTime?)model.DateTo)
リポジトリでnull可能なdatetimeを使用してください。
public Orders[] GetOrders(string id, DateTime? dateFrom, DateTime? dateTo){...}
日付/時刻データ型の性質上、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
フィールドをnullable
としてマークすることで、私の2番目のポイントを達成できます。値がない場合は、null
に設定できます。
public DateTime? DateModified { get; set; }
データベースからデータを取得するためにADO.NET
を使用すると、上記とは少し違った外観になります(DateTime.MinValue
の代わりにnull
を割り当てる)。
BlogPost blogPost = new BlogPost();
blogPost.DateModified = sqlDataReader.IsDBNull(0) ? (DateTime?)null : sqlDataReader.GetFieldValue<DateTime>(0);
blogPost.DatePublished = sqlDataReader.GetFieldValue<DateTime>(1);
これが混乱を解消するのに役立つことを願っています。私の応答が約8年後になっていることを考えると、あなたはおそらく今ではエキスパートC#プログラマーである:)