C#中未分配的值错误

时间:2010-12-23 11:49:02

标签: c# compiler-errors

如果未分配变量,则它在运行时采用默认值。 例如

int A1;

如果我在运行时检查A1的值,它将为0; 那么为什么在编译时会抛出一个未赋值的错误; 为什么CLR在运行时不会使用很多默认值;

int A1;
int B1 = A1+10;

它应为11,因为A1的默认值为0;

有项目属性,我可以检查“为未分配的变量分配默认值”;

有谁能告诉我在哪里可以找到它?

6 个答案:

答案 0 :(得分:3)

您的陈述

  

如果未分配变量,则它在运行时采用默认值

仅适用于类中的成员变量。

对于函数内的局部变量,这是错误的。函数中的局部变量总是需要初始化。

答案 1 :(得分:1)

  

它应为11,因为A1的默认值为0;

这是完全 C#编译器不会让你使用未初始化变量的原因。结果将是10,而不是11。经过30年的C和C ++经验,允许您使用未初始化变量的语言,C#团队认为这是一个主要的错误来源和 not 允许在C#程序中使用它。

有很多这样的小调整。另一个很好的例子是不允许在 switch 语句中落入另一个案例。忘记写 break 是一个经典的错误。禁止这些C-isms是一个很好的主意,也是C#如此优秀语言的重要组成部分。除非你不喜欢编译器作为警察的想法。

Fwiw:在VB.NET中允许使用未初始化的变量。

答案 2 :(得分:0)

大多数情况下,这是因为变量是一个对象,在你可以使用它之前,你需要实例化它。

当您指定String =“”时,会为您实例化

答案 3 :(得分:0)

您在谈论局部变量或类级别变量?两者的规则都不同。请查看Jon Skeet的回复:

Initialization of instance fields vs. local variables

答案 4 :(得分:0)

类成员的默认值为true,但函数本地的默认值不为true。无论您直接将哪些代码放入[pc] x文件中,代码生成器都会将其放入函数中。

答案 5 :(得分:0)

堆(引用类)和结构的构造函数为零。

简单的值类型(如int),以及对象的引用(=指针),都不会在堆栈上获得默认值。你应该总是设置它。如果这不是强制性的,特别是对象指针,这可能是一个主要的安全漏洞,因为你指向未知的位置。

任何默认值(如0)都可能在50%的时间内出错。