当我在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#如何从不仅将默认局部变量默认为空来受益?
答案 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#规格,但我为这种规避而欢呼)。