在C#中,为什么我在声明它时会看到存储在我的i​​nt变量中的零,但仍然会收到错误,说我应该初始化它?

在C#中,如果我这样做:

int x; 

然后点击F10,我看到存储在x中的零。

但是当我尝试使用x时,它告诉我应该初始化它..为什么会这样? 那里应该是零,对吧?

关于数组也是如此,所以:

 int[]a = new int[5]; 

如果我们F10那么,我们会看到那里的所有整数都是零。

这是怎么回事 ? 为什么我必须在C#中初始化变量而不像C ++?

这是一个编译时错误,试图帮助您减少由于未初始化的变量导致的代码中的错误。 很有用。

http://msdn.microsoft.com/en-us/library/4y7h161d(VS.80).aspx

更多阅读:

http://blogs.msdn.com/b/abhinaba/archive/2005/11/08/490248.aspx

关于禁用错误的一些话(你不能只是警告你 – 这不是警告):

http://social.msdn.microsoft.com/Forums/en/csharplanguage/thread/a073ccea-c43b-4536-be76-41949f0e2135

http://blogs.msdn.com/b/ericlippert/archive/2009/10/12/absence-of-evidence-is-not-evidence-of-absence.aspx (certificate该主题信息最丰富)

甚至更多地讨论“localsinit”IL标志(强制为本地人设置默认值)之间的关系及其与“双重赋值”的关系(C#强制你写入int v=0即使它已经存在)。 如果你想更深入地阅读 – 这里提供的ECMA-335第I.12.2节中定义的“localsinit”。

简单地说,因为这就是C#的工作方式。 来自C#语言规范:

5.3.2最初未分配的变量

以下类别的变量被归类为最初未分配的变量:

·最初未分配的结构变量的实例变量。

·输出参数,包括struct实例构造函数的this变量。

·局部变量,但在catch子句或foreach语句中声明的变量除外。

另一方面:

5.3.1最初分配的变量

以下类别的变量分类为最初分配的:

·静态变量。

·类实例的实例变量。

·最初分配的结构变量的实例变量。

·数组元素。

·价值参数。

·参考参数。

·在catch子句或foreach语句中声明的变量。

简单…因为编译器坚持在使用它们之前初始化局部变量。 这可以防止与初始化失败相关的整类错误。

如果你看一下从以下几个语句生成的IL:

 int x; Console.WriteLine("hello"); int y=5; x=6; Console.WriteLine(x+y); 

你看到以下内容:

 //notice no ops related to x prior to console.writeline IL_0000: ldstr "hello" IL_0005: call System.Console.WriteLine IL_000A: ldc.i4.5 IL_000B: stloc.1 //create/store y IL_000C: ldc.i4.6 IL_000D: stloc.0 //x is really only created right here IL_000E: ldloc.0 IL_000F: ldloc.1 IL_0010: add IL_0011: call System.Console.WriteLine 

如果你在它存储在IL之前看到x的值,那么这是一个调试器技巧。

0是运气,它可能是任何东西,这就是你必须初始化它的原因。

自动初始化是我认为的运行时安全function,而不是语言保证。 碰巧.NET将变量归零,但对于每个框架都不一定如此。

请注意,对于数组,它是有保证的。