通常,如果我有一个可选参数的可空类型,我会将null作为默认值。这样我知道如果值为null,则调用者不希望为该值指定任何值。
public void Foo(string text, string text2= null);
如果参数通常是正整数,我可以使用负数
public void Foo(string text, int index=-1);
DateTime怎么样?它不是可空的,并且(据我所知)它没有无意义的数字,也不能成为真正的输入(如正整数的-1)。还是有吗?在这种情况下你会用什么?
我也知道我可以使用可空的DateTime
类型,但这意味着方法调用者必须使用Nullable以及反对只是方便地传递DateTime。
答案 0 :(得分:33)
您可以使用C#中的?
运算符使值类型为空:
DateTime? myDate = null;
由此,您可以将参数设为可选:
void Foo(DateTime? myDate = null)
{
}
Further reading on Nullable Types.
这不是剥皮猫的唯一方法,但是你可以使用default(DateTime)
,但不能使用DateTime.MinValue
,MaxValue
或{{ 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)
。这是因为默认值必须为const
且DateTime.MinValue
和DateTime.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)
这样的代码将工作,甚至不需要查找该特殊情况
同样,反向的最大日期(最新合理日期之后的任何日期)。
否则,只需完全避免使用默认值,而是重载。