似乎没有办法在您的代码中找到未分配的局部变量或检查它们,因为编译器会使用未分配的局部变量错误.
为什么编译器在编译时不对这些变量使用default(T)?
即使对于值类型来说更难做,引用类型在这种情况下很容易被初始化为null,对吗?
这是一些测试代码:
public void Test ( ) { int x; string s; if ( x == 5 ) Console.WriteLine ( 5 ); if ( s != null ) Console.WriteLine ( "s" ); }
它返回:
Use of unassigned local variable 'x' Use of unassigned local variable 's'
更新:
对于声称这是不允许有充分理由的人,为什么允许在课堂上?
public class C { public int X; public string S; public void Print ( ) { Console.WriteLine ( X ); Console.WriteLine ( S ); } }
这段代码编译完好.
为什么在类级别上没有,但不是在方法级别?
解决方法
@H_502_27@ 我看到你已经更新了你的问题,所以我会更新我的答案.您的问题有两个部分,一个与局部变量相关,另一个与类实例上的实例变量相关.首先,然而,这不是一个真正的编译器设计决策,而是一个语言设计决策.Spec第12.3.1 / 12.3.2节
局部变量
我们知道为什么你可以定义一个变量而不给它一个值.一个原因,一个这样的例子:
int x; // do stuff x = 5; // Wow,I can initialize it later! Console.WriteLine(x);
该标准定义了为什么这是有效的代码.现在,我不在C#设计团队,但是为什么他们不会为你自动初始化代码(除了实际上不希望自动初始化的性能之外)还是很有道理的.
说上面的代码是你的意图,但你忘了初始化x = 5;如果编译器为您自动初始化变量,代码将编译,但它不会像您所期望的那样做.
这是一个微不足道的例子,但这是来自语言设计师的一个非常好的设计决策,因为它会节省许多头痛,试图找出为什么某些东西不能按预期工作.
作为一个附注,我不能想到为什么你想要定义代码没有分配一些东西,或使用默认值(在每种情况下)给我可能是一个错误,我’确定编译器设计者可能已经确定了什么.
类实例变量
班级成员由最初分配的标准定义.事实上,为了公正,在catch,foreach或using语句中声明的局部变量最初是未分配的.所以真的,这是一个标准问题,而不是编译器的问题.
如果我尝试猜测为什么关于类实例的实例变量是这种情况,我会说它与内存在堆上的分配有关,因为这是分配这些类的地方.当一个类在堆上被分配时,它的所有成员必须被初始化并且在堆上被分配.在一个类成员中做一个局部变量不仅可以做到这一点,还需要这样做.他们根本不能被分配.