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

Vac*_*ano 9 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();
}
Run Code Online (Sandbox Code Playgroud)

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

所以我改变了命令的声明,SqlCeCommand command = null;每个人都很高兴.

但我想知道有什么区别?

为什么它不默认为null? 含义: C#如何从不将局部变量默认为null中获益?

Ted*_*opp 8

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

  • 但为什么?为什么不将它们默认为null?通过要求转让获得了什么? (2认同)

And*_*rin 5

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

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


Ken*_*n D 0

类字段成员获得默认值(每个值类型取决于其类型,引用类型为 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
Run Code Online (Sandbox Code Playgroud)

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

PS:当我谈论 C# 规范时,你可能不会对我投反对票(我没有制定 C# 规范,不过我对这种回避表示欢迎)。