在 C# 中的 Label 之后未分配字符串

String is unassigned after Label in c#

我有一个我完全不明白的问题:

在下面的代码中,使用了字符串 path。路径在标签前有效,但之后未分配。令我困惑的是,所有其他变量都有效!

代码:

path = @"C:\incidents\jobTransfer";
File.WriteAllLines(path + incident + "\result_" + incident + ".txt", resultText.ToArray());
End:;
File.WriteAllLines(incident, resultText.ToArray());
File.WriteAllLines(path + incident + "\result_" + incident + ".txt", resultText.ToArray()); // issue at path in this line

Use of unassigned Variable...

我可以在标签之后重新分配变量,但是我总是必须编辑 2 行代码以防发生变化

某处你有:

string path;

成功

string path = null;

它解决了你的问题。


虽然已分配 null,但路径并未在标签处取消分配。

但是,既然我想到了,也许你的意思是:

string path = @"C:\incidents\jobTransfer";

这样一来,它就被分配并从一开始就有了一个有效值。

参见this fiddle


例子

    string path;
    goto End;
AnotherLabel:
    path = @"C:\incidents\jobTransfer";
    Console.WriteLine(path);
End:;
    // issue at path in this line
    Console.WriteLine(path);

修复

    string path = null;
    goto End;
AnotherLabel:
    path = @"C:\incidents\jobTransfer";
    Console.WriteLine(path);
End:;
    // no issue at path in this line
    Console.WriteLine(path);

建议

    string path = @"C:\incidents\jobTransfer";
    goto End;
AnotherLabel:
    Console.WriteLine(path);
End:;
    // no issue at path in this line
    Console.WriteLine(path);

建议

    // don't use labels, due to these kinds of obscurities ;-)

当您使用标签时——这在 C# 中并不常见,上面这个标签本质上是一个范围,之后是另一个范围——所以声明的变量不再在范围内,所以这就是它不再被赋值的原因,您需要在使用标签之外声明此变量 - 或者根本不使用标签,因为这在 C#

中并不常见

问题很可能是您的标签 - 这允许跳转到您的 "End" 标签的代码路径允许不设置 "path"。

2 个简单的解决方案:

  • 重新分配 "path = @"C:\incidents\jobTransfer";"在 "End" 标签之后 - 您提到的是有问题的,因为如果更改,您将有两个地方可以编辑代码。 (虽然,如果你在某种配置文件中参数化它,你可以改变它一次)。
  • 将标签放在 "path" 的原始赋值上方,并使用一些条件来跳过你的 "File.WriteAllLines(path + incident + "\result_" + incident + ".txt", resultText.ToArray()); “如果不需要。

更好的解决方案是根本不使用标签 - 这些标签通常不受欢迎,而您的问题是众多原因之一;虽然,在每个人都因为使用 goto 而跳进你的喉咙之前,有一些可以接受的 reasons to use it.