2011-10-20 67 views
22

通常情况下,如果我有一个可选参数的可为空类型,我会将null作为默认值。这样我就知道如果这个值为null,调用者不想为那个值指定任何值。什么应该是DateTime可选参数的默认值?

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

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

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

如何日期时间?它不是可空的,并且(据我所知)它没有一个无意义的数字,也不能是真正的输入(例如-1为正整数)。或者在那里?你会在这种情况下使用什么?

我也知道我可以使用可为空的DateTime类型,但这意味着方法调用者将不得不使用Nullable以及相反方便地传递DateTime。

+0

[C#4.0可以重复使用TimeSpan作为默认值的可选参数?](http://stackoverflow.com/questions/2168798/c-sharp-4-0-cani-i- use-a-timespan-as-an-optional-parameter-with-a-default-value) – nawfal

回答

31

你可以让值类型为null的使用?运营商在C#:

DateTime? myDate = null;

由此看来,可以使参数可选:

void Foo(DateTime? myDate = null) 
{ 
} 

Further reading on Nullable Types.

这是但不是唯一的方法来皮肤猫,但是,你可以使用default(DateTime),但哟ü不能在可选参数中使用DateTime.MinValue,MaxValueNow,因为它们不是编译时间常量。

当然,您不需要使用可选参数,如果您希望使用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

+0

我知道,但这有点不受欢迎,因为调用者代码将不得不调用它以及可为空 –

+1

@LouisRhys :不明确他们不会 - 有一个从DateTime到DateTime的隐式转换。 –

+0

@JonSkeet @adam在那里?但是,我记得有时候我遇到过这样的情况:我期望代码能够用'DateTime'工作,但不能用'DateTime?'(不知道代码是什么) –

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

这不会“空出”日期时间。这仍然是一个有效的价值。你如何区分*有意识地指定这个价值,还有一个是“缺席”的? –

13

默认(日期时间) - 运营商默认是为它

+1

它的实际价值是多少? –

+2

对于其他人想知道的,实际值是:'1-1-0001 0:00:00' – natli

+0

它相当于'DateTime.MinValue'(第一年第一个月的第一天的午夜)。 – Kjartan

3

如果使用可空你的函数的调用者可以只通过一个常规的日期时间来,所以他们不会注意到一件事: )有隐含的运营商,会为你

如果你想设置你的函数默认你可以做这样做:

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

检查的日期时间默认参数,它价值是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); 
} 
1

您可以考虑使用的价值DateTime.MinValue和使用重载。

6

在“什么可以作为DateTime的默认值”这个问题上,答复必须是:您只能使用default(DateTime)。这是因为默认值必须const两者DateTime.MinValueDateTime.MaxValue只有static readonly,但要注意

default(DateTime) == DateTime.MinValue 

下到Kind

如果你愿意,你可以实现过载少了一个参数(DateTime),再从过载称之为“主”的方法传递你喜欢的值。

但正如别人写的,问题在于你写错了地方。

没有,日期时间(因为几乎所有ValueType秒。几乎所有因为Nullable<Nullable<int>>是非法的,即使Nullable<T>ValueType为空Nullable<DateTime>DateTime?(相同的东西)

即使int是可以为空的,你知道吗?它的默认值int? :-)

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; 

} 
+0

使用MVC,我有一个DateTime作为可选项,但我打电话试图转换为日期时间的函数不起作用。添加?到函数返回类型完全修复它..谢谢! –

0

取决于您的用例。

任何与实际数据都不匹配的东西都可以工作,但这取决于您对它的使用(所以对于整数来说这样做是-1,因为它只是一个完美的整数,仅供您使用,正整数是有意义的)。

如果您发送的是最小日期(有兴趣在所有FOO是更高版本),然后之前,最早的明智日期将做任何日期,这样的代码.Where(f -> f.When > myDate)甚至不必去寻找这种特殊情况会工作。

同样的最大日期是相反的(任何日期将在最新的合理日期之后)。

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

+0

“重载而不是”你的意思是在这两种方法中重复方法体? –

+0

理想情况下尽可能多的可以通过一个调用另一个来共享,或者通过调用大量代码的私有方法来共享。平衡在哪里取决于你在这些方法中做了什么。 –

+0

是的,我同意,但如果一方打电话给另一方或两方打电话的方法相同,我们仍然需要解决原来的问题,不是吗? –

相关问题