C# try-catch异常中的变量

C# try-catch异常中的变量,c#,try-catch,C#,Try Catch,在try部分和catch部分中使用变量有什么区别 string curNamespace; try { curNamespace = "name"; // Works fine } catch (Exception e) { // Shows use of unassigned local variable throw new Exception("Error reading " + curNamespace, e); } 如果我在try部分中使用变量,它编译得很好,在catch部

在try部分和catch部分中使用变量有什么区别

string curNamespace;

try
{
  curNamespace = "name"; // Works fine
}
catch (Exception e)
{
// Shows use of unassigned local variable  
throw new Exception("Error reading " + curNamespace, e);

}

如果我在try部分中使用变量,它编译得很好,在catch部分我得到“使用未分配变量”

这意味着变量
curNamespace
catch
范围中使用之前未初始化

将代码更改为:

string curNamespace = null;
它会很好的编译

C#中,变量必须在使用前初始化。所以这是错误的:

string curNamespace; // variable was not initialized
throw new Exception("Error reading " + curNamespace); // can't use curNamespace because it's not initialized

您必须将其分配到try块之外

        string curNamespace = string.Empty; // or whatever

        try
        {
            curNamespace = "name";
        }
        catch (Exception e)
        {
            throw new Exception("Error reading " + curNamespace, e);
        }

编译器正在抱怨,因为在初始化值之前可能会遇到异常。考虑下面的(非常做作的)例子:


修复方法是将
curNamespace
初始化为
try..catch
之外的某个默认值。但是,您必须想知道您试图使用它做什么。

您必须首先初始化curNamespace。或者它“可能”在catch分支中未初始化。

您必须为变量赋值,因为不能保证变量在使用时会保存某些内容

您可以使用:


string curNamespace=string.Empty

如果您更改了
curNamespace
的声明并为其分配了一些内容,那么它将起作用:

string curNamespace = null; /* ASSIGN SOMETHING HERE */
try
{
  curNamespace = "name";
}
catch (Exception e)
{
throw new Exception("Error reading " + curNamespace, e);

}

那不是真的,巴勃罗
curNamespace
是在try-catch块外部定义的,因此可以在try-catch内部访问。不知道为什么会被否决,这是正确的。编译器无法明确证明变量在被用于
catch
@Diego之前已经被赋值,被定义和被明确赋值是两件不同的事情。巴勃罗的回答并没有说明定义。@迭戈:在回答之前并没有阅读整个问题。现在已经纠正了。谢谢我没有理由投反对票。这是正确的答案。因为这是C#标准的一部分,所以没有理由进行更详细的讨论。最初的答案是可以接受的。我不理解这种抱怨。使用未赋值变量是一个警告,如果您选择,您可以忽略它。否则,问题就完全清楚了。在尝试使用curNamespace之前,不指定值,因此请设置一个值。实际上,我建议使用String.Empty,而不是将其设置为null。不过他说“它编译得很好”,所以并不是编译器像你说的那样抱怨。@Diego在你的环境中尝试一下。对于VS2010和.NET4,编译器在默认情况下绝对不允许这样做。我想可能会将其更改为警告-可能是OP发出了警告。@哎呀-这个答案既“正确”又“不正确”。编译器抱怨的原因是变量在使用之前没有被赋值。但是根据提供的代码,它是初始化的(只需分配一个值)。@Diego说,“如果他在try部分使用它,它可以编译得很好。”但是他接着报告了一个编译器错误。做推断,他试过了,没有使用catch,现在有了。正是catch的使用导致了编译器的抱怨。@Ramhound,据我所知,没有办法设置编译器警告级别来忽略根据语言规范非法的内容。我想问你是否编译了这段代码。根据作者的示例代码,它不可能不被初始化(这显然是发生的)。它只是在被使用之前从未被赋值。这只是一个警告,在示例代码中可以忽略。@Ramhound,您似乎使用了“initialized”来表示“defined”。这不是正确的用法。就这种用法而言,初始化本质上是赋值。
string curNamespace = null; /* ASSIGN SOMETHING HERE */
try
{
  curNamespace = "name";
}
catch (Exception e)
{
throw new Exception("Error reading " + curNamespace, e);

}