C# C语言中的未赋值错误#

C# C语言中的未赋值错误#,c#,compiler-errors,C#,Compiler Errors,如果未分配变量,则在运行时采用默认值。 比如说 int A1; 如果我在运行时检查A1的值,它将是0; 那么为什么在编译时它会抛出一个未赋值的错误; 为什么CLR在运行时不使用很多默认值 int A1; int B1 = A1+10; A1的默认值为0,应为11 在项目属性中,我可以检查“为未指定变量指定默认值” 谁能告诉我在哪里能找到它吗?你的声明 如果未分配变量,则在运行时采用默认值 仅对类中的成员变量为true 对于函数中的局部变量,这是错误的。函数中的局部变量总是需要初始化。您的语句

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

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

int A1;
int B1 = A1+10;
A1的默认值为0,应为11

在项目属性中,我可以检查“为未指定变量指定默认值”

谁能告诉我在哪里能找到它吗?

你的声明

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

仅对类中的成员变量为true

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

您的语句

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

仅对类中的成员变量为true


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

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


当您分配字符串=“时,这会为您实例化

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


当您分配字符串=“这是为您实例化的

您指的是局部变量还是类级变量?两者的规则都不同。查看Jon Skeet的回复:


你说的是局部变量还是类级变量?两者的规则都不同。查看Jon Skeet的回复:


类成员的默认值为true,但函数局部变量的默认值为true。无论您将任何代码直接放入as[pc]x文件中,代码生成器都会将其放入函数中。

对于类成员,默认值为true,但对于函数局部变量,默认值为true。无论您将任何代码直接放入as[pc]x文件中,代码生成器都会将其放入函数中。

堆(引用类)和structs zero的构造函数都是数据

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

任何默认值(如0)在50%的情况下都可能是错误的。

堆(引用类)和结构零的构造函数都是数据

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

任何默认值(如0)在50%的情况下都可能是错误的

A1的默认值为0,应为11

这正是C#编译器不允许您使用未初始化变量的原因。结果是10,而不是11。在使用C和C++的30年经验丰富的语言中,允许你使用未初始化变量的C语言团队决定这是bug的主要来源,而在C程序中不允许这样做。 有很多这样的小调整。另一个很好的例子是不允许在switch语句中出现另一种情况。忘记写break是一个典型的错误。取缔这些C-ISM是一个非常好的想法,也是C#为什么是如此伟大的语言的一个重要部分。除非你不喜欢作为警察的编译器

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

A1的默认值为0,应为11

这正是C#编译器不允许您使用未初始化变量的原因。结果是10,而不是11。在使用C和C++的30年经验丰富的语言中,允许你使用未初始化变量的C语言团队决定这是bug的主要来源,而在C程序中不允许这样做。 有很多这样的小调整。另一个很好的例子是不允许在switch语句中出现另一种情况。忘记写break是一个典型的错误。取缔这些C-ISM是一个非常好的想法,也是C#为什么是如此伟大的语言的一个重要部分。除非你不喜欢作为警察的编译器


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

B1在您的示例中是10,10+0=10B1在您的示例中是10,10+0=10这就是我要问的,为什么会这样?可能您必须阅读C的语言规范,因为这背后的原因。你可以在上找到它,因为你无法更改它,我只需要记住规则并使我的代码符合它。感谢链接,即使我正在浏览,但这是针对.net 2003的,我使用的是2010。如果你找到最新的东西,请按我的要求,为什么会这样?你可能不得不阅读C语言规范,因为这背后的原因。您将在找到它,因为您将无法更改它,我只会记住规则并使我的代码符合它。感谢链接,即使是我也在浏览,但这是针对.net 2003的,我使用的是2010。如果你找到关于局部变量的最新信息,请用forword metalking跟踪关于局部变量是的,我知道它对call成员有效,但不是局部变量,这就是我想说的,是这样的。要检查类成员是否是是否初始化。它们可以从函数、属性、构造函数中设置,你永远不知道。但是,函数局部变量只能在函数内部初始化,这很容易验证。那也不太好