在C#中,为什么我在声明它时会看到存储在我的int变量中的零,但仍然会收到错误,说我应该初始化它?
在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://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将变量归零,但对于每个框架都不一定如此。
请注意,对于数组,它是有保证的。