我刚刚尝试了一个小代码片段,看看值类型初始化是如何工作的。下面是代码片段
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#的工作方式。但这背后一定有一些强有力的理由。你能告诉我原因吗?
成员变量将根据其类型初始化为默认值!以下是它们的列表。
public MyClass()
{
int number; //will be initialized to zero
}
然而,局部变量(在函数中)不会被编译器初始化为默认值,因此不允许使用它们!
public void myFunction()
{
int number; //will NOT be initialized to zero
}
如果您有一个字段,那么您可以不初始化它,然后使用没有问题,因为字段将是一个内存变量,它将自动初始化为0(在初始化期间)。同样的不适用于局部变量,因为编译器可能决定将其值保存在寄存器中,这就是为什么您需要将其值隐式地设置为默认值,或者在第一次使用时它会有一些"随机"值(从先前使用该寄存器中留下),因为寄存器不会自动清除。
这种行为在C语言中很常见,我不明白为什么在c#中会有不同。
如果你需要使用整个int范围,你想有一个额外的选项使用int?
,这是一个可空的类型,所有的素数与一个?它是一个可空的类型,例如,如果你需要true, false和两个bool?
都可以使用。