Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#未分配静态整型结果为零_C# - Fatal编程技术网

C#未分配静态整型结果为零

C#未分配静态整型结果为零,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

在试验静态变量时,我惊奇地发现为什么静态“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("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。