【问题标题】:Use of unassigned local variable使用未赋值的局部变量
【发布时间】:2011-05-05 20:18:08
【问题描述】:

我在编写从 hex 到 bin、dec 到 bin 等的转换器时遇到问题。这是我的代码,当我调试它时出现错误“使用未分配的局部变量 Dec_Int10”,你能帮帮我吗?我该如何解决这个错误?

protected void Button_Click (object sender, Event Args e)
{
      if (Page.IsValid)
      {
           int Dec_Int10;
           if(!(string.IsNullOrEmpty(TextBox1.Text)))
           {
                 Dec_Int10 = Convert.ToInt32(TextBox1.Text, 10)));
           }
           if(!(string.IsNullOrEmpty(TextBox2.Text)))
           {
                 Dec_Int10 = Convert.ToInt32(TextBox2.Text, 16)));
           }
           if(!(string.IsNullOrEmpty(TextBox3.Text)))
           {
                 Dec_Int10 = Convert.ToInt32(TextBox3.Text, 8)));
           }
           if(!(string.IsNullOrEmpty(TextBox4.Text)))
           {
                 Dec_Int10 = Convert.ToInt32(TextBox4.Text, 2)));
           }
           string Dec_Str10 = Convert.ToString(Dec_Int10, 10);
           string Hex_Str16 = Convert.ToString(Dec_Int10, 16);
           string Oct_Str8 = Convert.ToString(Dec_Int10, 8);
           string Bin_Str2 = Convert.ToString(Dec_Int10, 2);
           TextBox1.Text = Dec_Str10;
           TextBox2.Text = Hex_Str16;
           TextBox3.Text = Oct_Str8;
           TextBox4.Text = Bin_Str2;
       }
}

【问题讨论】:

  • 一个精确的错误信息?!?从来没有!

标签: c# asp.net .net-3.5 .net-4.0


【解决方案1】:

你想初始化你的变量:

int Dec_Int10 = 0;

否则编译器不知道它是否曾经被赋值。

【讨论】:

    【解决方案2】:

    在声明 Dec_Int10 时将其声明为零(或您希望它具有的任何默认值)。

    【讨论】:

      【解决方案3】:

      您从未初始化Dec_Int10,它在抱怨,因为您拥有所有这些if 语句,编译器无法保证它会满足if 语句之一并设置Dec_Int101

      添加else 语句或尝试将其初始化为:

      int Dec_Int10 = -1;
      

      【讨论】:

        【解决方案4】:

        您会收到该错误,因为没有为变量分配默认值,并且由于对它的唯一分配位于 if 块内,编译器认为有可能永远不会分配该变量。

        如果你只是将它初始化为 0,你将不再有错误。

        这是编译器提供的一项检查,可防止您犯容易犯的错误。

        【讨论】:

        • 不幸的是,编译器不会对潜在的复制粘贴几乎相同的代码错误做任何事情:-)
        【解决方案5】:

        你只需要改变

        int Dec_Int10
        

        int Dec_Int10 = 0;
        

        因为编译器无法验证 Dec_Int10 在以其他方式使用之前是否已设置。

        【讨论】:

          【解决方案6】:

          添加一个 else 将是最好的做法。如果您一开始就对其进行初始化,您很可能只会重置该值。使用 else 会更高效。

          【讨论】:

          • 我怀疑你会失去任何性能或效率。这种东西会被 JITter 甚至编译器优化掉。
          • 我并不是说这是一个很大的性能损失,只是一点点。我敢打赌编译器不会对此进行优化。但我没有尝试。在任何情况下,我更喜欢在 else 中看到它的设置,并且只保留定义而不进行初始化。
          【解决方案7】:

          看看你的代码。

          如果 txtBox1,2,3 和 4 同时为空/null 会发生什么?

          没有任何东西被分配给 Dec_Int10。因此,稍后在代码中您将尝试转换未初始化的变量。编译器查看执行路径并确定存在变量未初始化的场景(例如所有 4 个如果失败)。

          正如其他人所指出的,您可以使用以下方法解决它: int Dec_Int10 = 0;

          更大的学习点是为什么会发生?

          例如此代码不会产生错误,因为无论文本框 1,2,3,4 Dec_Int10 的状态如何,都会在转换前初始化。

                  int Dec_Int10;
          
                  if (!(string.IsNullOrEmpty(TextBox4.Text)))
                      Dec_Int10 = Convert.ToInt32(TextBox4.Text, 2);
                  else if (!(string.IsNullOrEmpty(TextBox3.Text)))
                      Dec_Int10 = Convert.ToInt32(TextBox3.Text, 8);
                  else if (!(string.IsNullOrEmpty(TextBox2.Text)))
                      Dec_Int10 = Convert.ToInt32(TextBox2.Text, 16);
                  else if (!(string.IsNullOrEmpty(TextBox1.Text)))
                      Dec_Int10 = Convert.ToInt32(TextBox1.Text, 10);
                  else
                      Dec_Int10 = 0;
          
                 TextBox1.Text = Convert.ToString(Dec_Int10, 10);
                 TextBox2.Text = Convert.ToString(Dec_Int10, 16);
                 TextBox3.Text = Convert.ToString(Dec_Int10, 8);
                 TextBox4.Text = Convert.ToString(Dec_Int10, 2);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-04-22
            • 2016-06-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多