C#未分配静态整型结果为零
在试验静态变量时,我惊奇地发现为什么静态“int”结果为0(零),而非静态结果为编译时错误 考虑案例1C#未分配静态整型结果为零,c#,C#,在试验静态变量时,我惊奇地发现为什么静态“int”结果为0(零),而非静态结果为编译时错误 考虑案例1 static int i; static void Main() { Console.Write("Value of i = " + i); Console.ReadKey(); } 输出是 Value of i = 0 案例2:消除静电干扰 static void Main() { int i; Console.Write
static int i;
static void Main()
{
Console.Write("Value of i = " + i);
Console.ReadKey();
}
输出是
Value of i = 0
案例2:消除静电干扰
static void Main()
{
int i;
Console.Write("Value of i = " + i);
Console.ReadKey();
}
而此操作的输出将导致编译时错误
Error 1 Use of unassigned local variable 'i'
这里的问题是这两种情况有何区别,即第一个结果为0,另一个get编译器错误。根据C语言的定义,类型有“默认值”,如果不分配其他值,则会分配给它们。数字的默认值为0,布尔值为false,引用类型为null,结构类型为按类型划分的每个成员。根据C#语言的定义,类型具有“默认值”,如果不分配其他值,则会分配给它们。数字的默认值为0、boolean-false、reference type-null和structs-每个成员按其类型排列。同意!但是如果我删除static呢?@ViZ字段(static或not)总是按照约定初始化的。局部变量是不同的,除非您这样做,否则不会初始化。@SirRufo但它们在内存分配方面有什么不同?@ViZ字段保存在堆上,局部变量保存在堆栈上!但是如果我删除static呢?@ViZ字段(static或not)总是按照约定初始化的。局部变量是不同的,除非您这样做,否则不会初始化。@SirRufo但它们在内存分配方面有何区别?@ViZ字段保留在堆上,局部变量保留在堆栈上。您的第二个代码段未通过C#中的“确定赋值规则”。验证变量始终处于初始化状态的规则。但它也有局限性,它不能轻易地判断是否有代码在其他地方初始化静态变量。这太难了,很难正确地做。它只能处理局部变量、使用
out
关键字声明的参数以及实例变量使用的结构类型字段。语言规范中的第5.3.2章。否则,您将难以保证静态变量总是初始化为0或null。您的第二个代码段未通过C#中的“确定赋值规则”。验证变量始终处于初始化状态的规则。但它也有局限性,它不能轻易地判断是否有代码在其他地方初始化静态变量。这太难了,很难正确地做。它只能处理局部变量、使用out
关键字声明的参数以及实例变量使用的结构类型字段。语言规范中的第5.3.2章。否则,您将难以保证静态变量始终初始化为0或null。