在 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.
我有一个我完全不明白的问题:
在下面的代码中,使用了字符串 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.