【问题标题】:Strange behavior in C# for value types [duplicate]C#中值类型的奇怪行为[重复]
【发布时间】:2013-06-19 18:30:29
【问题描述】:

我刚刚尝试了一个小代码 sn-p 来看看值类型初始化是如何工作的。 下面是代码sn-p

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

【问题讨论】:

    标签: c# .net types unassigned-variable


    【解决方案1】:

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

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

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

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

    还有here 对stackoverflow 上同一个问题的引用..

    【讨论】:

      【解决方案2】:

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

      这种行为在 C 语言中很常见,我不明白为什么在 C# 中它应该有所不同。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2022-01-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-08
          • 1970-01-01
          • 2017-10-21
          • 1970-01-01
          相关资源
          最近更新 更多