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#的工作方式。但这背后一定有一些强有力的理由。你能告诉我原因吗?

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

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?都可以使用。

相关内容

  • 没有找到相关文章

最新更新