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

时间:2013-06-18 17:48:30

标签: c# value-type

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

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

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

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

5 个答案:

答案 0 :(得分:10)

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

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

至于为什么这是一个错误,第5.3节陈述

  

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

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

答案 1 :(得分:9)

  

为什么“res”是一个值类型,因此默认为0?

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

虽然从技术角度看这个“技术上”可能没什么问题,从现实世界的角度来看,默认值为零,但是在检查之前你还没有设置过它的事实是1)无用({ {1}}永远不会是真的)或2)一个错误(你想设置值,但有些东西改变了。)

在任何一种情况下,都会出现警告,以帮助您防止意外发生任何一种情况。

  

我应该指出,如果我专门将res的值设置为0,那么一切正常。

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

答案 2 :(得分:2)

C#要求在使用前初始化所有变量。对于像这样的局部变量,您需要显式初始化它们。结构或类中的字段不需要显式初始化,因为它们在对象构造中接收默认值。

所以在这里,你只需要做

int res = 0;

一切都会好的。

答案 3 :(得分:1)

问题是C#不保证未初始化的值为0。根据{{​​3}},可能无法使用未初始化的变量,因为C#旨在防止您做出明显不好的事情。

其他一些语言(特别是C和C ++) 允许这样做的主要原因是因为编译器编写器需要额外的工作来检测和标记这种情况。

编辑:language specification是C#语言规范的相关部分:

答案 4 :(得分:0)

默认初始化适用于类/结构成员,这里不适用,因为res是局部变量;作为变量,而不是数据成员,“使用前需要初始化”适用。