在访问之前,可能不会初始化局部变量(int)

Mar*_*rko 10 c# value-type

我在类中定义了以下方法:

public bool LogOff(string sessionId)
{
   int res;
   // Some non related code here..
   if (res == 1)
   {
      return true;
   }
   return false;
}
Run Code Online (Sandbox Code Playgroud)

对我来说很奇怪的是,我在IF子句中获得了"在访问Visual Studio之前可能没有初始化本地变量"错误(我安装了ReSharper).当"res"是一个值类型时,为什么会这样,因此默认为0?我应该指出,如果我专门将res的值设置为0,那么一切都OK.

我在这里错过了什么?我认为这些是编程的基础,但显然我不熟悉基础知识......

Rya*_*n M 10

"为什么C#以这种方式工作"的答案总是"因为这就是规范中的内容".C#语言规范的第5.3.2节列出了最初未分配的变量:

  • 最初未分配的struct变量的实例变量.
  • 输出参数,包括struct实例构造函数的this变量.
  • 局部变量,但在catch子句或foreach语句中声明的变量除外.

至于为什么这是一个错误,第5.3节说明

必须在获得其值的每个位置明确赋值变量.

如果将值初始化为int res = new int();,则将获得默认值零.在其他答案中提到了更常见的方法,即明确地将其设置为零.依赖于默认值只会使代码不易读取而没有真正的优势.


Ree*_*sey 9

当"res"是一个值类型时,为什么会这样,因此默认为0?

即使成员字段中的值默认为0,本地也需要显式设置值.编译器会在没有初始化的情况下警告您正在使用它,因为这可能是一个错误.

虽然从技术角度来看这种"技术上"可能没什么问题,但从现实世界的角度来看,在初始化默认值为零的情况下,你在检查之前没有设置值的事实要么是1)无用(if永远不会是真的) )或2)一个错误(你想设置值,但改变了一些东西).

在任何一种情况下,都会有一个警告来帮助您防止意外发生任何一种情况.

我应该指出,如果我专门将res的值设置为0,那么一切都OK.

执行此操作时,您将专门提供一个值,因此编译器不再警告您.