2011-10-20 71 views
22

通常情況下,如果我有一個可選參數的可爲空類型,我會將null作爲默認值。這樣我就知道如果這個值爲null,調用者不想爲那個值指定任何值。什麼應該是DateTime可選參數的默認值?

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

如果參數通常是一個正整數,我可以用一個負數

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

如何日期時間?它不是可空的,並且(據我所知)它沒有一個無意義的數字,也不能是真正的輸入(例如-1爲正整數)。或者在那裏?你會在這種情況下使用什麼?

我也知道我可以使用可爲空的DateTime類型,但這意味着方法調用者將不得不使用Nullable以及相反方便地傳遞DateTime。

+0

[C#4.0可以重複使用TimeSpan作爲默認值的可選參數?](http://stackoverflow.com/questions/2168798/c-sharp-4-0-cani-i- use-a-timespan-as-an-optional-parameter-with-a-default-value) – nawfal

回答

31

你可以讓值類型爲null的使用?運營商在C#:

DateTime? myDate = null;

由此看來,可以使參數可選:

void Foo(DateTime? myDate = null) 
{ 
} 

Further reading on Nullable Types.

這是但不是唯一的方法來皮膚貓,但是,你可以使用default(DateTime),但喲ü不能在可選參數中使用DateTime.MinValue,MaxValueNow,因爲它們不是編譯時間常量。

當然,您不需要使用可選參數,如果您希望使用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

我知道,但這有點不受歡迎,因爲調用者代碼將不得不調用它以及可爲空 –

+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

這不會「空出」日期時間。這仍然是一個有效的價值。你如何區分*有意識地指定這個價值,還有一個是「缺席」的? –

13

默認(日期時間) - 運營商默認是爲它

+1

它的實際價值是多少? –

+2

對於其他人想知道的,實際值是:'1-1-0001 0:00:00' – natli

+0

它相當於'DateTime.MinValue'(第一年第一個月的第一天的午夜)。 – Kjartan

3

如果使用可空你的函數的調用者可以只通過一個常規的日期時間來,所以他們不會注意到一件事: )有隱含的運營商,會爲你

如果你想設置你的函數默認你可以做這樣做:

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

檢查的日期時間默認參數,它價值是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); 
} 
1

您可以考慮使用的價值DateTime.MinValue和使用重載。

6

在「什麼可以作爲DateTime的默認值」這個問題上,答覆必須是:您只能使用default(DateTime)。這是因爲默認值必須const兩者DateTime.MinValueDateTime.MaxValue只有static readonly,但要注意

default(DateTime) == DateTime.MinValue 

下到Kind

如果你願意,你可以實現過載少了一個參數(DateTime),再從過載稱之爲「主」的方法傳遞你喜歡的值。

但正如別人寫的,問題在於你寫錯了地方。

沒有,日期時間(因爲幾乎所有ValueType秒。幾乎所有因爲Nullable<Nullable<int>>是非法的,即使Nullable<T>ValueType爲空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,如下面的例子

代碼段

public DateTime? method2() 
{ 

    if (condition) 

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

    else 

    return null; 

} 
+0

使用MVC,我有一個DateTime作爲可選項,但我打電話試圖轉換爲日期時間的函數不起作用。添加?到函數返回類型完全修復它..謝謝! –

0

取決於您的用例。

任何與實際數據都不匹配的東西都可以工作,但這取決於您對它的使用(所以對於整數來說這樣做是-1,因爲它只是一個完美的整數,僅供您使用,正整數是有意義的)。

如果您發送的是最小日期(有興趣在所有FOO是更高版本),然後之前,最早的明智日期將做任何日期,這樣的代碼.Where(f -> f.When > myDate)甚至不必去尋找這種特殊情況會工作。

同樣的最大日期是相反的(任何日期將在最新的合理日期之後)。

否則,只是完全避免使用默認值,而是重載。

+0

「重載而不是」你的意思是在這兩種方法中重複方法體? –

+0

理想情況下儘可能多的可以通過一個調用另一個來共享,或者通過調用大量代碼的私有方法來共享。平衡在哪裏取決於你在這些方法中做了什麼。 –

+0

是的,我同意,但如果一方打電話給另一方或兩方打電話的方法相同,我們仍然需要解決原來的問題,不是嗎? –

相關問題