DateTime可选参数中的默认值应该是什么
本文关键字:默认值 是什么 参数 DateTime | 更新日期: 2023-09-27 18:11:42
通常,如果我有一个可选参数的可空类型,我会将null作为默认值。这样我就知道,如果值为空,调用者不想为该值指定任何值。
public void Foo(string text, string text2= null);
如果参数通常是正整数,我可以使用负数
public void Foo(string text, int index=-1);
DateTime呢?它不是空的,而且(据我所知)它没有一个没有意义的数字,也不能是一个真正的输入(像-1表示正整数)。或者有吗?在这种情况下你会用什么?
我也知道我可以使用nullable DateTime
类型,但这意味着方法调用者将不得不使用nullable,而不是简单地传递DateTime。
您可以使用c#中的?
操作符使值类型可为空:
DateTime? myDate = null;
从这里,你可以使参数可选:
void Foo(DateTime? myDate = null)
{
}
关于可空类型的进一步阅读。
这不是唯一的方法,但是你可以使用default(DateTime)
,但是你不能在可选参数中使用DateTime.MinValue
, MaxValue
或Now
,因为它们不是编译时常量。
当然,您不需要使用可选参数,如果您希望使用Min, Max或Now,您可以使用重载方法。
void Foo()
{
Foo(DateTime.MinValue);
}
void Foo(DateTime d)
{
}
如果您想要过度使用(好吧,也许不是过度使用,这样做有很多正当的理由),那么您可以定义一个新的日期类型,它可以理解它何时具有值:
class SmarterDateTime
{
public bool IsSet { get; set; }
// Wrapper around DateTime etc excluded.
}
至于什么应该是默认值,您可以选择让任何日期表示默认值,但对于可选参数之类的东西,您将受到限制。
我个人倾向于使用DateTime.MinValue
default (DateTime) -操作符default用于It
对于" DateTime的默认值是什么"这个问题,回答必须是:您只能使用default(DateTime)
。这是因为默认值必须是const
,而DateTime.MinValue
和DateTime.MaxValue
都只能是static readonly
,但请注意
default(DateTime) == DateTime.MinValue
到Kind
.
如果你想,你可以实现一个重载少一个参数(DateTime
),并从重载调用"main"方法传递你喜欢的值。
但是正如别人写的,问题是你写错了前提。
No, DateTime(几乎所有的ValueType
s。几乎所有的原因都是因为Nullable<Nullable<int>>
是非法的,即使Nullable<T>
是ValueType
) 是可空的。Nullable<DateTime>
或DateTime?
(相同的)
即使int
也是可空的,你知道吗?int?
: -)
DateTime.MinValue
为默认值
检查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);
}
如果你使用Nullable,你的函数的调用者可以只是传递一个常规的DateTime给它,所以他们不会注意到一个东西:)有隐式操作符会为你做这件事
如果你想在函数中设置一个默认值,你可以这样做:
public void Foo(DateTime? value = null)
{
if ( value == null )
{
value = ... // default
}
}
public DateTime method1()
{
if (condition)
return new DateTime(2007, 5, 30, 11, 32, 00);
else
return default(DateTime);
}
default语句将一个值类型初始化为它的默认值。在日期时间的情况下,该值也作为名为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;
}
// This is the best way to null out the DateTime.
//
DateTime dateTime2 = DateTime.MinValue;
您可以考虑使用值DateTime.MinValue
并使用重载。
取决于你的用例。
任何与实际数据不匹配的都可以工作,但这取决于你对它的使用(在某种程度上-1对于整数也是如此,因为它是一个完美的整数,只有当你把它作为一个只有正整数才有意义的整数使用时)。
如果你发送的是最小日期(对后面的所有foo都感兴趣),那么在最早的合理日期之前的任何日期都可以,像.Where(f -> f.When > myDate)
这样的代码甚至不必寻找特殊情况就可以工作。
同样地,最大日期也可以反过来(任何日期都在最近的合理日期之后)。
否则,只需完全避免使用默认值,而使用重载。