2011-10-20 11 views
22

通常、オプションのパラメータにnull可能な型がある場合、nullをデフォルト値として配置します。この方法では、値がnullの場合、呼び出し元は値を指定したくないことがわかります。DateTimeオプションのパラメータのデフォルト値は?

public void Foo(string text, string text2= null); 

パラメータは、通常、正の整数であれば、私は負の数のDateTimeについて

public void Foo(string text, int index=-1); 

方法を使用することができますか?それはnullableではなく、(私が知る限り)それは真の入力ではない無意味な数をもたない(正の整数に対して-1のように)。それとも?この状況で何を使用しますか?

null可能なDateTime型を使用することもできますが、これはメソッド呼び出し側がNullableを使用するだけでなく、便利にDateTimeを渡す必要があることを意味します。

+0

[C#4.0:TimeSpanをオプションのパラメータとしてデフォルト値で使用できますか?](http://stackoverflow.com/questions/2168798/c-sharp-4-0-can-i-デフォルト値のあるオプションパラメータとしてタイムスタンプを使用する) – nawfal

答えて

31

あなたは、C#で?演算子を使用して値の型がNULL可能にすることができます。このことから

DateTime? myDate = null;

、あなたはオプションのパラメータを行うことができます。

void Foo(DateTime? myDate = null) 
{ 
} 

Further reading on Nullable Types.

はこれがありますしかし、猫の皮膚に唯一の方法ではない、あなたはdefault(DateTime)を使用することができますu できませんDateTime.MinValueMaxValue、またはNowはオプションのパラメータではコンパイル時定数ではないため使用できません。

もちろん、オプションのパラメータを使用する必要はありません。Min、Max、またはNowを使用する場合は、オーバーロードされたメソッドを使用できます。

void Foo() 
{ 
    Foo(DateTime.MinValue); 
} 

void Foo(DateTime d) 
{ 
} 

あなたはやり過ぎ(まあ、多分やり過ぎではない、正当な理由の多くは、これを行うために)行きたい場合は、それは価値がある場合、あなたは理解して、新しい日付のタイプを定義することができます。

class SmarterDateTime 
{ 
    public bool IsSet { get; set; } 

    // Wrapper around DateTime etc excluded. 
} 

デフォルトのは、任意の日付を希望する場合はデフォルトにすることができますが、オプションのパラメータなどの場合は制限があります。

個人的には、私はDateTime.MinValueを使う傾向があります。

+0

私は知っていますが、これは少し好ましくありません。なぜなら、呼び出し側のコードはnullableで呼び出す必要があるからです。 –

+1

@LouisRhys :明示的にはそうではありません。「DateTime」から「DateTime?」への暗黙的な変換があります。 –

+0

@JonSkeet @adamはありますか?しかし、それでも、私は、コードが 'DateTime'で動作し、' DateTime? 'で動作しないと思う状況に遭遇することがあることを覚えています。(コードが何であったかはわかりません) –

1
// This is the best way to null out the DateTime. 
    // 
    DateTime dateTime2 = DateTime.MinValue; 
+3

これは、DateTimeを「無効」にしません。それでも有効な値です。その値を指定することと、「欠けている」こととを区別する方法はありますか? –

13

デフォルト(日時) - オペレータのデフォルトは、あなたがNULL可能を使用している場合、彼らは事を気づかれないように、あなたの関数の呼び出し元がちょうど、それに定期的な日時を渡すことができますそれ

+1

実際の値は何ですか? –

+2

疑問に思う人は、実際の値は '1-1-0001 0:00:00'です。 – natli

+0

これは、' DateTime.MinValue'(最初の1年の最初の月の最初の日の深夜)に相当します。 – Kjartan

3

を対象としています。

public void Foo(DateTime? value = null) 
{ 
    if (value == null) 
    { 
     value = ... // default 
    } 
} 
4

それは、datetime既定のパラメータをチェックしてください。)あなたがあなたの関数にデフォルトを設定したい場合はあなたが行うことができます

のためにこれを行います暗黙の演算子はありますsの値は、あなたが値DateTime.MinValueと使用のオーバーロードを使用して検討するかもしれない1/1/0001 12:00:00 AM

private void M(Int32 x = 9, String s = “A”, DateTimedt = default(DateTime), Guidguid = new Guid()) { 
Console.WriteLine(“x={0}, s={1}, dt={2}, guid={3}”, x, s, dt, guid); 
} 
6

「DateTimeのデフォルト値は何ですか?」という質問では、応答は次のようにする必要があります。default(DateTime)しか使用できません。これはデフォルト値constでなければならないため、両方のDateTime.MinValueDateTime.MaxValuestatic readonlyをしているが、注意してKindにダウン

default(DateTime) == DateTime.MinValue 

1つ少ないパラメータ(DateTime)でオーバーロードを実装し、そのオーバーロードから "main"メソッドを呼び出すことで、好きな値を渡すことができます。

しかし、他の人が書いたように、問題はあなたが間違った前提を書いていることです。

いいえ、日時(とほぼすべてValueType S。ほぼすべてNullable<Nullable<int>>Nullable<T>ValueTypeであっても、違法であるため)はNULLあります。 Nullable<DateTime>またはDateTime?(同じもの)

でも、intはヌル可能ですか?それはデフォルト値だとint? :-)

2

コードスニペット

public DateTime method1() 
{ 

    if (condition) 

    return new DateTime(2007, 5, 30, 11, 32, 00); 

    else 

    return default(DateTime); 

} 

デフォルトの文は、値型を初期化します。日時の場合、この値はDateTime.MinValueという静的プロパティとしても公開されます。 C#1.0を使用している場合、 "default(DateTime)"というステートメントは "DateTime.MinValue"に相当します。この特別な値を「マーカー」値の一種として使うことができます。つまり、返された場合は無効な日時を示します。

再びC#2.0を使用している場合、次の例に示すように、それは、null許容型と呼ばれるものを使用することも可能であり、実際にNULLを返す

コードスニペット

public DateTime? method2() 
{ 

    if (condition) 

    return new DateTime(2007, 5, 30, 11, 32, 00); 

    else 

    return null; 

} 
+0

MVCを使用して、私はオプションとしてDateTimeを持っていましたが、私が試してdatetimeに変換しようとしていた関数は動作しませんでした。追加?関数の戻り値の型は完全に固定されています..ありがとう! –

5

DateTime.MinValueとなりデフォルト値

0

ご使用の場合によって異なります。

実際のデータと一致しないものは動作しますが、それはあなたの使い方によって決まります(整数の場合は-1となります。正の整数は意味をなさない)。

最小の日付(後ですべてのfooに興味があります)を送信する場合は、最も早い賢明な日付より前の日付が実行され、.Where(f -> f.When > myDate)のようなコードは特殊なケースを探す必要もありません。

逆の最大日付(最新の合理的な日付より後の日付)も同様です。

それ以外の場合は、デフォルトを完全に使用せず、代わりに過負荷を避けてください。

+0

「代わりにオーバーロードする」とは、両方のメソッドでメソッド本体を繰り返すことを意味しますか? –

+0

理想的には、可能な限り多くのコードを共有するか、コードの大部分をプライベートメソッドとして呼び出すことによって共有できます。バランスがそこにある場所は、あなたが言った方法で何をしているかによって異なります。 –

+0

はい、私は同意しますが、一方が他方を呼び出す場合、または両方が同じ方法を呼び出す場合は、元の問題を解決する必要がありますか? –

関連する問題