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中获益?
好吧,如果你想让它为null,那么你需要告诉它.这是为了捕捉错误.ReSharper等编译器和实用程序会搜索所有执行路径,并确保在使用变量之前对其进行初始化.这是为了捕捉常见的编码错误.因此,没有额外的"甚至无效"值可能,它只是由编译器(或其他)完成的分析来帮助您.
类成员被初始化为默认值(例如,引用类型为null),因此您可以获得所期望的行为.
类字段成员获得默认值(每个值类型取决于其类型,引用类型为 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# 规范,不过我对这种回避表示欢迎)。
| 归档时间: |
|
| 查看次数: |
1404 次 |
| 最近记录: |