Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Try、catch、finally的局部变量未分配问题_C#_String_Try Catch Finally_Listboxitems - Fatal编程技术网

C# 使用Try、catch、finally的局部变量未分配问题

C# 使用Try、catch、finally的局部变量未分配问题,c#,string,try-catch-finally,listboxitems,C#,String,Try Catch Finally,Listboxitems,我想知道我是否能帮上忙。有人能解释一下为什么我的字符串sqrt在finally块中没有赋值吗?我为什么要申报呢?为什么不能在try或catch语句中声明它?这将使编码变得不那么乏味,更有条理 private void btnDisplay_Click(object sender, EventArgs e) { int number; string sqrt; try { number =

我想知道我是否能帮上忙。有人能解释一下为什么我的字符串
sqrt
finally
块中没有赋值吗?我为什么要申报呢?为什么不能在try或catch语句中声明它?这将使编码变得不那么乏味,更有条理

    private void btnDisplay_Click(object sender, EventArgs e)
    {
        int number;

        string sqrt;

        try
        {

            number = Convert.ToInt32(tbInput.Text);
            //Why cant i just have it as "number=COnvert.ToDouble(tbInput.Text)?//
            Convert.ToDouble(number);
            if (number < 0)
            {
                throw new NegativeNumberException();
            }
            sqrt = Math.Sqrt(number).ToString();


        }
        catch (FormatException error)
        {
            lbOutput.Items.Add(error.Message);
            lbOutput.Items.Add("The input should be a number.");
            sqrt = "not able to be calculated";


        }
        catch (NegativeNumberException neg)
        {
            lbOutput.Items.Add(neg.Message);
            sqrt = "not able to be calculated";


        }
        finally
        {
            //Here is where i am having the issue "Unassigned local variable"//
            lbOutput.Items.Add("Square Root " + sqrt);
        }

    }

       class NegativeNumberException : Exception
       {
          public NegativeNumberException()
            : base("Number can’t be negative")
          {

          }



      }
    }
}
private void btnDisplay\u单击(对象发送方,事件参数e)
{
整数;
字符串sqrt;
尝试
{
number=Convert.ToInt32(tbInput.Text);
//为什么我不能把它作为“number=COnvert.ToDouble(tbInput.Text)”呢//
转换为双(数字);
如果(数字<0)
{
抛出新的NegativeEnumberException();
}
sqrt=Math.sqrt(number.ToString();
}
捕获(格式化异常错误)
{
lbOutput.Items.Add(错误消息);
lbOutput.Items.Add(“输入应该是一个数字”);
sqrt=“无法计算”;
}
捕获(负枚举异常负)
{
lbOutput.Items.Add(负消息);
sqrt=“无法计算”;
}
最后
{
//这里是我遇到“未分配局部变量”问题的地方//
lbOutput.Items.Add(“平方根”+sqrt);
}
}
类NegativeEnumberException:异常
{
公共负项EnumberException()
:base(“数字不能为负数”)
{
}
}
}
}

我试图在finally块中实现的是在列表框中显示“平方根”和“sqrt”,而不管sqrt的值是什么。如果我将sqrt输出到任何其他块中的列表框中,它都会工作(因为它已被声明).有人知道我该怎么做吗?我打赌这可能也很简单。我不想大声嚷嚷什么的,只是我已经起床12个小时了,所以我开始感到挫败。我真的很感谢大家的帮助。

你不能在
try
块中声明它,因为局部变量是由绑定的。简言之,局部变量是由在块中声明的变量,即
{}
,仅在该块中可见。若要添加,最好将
sqrt
初始化为
““
字符串。声明时为空。

不能在
try
块中声明它,因为局部变量由绑定。简而言之,在块中声明的局部变量,即
{}
,仅在该块中可见。要添加,最好在声明时将
sqrt
初始化为
string.Empty

如果代码中有以下行:

number = Convert.ToInt32(tbInput.Text);
//Why cant i just have it as "number=COnvert.ToDouble(tbInput.Text)?//
Convert.ToDouble(number);
if (number < 0)
{
    throw new NegativeNumberException();
}
sqrt
变量保持未赋值状态

您可以通过如下声明来解决此问题:

string sqrt = null; // or ""
关于你的评论:

为什么我不能把它作为“number=COnvert.ToDouble(tbInput.Text)”呢

试试这个:

var number = Double.Parse(tbInput.Text);

如果代码中存在以下任何一行:

number = Convert.ToInt32(tbInput.Text);
//Why cant i just have it as "number=COnvert.ToDouble(tbInput.Text)?//
Convert.ToDouble(number);
if (number < 0)
{
    throw new NegativeNumberException();
}
sqrt
变量保持未赋值状态

您可以通过如下声明来解决此问题:

string sqrt = null; // or ""
关于你的评论:

为什么我不能把它作为“number=COnvert.ToDouble(tbInput.Text)”呢

试试这个:

var number = Double.Parse(tbInput.Text);
更改:

int number;
string sqrt;
更新:

double number = 0.0;
string sqrt = string.Empty;
更改:

int number;
string sqrt;
更新:

double number = 0.0;
string sqrt = string.Empty;

尝试在sqrt上赋值。
字符串sqrt=“”//声明上的sqrt可能不包含任何调用问题的值。

尝试在sqrt上赋值。
字符串sqrt=“”//在声明中,sqrt可能不包含任何调用问题的值。

@Corak,在任何块解决问题之前初始化字符串

我变了

     string sqrt;


@Corak,在任何块解决问题之前初始化字符串

我变了

     string sqrt;


sqrt仅在声明的范围内可用。范围通常由大括号分隔,例如方法体、for语句,或者在本例中是try、catch和finally子句。在尝试在if子句中声明变量时,您会注意到同样的问题,然后尝试在else子句中使用该变量。如果您有很多这样的函数,并且设置为仅在try或catch子句中声明它,一种替代方法是创建变量的全局映射,然后将“sqrt”键分配给每个作用域中所需的对象。

sqrt将仅在声明的作用域中可用。范围通常由大括号分隔,例如方法体、for语句,或者在本例中是try、catch和finally子句。在尝试在if子句中声明变量时,您会注意到同样的问题,然后尝试在else子句中使用该变量。如果您有很多这样的函数,并且只打算在try或catch子句中声明它,一种替代方法是创建变量的全局映射,然后将“sqrt”键分配给每个作用域中所需的对象。

以下是您的答案:)将变量编号声明为可以执行的两倍此编号=Convert.ToDouble(编号);好吧,这样看:
最终
保证始终运行,不管发生什么(不包括电源故障等)。因此,如果
catch
块中的某些内容在设置
sqrt
之前出错,该怎么办?或者,如果抛出了一个您没有捕获的异常,该怎么办?然后,
sqrt
未设置,换句话说是“未分配”。所以最简单的方法就是马上初始化它。比如:
stringsqrt=string.Empty
或甚至
字符串sqrt=null@Corak,完美,我在任何块之前初始化了字符串,现在它继续。再次感谢你的帮助^_^@Spr89-有一个细微但重要的区别。分配给
sqrt
的值始终会被“结转”,但代码中的某些路径可能会导致
最终
块,而不会将任何内容分配给
sqrt
。真蠢