我正在编写一个方法,它将DateTime
值作为其中一个参数。我决定它是可选参数,所以我继续尝试将DateTime.MinValue
作为默认值。
private void test(string something, DateTime testVar = DateTime.MinValue) {
}
然而,这会产生错误:
'testVar'的默认参数值必须是编译时常量。
使用此代码似乎工作正常。
private void test(string something, DateTime testVar = new DateTime()) {
}
我获得了使用DateTime.MinValue instead of new DateTime()的建议,因为它是自我记录的。由于new DateTime()
基本上与DateTime.MinValue
无法使用的基本相同?如果我将new DateTime()
留下来,也会有任何潜在的问题吗?
答案 0 :(得分:12)
DateTime.MinValue
定义为:
public static readonly DateTime MinValue
与const
不同。由于readonly
值不是编译时常量(即在编译时值不),因此无法使用它。
使用new DateTime()
的原因是因为表达式在编译时已知。这与撰写default(DateTime)
相同。例如,以下表达式中的result == true
:
var result = new DateTime() == default(DateTime);
答案 1 :(得分:5)
DateTime.MinValue为readonly,根据MSDN,readonly值不是编译时常量:
readonly关键字与const关键字不同。 const字段只能在字段声明时初始化。可以在声明或构造函数中初始化只读字段。因此,readonly字段可以具有不同的值,具体取决于所使用的构造函数。此外,虽然const字段是编译时常量,但readonly字段可用于运行时常量
答案 2 :(得分:4)
DateTime.MinValue
(和DateTime.MaxValue
)是public static readonly
成员,而不是编译时常量。
为什么不使用可以为空的DateTime(DateTime.MinValue
),而不是使用DateTime?
作为默认值。这使得您的意图比默认为datetime的最低值更明确。
这样的事情:
private void test(string something, DateTime? testVar = null )
{
if ( testVar.HasValue )
{
DoSomethingUsefulWithTimestamp( something , testVar.Value ) ;
}
else
{
DoSomethingElseWithoutTimestamp( something ) ;
}
return ;
}
private void DoSomethingUsefulWithTimestamp( string something , DateTime dt )
{
... // something useful
}
private void DoSomethingElseWithoutTimestamp( string something )
{
... // something useful
}
或者,在方法体中设置默认值:
private void test(string something, DateTime? testVar = null )
{
DateTime dtParameter = testVar ?? DateTime.MinValue ;
DoSomethingUsefulWithTimestamp( something , dtParameter ) ;
}
答案 3 :(得分:3)
另一种方法是使用2个方法重载:
这样做的好处是你不必检查参数是否为空,并且很清楚你的意图是什么。在内部,方法1可以向数据库添加null。
答案 4 :(得分:1)
基于我所知道的DateTime的默认值是DateTime.MinValue所以为什么不使用new DateTime()
答案 5 :(得分:0)
使用此声明
private void test(string something, DateTime testVar = new DateTime()) {
if ( testVar != new DateTime() )
{
DoSomethingUsefulWithTimestamp( something , testVar.Value ) ;
}
else
{
DoSomethingElseWithoutTimestamp( something ) ;
}
}
它应该工作得更好。