2010-06-13 78 views
61

中設置DateTime的默認值如何在可選參數中設置DateTime的默認值?在可選參數

public SomeClassInit(Guid docId, DateTime addedOn = DateTime.Now???) 
{ 
    //Init codes here 
} 
+0

這不是重複的Timespans在c#中的工作方式與時間跨度不同。這是可以在C#中用'DateTimeConstantAttribute'實現的,但時間跨度不支持這個。 – leat 2017-05-04 20:56:01

回答

97

有一個解決方法,利用可空類型和事實null是一個編譯時常量。 (這是一個黑客攻擊的一位,雖然,我建議避免它,除非你真的不能。)

public void SomeClassInit(Guid docId, DateTime? addedOn = null) 
{ 
    if (!addedOn.HasValue) 
     addedOn = DateTime.Now; 

    //Init codes here 
} 

一般情況下,我寧願標準的重載方法建議在其他的答案:

public SomeClassInit(Guid docId) 
{ 
    SomeClassInit(docId, DateTime.Now); 
} 

public SomeClassInit(Guid docId, DateTime addedOn) 
{ 
    //Init codes here 
} 
+1

我不明白爲什麼可選參數必須是編譯時常量。編譯器可以很容易地創建你使用可選參數編​​寫的兩個方法......我通常更喜歡使用一個可選的參數而不是幾個方法的方法,它使代碼更小,因此更易於閱讀。 – user276648 2012-05-22 08:48:02

+6

你可以在這裏使用coalesce:'addedOn = addedOn ?? DateTime.Now' – 2012-09-19 20:36:48

+0

可能會導致代碼深處的投射問題,所以我不是粉絲。我在C#中越來越失望。我的意思是,即使VB.net有文字日期,如:可選addedOn As DateTime =#12:00:00 PM# – Brain2000 2014-03-03 17:40:44

2

C#在這個意義上沒有可選參數。如果要使addedOn爲可選項,則應編寫一個不需要該參數的重載,並將DateTime.Now傳遞給雙參數版本。

+1

呃..當然是那個JS Bangs?對於框架版本.NET 3.5及更低版本,您是正確的。否則,4.0及以上版本支持。 – 2010-06-13 04:54:51

+1

@ Pure.Krome,可選參數的默認值必須是編譯時間常量。所以這是*不支持。 (然而,這個答案可能措辭更好。) – 2010-06-13 04:57:51

+1

我也誤解了措辭。 soz JS。 – 2010-06-13 05:09:15

4

不要使用一個可選的參數:

public SomeClassInit(Guid docId, DateTime addedOn) 
{ 
    SomeClassInitCore(docId, addedOn); 
} 

public SomeClassInit(Guid docId) 
{ 
    SomeClassInitCore(docId, null); 
} 

private SomeClassInitCore(Guid docId, DateTime? addedOn) 
{ 
    // set default value 
    if (addedOn.IsNull) addedOn = DateTime.Now; 

    //Init codes here 
} 
4

.NET 4.0 does have optional parameters。 (google is also your friend,在這裏。)

EDIT(因爲安東尼Pegram正確,評論)...

是的,這是你會怎麼做。

DateTime.現在(靜態屬性,這個類的)不知道,直到運行時。因此,您不能將其作爲可選的

.NET 3.5不...這樣的話,你會做什麼JS邦斯說...

public SomeClassInit(Guid docId) 
{ 
    return SomeClassInit(docId, DateTime.Now); 
} 

public SomeClassInit(Guid docId, DateTime addedOn = DateTime.Now???) 
{ 
    //Init codes here 
} 

甚至零檢查/空值從優厚的答案參數。

乾杯安東尼。

+0

默認值必須是編譯時間常量,所以即使在4.0中也不會運行。 – 2010-06-13 04:58:38

+0

確認Anothony。我會重新編輯我的帖子。乾杯。 – 2010-06-13 05:03:02

21

我稍微修改LukeH的解決方案爲:

public void SomeClassInit(Guid docId, DateTime? addedOn = null) 
{ 
    DateTime TargetDateTimeProperty = addedOn ?? DateTime.Now; 
} 

這是短,更具可讀性,它似乎。

19

我想你並不是真的想要addedOn = DateTime.Now,因爲這會暗示你永遠不會得到任何結果,因爲在'現在'之前所有東西都會被添加。 :)

默認DateTime可以這樣設置:

public void SomeClassInit(Guid docId, DateTime addedOn = default(DateTime)) 

更新
如果你處理SQL Server中,不要忘了,它不接受默認設置(日期時間)什麼是1/1/0001。 SQL Server的最小日期時間爲1/1/1753(explanation)。雖然SQL的DateTime2接受1/1/0001。

+0

不明白爲什麼這不標記爲答案,它允許更容易處理日期時間,因爲日期時間? != datetime – user3800527 2017-07-11 08:57:52

+0

這是正確的答案。 – 2017-10-12 10:11:28

+0

我只是想表達別人的意見,這是正確的答案。其他人基本上只是在欺騙系統。 – CyberClaw 2018-01-17 15:42:02