2013-06-19 53 views
1

我刚刚尝试了一个小代码片段,以了解值类型初始化的工作原理。 下面是代码片段C#中值类型的奇怪行为

 public MainWindow() 
     { 
      InitializeComponent(); 

      int num; 
      char alpha; 
      //if (num == null) 
      //{ 
      // // this is null 
      //} 
      //else 
      //{ 
      // string value = num.ToString(); 
      //} 

     } 

一些代码注释故意正确生成项目。汇编即将到来的是

Use of unassigned local variable 'num' 

我知道所有的变量应该在使用前分配。但是当我调试时发现num的值为0.如果这是默认初始化为0,那么为什么我们需要在使用它之前始终分配一些值。

会不会是一个nullable类型我明白使用未分配变量的风险将通过异常。

现在假设我想使用已经可用的num的零值而没有任何赋值,为什么我必须初始化num?有人可以说这就是.NET/C#的工作原理。但是背后肯定有一些强有力的理由。你能说出这个理由吗?

回答

0

成员变量将根据其类型初始化为默认值! Here是它们的列表。

public MyClass() 
{ 
    int number; //will be initialized to zero 
} 

但是,局部变量(在函数中)不会被编译器初始化为默认值,因此不允许使用它们!

public void myFunction() 
{ 
    int number; //will NOT be initialized to zero 
} 

而且here到计算器上对同一问题的参考..

0

如果你有一个字段,那么你可以把它初始化,然后使用没有问题,因为现场将是一个内存变量它会自动初始化为0(初始化期间)。同样不适用于局部变量,因为编译器可能会决定将它的值保存在寄存器中,这就是为什么您需要非常隐藏地将其值设置为默认值,或者第一次使用时会有一些“随机”值从以前使用该寄存器),因为寄存器不会自动清除。

此行为在C语言中很常见,我不明白为什么会在C#中它应该是不同的。

0

如果你需要使用整个int范围,并且你想有一个额外的选项,使用int?这是一个可为空的类型,所有带有?在这是一个可为空的类型,例如,如果您需要true,false并且可以使用bool?