DateTime可选参数中的默认值应该是多少?

时间:2011-10-20 10:17:55

标签: c# .net datetime optional-parameters

通常,如果我有一个可选参数的可空类型,我会将null作为默认值。这样我知道如果值为null,则调用者不希望为该值指定任何值。

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

如果参数通常是正整数,我可以使用负数

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

DateTime怎么样?它不是可空的,并且(据我所知)它没有无意义的数字,也不能成为真正的输入(如正整数的-1)。还是有吗?在这种情况下你会用什么?

我也知道我可以使用可空的DateTime类型,但这意味着方法调用者必须使用Nullable以及反对只是方便地传递DateTime。

10 个答案:

答案 0 :(得分:33)

您可以使用C#中的?运算符使值类型为空:

DateTime? myDate = null;

由此,您可以将参数设为可选:

void Foo(DateTime? myDate = null)
{
}

Further reading on Nullable Types.

这不是剥皮猫的唯一方法,但是你可以使用default(DateTime),但不能使用DateTime.MinValueMaxValue或{{ 1}}在可选参数中,因为它们不是编译时常量。

当然,您不需要使用可选参数,如果您希望使用Min,Max或Now,则可以使用重载方法。

Now

如果你想过度杀戮(好吧,也许不是矫枉过正,有很多正当理由这样做),那么你可以定义一个新的日期类型,了解它何时有一个值:

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

void Foo(DateTime d)
{
}

至于什么应该是默认,如果您愿意,您可以选择让任何日期代表默认值,但对于可选参数这样的内容,您将受到限制。

就个人而言,我倾向于使用class SmarterDateTime { public bool IsSet { get; set; } // Wrapper around DateTime etc excluded. }

答案 1 :(得分:15)

default(DateTime) - 运算符默认值适用于它

答案 2 :(得分:6)

在问题“什么可以是DateTime的默认值”时,响应必须是:您只能使用default(DateTime)。这是因为默认值必须为constDateTime.MinValueDateTime.MaxValue都只是static readonly,但请注意

default(DateTime) == DateTime.MinValue

下至Kind

如果你想要你可以用一个较少的参数(DateTime)实现一个重载,并从那个重载调用“main”方法传递你喜欢的值。

但正如其他人所写,问题在于你写错了前提。

不,日期时间(与几乎所有ValueType一样。几乎所有因为Nullable<Nullable<int>>都是非法的,即使Nullable<T>ValueType可以为空Nullable<DateTime>DateTime?(同样的事情)

即使int可以为空,你知道吗? int?: - )

答案 3 :(得分:5)

DateTime.MinValue将是默认值。

答案 4 :(得分:4)

检查dateTime默认参数,其值为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);
}

答案 5 :(得分:3)

如果你使用Nullable你的函数的调用者可以只传递一个常规的DateTime,所以他们不会注意到一件事:)有隐式运算符会为你做这个

如果你想在你的功能中设置默认值,你可以这样做:

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

答案 6 :(得分: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;

}

答案 7 :(得分:1)

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

答案 8 :(得分:1)

您可以考虑使用值DateTime.MinValue并使用重载。

答案 9 :(得分:0)

取决于您的用例。

任何与真实数据不匹配的东西都会起作用,但这取决于你对它的使用(所以对整数来说这样做是-1,因为它只是一个非常好的整数,只有你使用它才有一个只有正数整数有意义。)

如果您要发送最短日期(对以后的所有foo感兴趣),那么在最早的合理日期之前的任何日期都可以,并且像.Where(f -> f.When > myDate)这样的代码将工作,甚至不需要查找该特殊情况

同样,反向的最大日期(最新合理日期之后的任何日期)。

否则,只需完全避免使用默认值,而是重载。