在可选参数中设置DateTime的默认值

Sad*_*egh 80 c# datetime default optional-parameters

如何在可选参数中设置DateTime的默认值?

public SomeClassInit(Guid docId, DateTime addedOn = DateTime.Now???)
{
    //Init codes here
}
Run Code Online (Sandbox Code Playgroud)

Luk*_*keH 124

有一种解决方法,利用可空类型和null编译时常量这一事实.(虽然这有点像黑客,我建议避免它,除非你真的不能.)

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

    //Init codes here
}
Run Code Online (Sandbox Code Playgroud)

一般来说,我更喜欢其他答案中建议的标准重载方法:

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

public SomeClassInit(Guid docId, DateTime addedOn)
{
    //Init codes here
}
Run Code Online (Sandbox Code Playgroud)

  • 你可以在这里使用coalesce:`addedOn = addedOn ?? DateTime.Now` (6认同)
  • VS不会使用此代码进行编译。相反,我使用DateTime date = default(DateTime),然后检查是否date == default(DateTime) (2认同)

小智 32

我想你并不是真的想要,addedOn = DateTime.Now因为那会暗示你永远不会得到任何结果,因为所有内容都会在'Now'之前添加.:)

DateTime可以像这样设置默认值:

public void SomeClassInit(Guid docId, DateTime addedOn = default(DateTime))
Run Code Online (Sandbox Code Playgroud)

更新
如果您处理SQL Server,请不要忘记它不接受默认值(DateTime)是什么是1/1/0001.SQL Server的最小DateTime是1/1/1753(解释).但是SQL的DateTime2接受1/1/0001.


Ale*_*ikh 24

我稍微修改了LukeH的解决方案:

public void SomeClassInit(Guid docId, DateTime? addedOn = null)
{
    DateTime TargetDateTimeProperty = addedOn ?? DateTime.Now;
}
Run Code Online (Sandbox Code Playgroud)

看起来更短,更易读.


mun*_*ent 5

不要使用可选参数:

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
}
Run Code Online (Sandbox Code Playgroud)


Pur*_*ome 5

.NET 4.0 确实有可选参数。(谷歌也是你的朋友,在这里。)

编辑(因为安东尼佩格拉姆正确,评论)...

是的,这就是你要做的。

但是DateTime.Now(该类上的静态属性)直到运行时才知道。因此,您不能将其用作可选

.NET 3.5 不会......所以你必须按照 JS Bangs 所说的去做......

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

public SomeClassInit(Guid docId, DateTime addedOn = DateTime.Now???) 
{ 
    //Init codes here 
}
Run Code Online (Sandbox Code Playgroud)

甚至来自 munificent's answer 的空检查/空值参数。

干杯安东尼。