【问题标题】:Set default value for DateTime in optional parameter [duplicate]在可选参数中设置 DateTime 的默认值 [重复]
【发布时间】:2011-03-03 03:31:09
【问题描述】:

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

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

【问题讨论】:

  • 这不是重复的时间跨度在 c# 中的工作方式与时间跨度不同。这在 c# 中使用 DateTimeConstantAttribute 是可行的,但时间跨度不支持这一点。

标签: c# datetime default optional-parameters


【解决方案1】:

C# 在这个意义上没有可选参数。如果您想让addedOn 可选,您应该编写一个不需要该参数的重载,并将DateTime.Now 传递给双参数版本。

【讨论】:

  • er.. 确定是 JS Bangs 吗?对于框架版本 .NET 3.5 及更低版本,您是正确的。否则,4.0及以上版本都支持。
  • @Pure.Krome,可选参数的默认值必须是编译时常量。所以这是支持的。 (不过,这个答案的措辞可以更好。)
  • 我也误解了措辞。 soz JS。
【解决方案2】:

不要使用可选参数:

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
}

【讨论】:

    【解决方案3】:

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

    编辑(因为 Anthony Pegram 正确,评论)...

    是的,你就是这样做的。

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

    .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 
    }
    

    甚至是来自慷慨回答的空值检查/空值参数。

    干杯安东尼。

    【讨论】:

    • 默认值必须是编译时间常数,所以即使在 4.0 中也无法使用。
    • 确认匿名。我会重新编辑我的帖子。干杯。
    【解决方案4】:

    有一个解决方法,利用可空类型和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
    }
    

    【讨论】:

    • 我真的不明白为什么可选参数必须是编译时常量。编译器可以轻松地从您编写的带有可选参数的一个方法创建 2 个方法...我通常更喜欢使用一个带有多个可选参数的方法而不是多个方法,它使代码更小,因此更易于阅读。
    • 你可以在这里使用合并:addedOn = addedOn ?? DateTime.Now
    • Nullables 会在你的代码深处导致转换问题,所以我不是粉丝。我对 C# 越来越失望。我的意思是,即使 VB.net 也有文字日期,例如: Optional addedOn As DateTime = #12:00:00 PM#
    • VS 不会用这段代码编译。相反,我使用 DateTime date = default(DateTime),然后检查是否 date==default(DateTime)
    【解决方案5】:

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

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

    似乎更短,更易读。

    【讨论】:

    • 它不是更具可读性,但它允许我访问 .Year/.Month 文件。
    【解决方案6】:

    我猜你并不是真的想要addedOn = DateTime.Now,因为这表明你永远不会得到任何结果,因为所有内容都会在“现在”之前添加。 :)

    默认的DateTime 可以这样设置:

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

    更新
    如果您使用 SQL Server,请不要忘记它不接受默认 (DateTime) 即 1/1/0001。 SQL Server 的最小 DateTime 是 1/1/1753 (explanation)。不过,SQL 的 DateTime2 接受 1/1/0001。

    【讨论】:

    • 不明白为什么这没有被标记为答案,它允许更容易地使用日期时间,因为日期时间? != 日期时间
    • 这是正确答案。
    • 我只是将别人所说的话发声,这是正确的答案。其他的基本上都是在骗系统。
    猜你喜欢
    • 2011-02-13
    • 2018-12-04
    • 1970-01-01
    • 2011-10-06
    • 2011-12-11
    • 1970-01-01
    • 2018-11-27
    • 2015-11-05
    • 1970-01-01
    相关资源
    最近更新 更多