6
string foo;
try
{
    foo = "test"; // yeah, i know ...
}
catch // yeah, i know this one too :)
{
    foo = null;
}
finally
{
    Console.WriteLine(foo); // argh ... @#!
}
Console.WriteLine(foo); // but nothing to complain about here

此外,它不是 BP(捕捉路由)——但这是我能得到的最好的隔离。
但是我收到很好的波浪告诉我“危险,危险 - 可能未初始化”。怎么会?

编辑:
请不要建议“简单地string foo = string.Empty;在'声明'处放一个”。我想申报,但请按时完成任务!

4

6 回答 6

3

C# 规范(5.3.3.14)的一些背景:

对于以下形式的 try 语句 stmt:

尝试 try-block finally finally-block

(...)

finally-block开头的v的确定赋值状态与stmt开头的v的确定赋值状态相同。

编辑 Try-Catch-Finally(5.3.3.15):

对 try-catch-finally 语句 (...) 进行明确的赋值分析,就像该语句是包含 try-catch 语句的 try-finally 语句一样

以下示例演示了 try 语句(第 8.10 节)的不同块如何影响明确赋值。

class A
{
  static void F() 
  {
    int i, j;
    try {
      goto LABEL;
      // neither i nor j definitely assigned
      i = 1;
      // i definitely assigned
    }
    catch {
      // neither i nor j definitely assigned
      i = 3;
      // i definitely assigned
    }
    finally {
      // neither i nor j definitely assigned
      j = 5;
      // j definitely assigned
    }
    // i and j definitely assigned
    LABEL:;
    // j definitely assigned
  }
}

我只是想到了一个更好地说明问题的例子:

int i;
try
{
    i = int.Parse("a");
}
catch
{
    i = int.Parse("b");
}
finally
{
   Console.Write(i);
}
于 2012-05-24T07:13:56.863 回答
2

您必须 string foo = null根据需要将第一行更改为或初始化。就编译器而言,在 foo 在 try 块中初始化之前可能会出现异常,并且 catch 也可能不会发生。

于 2012-05-24T07:05:03.700 回答
2

我认为问题可能在于存在抛出异常try的情况。catch在这种情况下,finally仍应达到 ,但使用未初始化的foo. 由于在这种情况下,将无法访问其余代码(在catch块中引发的异常将我们带出 . 之后的方法finally),这不会对finally. 只有在trycatch块运行时才能访问该代码。

由于总是存在每次分配都会foo引发异常的情况,并且在这种情况下,finally块将始终运行,因此始终foo存在未初始化的可能性。

据我所知,解决此问题的唯一方法是为foo.

于 2012-05-24T07:37:45.007 回答
0

在课堂上声明你string foo会解决问题

编辑:

string foo = "default";
try
{
    foo = "test"; 
}
catch (Exception) 
{
    foo = null;
}
finally
{
    Console.WriteLine(foo); 
}
于 2012-05-24T07:20:52.053 回答
-2

尝试

string foo = string.Empty;
于 2012-05-24T07:04:28.757 回答
-2

试试这个:

string foo = null;
try
{
    foo = "test"; // yeah, i know ...
}
catch // yeah, i know this one too :)
{
}
finally
{
    Console.WriteLine(foo); // argh ... @#!
}
Console.WriteLine(foo); // but nothing to complain about here
于 2012-05-24T07:05:22.220 回答