null和未初始化之间的区别?

时间:2011-02-23 20:23:59

标签: c# null initialization

当我在C#中编写以下代码时:

SqlCeCommand command;
try
{
    // The command used to affect the data
    command = new SqlCeCommand
                  { 
                     // init code removed for brevity
                  };

    // Do stuff 
    // Do more stuff
}
finally
{
    if (command != null)
        command.Dispose();
}

Resharper对我的命令检查抱怨!= null。它说可能没有分配命令(因为它可能会失败一些如何构建并仍然击中try块)。

所以我将命令声明更改为SqlCeCommand command = null;,每个人都很高兴。

但是我想知道区别是什么?

为什么不默认为null? 意义: C#如何从不仅将默认局部变量默认为空来受益?

6 个答案:

答案 0 :(得分:8)

局部变量没有默认值。部分语言。

答案 1 :(得分:5)

如果你想让它为null那么你需要告诉它。这是为了捕捉错误。 ReSharper等编译器和实用程序会搜索所有执行路径,并确保在使用变量之前对其进行初始化。这是为了捕捉常见的编码错误。因此,没有额外的“甚至无效”值可能,它只是由编译器(或其他)完成的分析来帮助您。

类成员被初始化为默认值(例如,引用类型为null),因此您可以获得所期望的行为。

答案 2 :(得分:3)

这与C#帮助确保代码正确性的目标有关。在类声明中(与局部变量相对),成员具有隐式值,因此您不必在声明或类构造函数中显式设置它们。但是,在函数/方法的上下文中,C#跟踪一个变量是否已经显式设置,以便它可以警告你就像你所看到的那样...这是一个设计决策在语言方面。

答案 3 :(得分:1)

您可以使用using构造编写等效但更紧凑的代码,为您调用Dispose

using (var command = new SqlCeCommand
       { 
           // init code removed for brevity
       })
{

    // Do stuff 
    // Do more stuff
}

您既不需要担心处置也不会担心检查无效。

答案 4 :(得分:0)

您可以测试null,因为null是一个值。 未初始化意味着没有价值,因此您无法对其进行测试。

答案 5 :(得分:0)

类字段成员默认(值类型各取决于其类型,ref类型为null)但局部变量不会。

// Example 1:
SomeClass someObject;
if(x == y)
{
    someObject = new SomeClass();
}
someObject.someMethod();   //Error since it may not execute the if statements

// Example 2
SomeClass someObject;
someObject = new SomeClass();
someObject.someMethod();   //No Error

编辑:这是为了避免导致程序意外关闭的C ++运行时错误(因为空指针)。

P.S:当我谈论C#规范时,你可能不会贬低我(我没有制作C#规格,但我为这种规避而欢呼)。