变量上下文问题

时间:2010-06-08 20:47:54

标签: c# datacontext

在下面的代码片段中,如果我遗漏了/////所包围的代码行,我会收到一条错误,内容为:“使用未分配的局部变量CurrentDate”。对于我来说,给CurrentDate赋予一个任意值似乎有点愚蠢,有更好的解决方法吗?

DateTime CurrentDate;

///////////////////////////
CurrentDate = DateTime.Now;
///////////////////////////

if(1==1)
{
CurrentDate = DateTime.Now.AddDays(1);
}

if(CurrentDate == DateTime.Now)
{
...
}

5 个答案:

答案 0 :(得分:3)

不要if (1 == 1)

说真的,如果编译器给你这个错误,通常要么是因为你的代码错了,要么因为它太复杂而且可以用另一种方式更好地表达,你不需要访问可能未分配的变量。

你能想出一个真实世界的例子,你可以通过进行简单的重构来获得这个错误吗?这会让你的问题更容易回答。

如果您遇到其中一种情况,可以使用其他一些方法:

DateTime CurrentDate = DateTime.MaxValue;
DateTime CurrentDate = default(DateTime);
DateTime? CurrentDate = null;

我喜欢最后一个选项,因为它表达了你的意思 - 你不知道它的价值。它使代码更加冗长,因为每次希望访问值时都有额外的重定向级别。您可以使用键入.Value所花费的时间来考虑您是否已正确处理可能为空的情况。

另外:您是否认为DateTime.Now的值可能会在第一次和第二次通话之间发生变化?最后的if语句看起来不会达到你想要的效果。

答案 1 :(得分:1)

你可以这样做:

DateTime CurrentDate;


if(1==1)
{
CurrentDate = DateTime.Now.AddDays(1);
}
else
{
///////////////////////////
CurrentDate = DateTime.Now;
///////////////////////////
}

if(CurrentDate == DateTime.Now)
{
...
}

这将消除编译器错误。

注意:在VS2008中,编译:

if(1==1)
{
CurrentDate = DateTime.Now.AddDays(1);
}
//else
//{
/////////////////////////////
//CurrentDate = DateTime.Now;
/////////////////////////////
//}

if(CurrentDate == DateTime.Now)
{
//
}

答案 2 :(得分:0)

为什么不直接分配

DateTime CurrentDate =  DateTime.Now; 

答案 3 :(得分:0)

这个例子有点令人费解,但是,不,没有更好的方法。

您必须为变量标题赋值给条件块,即使您确定该块将始终执行(在您的示例中为1 = 1)

但是,我建议不要将DateTime.Now作为初始化值,因为它通过一些mirracle,块不执行,情况应该很容易检测到,而DateTime.Now声音方式比DateTime.MinValue更真实

答案 4 :(得分:0)

我总是将对象设置为null,以便在未创建值时抛出空引用异常。然而正如Hans指出null在这种情况下不起作用,因为微软决定让DateTime不可为空。因此我通常使用DateTime.MinValue,因为它给我一个特定的值来检查,除了时间旅行总是在过去,不像DateTime.MaxValue,这是为了你们中的一些过时的32位窥视。

实施例

DateTime CurrentDate;

///////////////////////////
CurrentDate = DateTime.MinValue;
///////////////////////////

if(1==1)
{
CurrentDate = DateTime.Now.AddDays(1);
}

if(CurrentDate == DateTime.Now)
{
...
}