为什么我必须在默认为0时为C#中的int赋值?

这有效:

class MyClass { int a; public MyClass() { int b = a; } } 

但这会产生编译器错误(“使用未分配的局部变量’a’”):

 class MyClass { public MyClass() { int a; int b = a; } } 

据我所知,这是因为在第一个例子中,从技术上讲,编译器不知道没有分配’a’。 在后一个例子中,’a’是在本地定义的,因此很容易跟踪。

但为什么后一个例子不起作用?

不要将整数默认为0吗? 这是编译器对“最佳实践”强制执行的操作。 还是有另一个原因吗?

在第一个例子中,它是一个字段 。 字段自动默认为0 / false / null。 在第二个例子中,它是一个变量 。 变量不是默认的,在使用之前必须具有“明确的赋值”。

本质上,在创建对象(或初始化结构)时,它会将内存归零(或者在非默认结构的情况下,强制您手动初始化所​​有内容)。 但是,变量是如此常见(在每种方法中),它不希望总是必须将堆栈归零。 它会强制您指示初始值。

不要将整数默认为0吗?

当它们是类的数据成员时它们会这样做,但是当它们是局部变量时它们不会这样做:局部变量需要在使用之前显式初始化,因此编译器错误。

当您实例化类的新实例时,对象所需的所有内存都是“归零”的整数被设置为0字符串被设置为null等。这是为了避免C中可能存在的许多奇怪的内存错误和黑客攻击(++)。 不幸的是,这也有一个很小的处理成本,所以当你创建一个局部变量时,语言假定你将很快自己设置值,并且不会将它归零以减少所需指令的总数。 为了抵消使用未设置内存的风险,这会引入编译器检查以确保在允许您使用该变量之前已设置了值。

这可能是因为在类级别声明的变量不能在同一范围内赋值(除了声明时)

例如

 class Test { int a; a = 0; // this is not allowed at class level & hence a initialized to default } 

 class Test { void test() { int a; int b = a; a = 20; // this is allowed } } 

据我所知,当我们在类中声明一个变量并创建一个对象时,默认构造函数初始化变量,因此不需要初始化类变量。 但是来到类中的方法没有构造函数或任何东西来初始化这些变量,所以我们不能在方法中分配未初始化的变量。