我有保存文件的代码,如
SaveFileDialog dialog = new SaveFileDialog();
dialog.Filter = "Text files|*.txt";
SaveDialog:
if ((bool)dialog.ShowDialog()) {
if (System.IO.Path.GetExtension(dialog.FileName) != ".txt") {
MessageBox.Show("You must select a .txt file");
dialog.FileName = "";
goto SaveDialog;
}
File.WriteAllText(dialog.FileName, txtEditor.Text);
}
我读到我不应该使用goto。我可以使用do / while并检查是否选择了有效的扩展名,但这将添加许多不必要的代码。我觉得这个整洁。还是有更好/更正确的方式?
答案 0 :(得分:5)
using (SaveFileDialog dialog = new SaveFileDialog())
{
dialog.Filter = "Text files|*.txt";
while(dialog.ShowDialog() == DialogResult.OK)
if (System.IO.Path.GetExtension(dialog.FileName).ToLowerInvariant() != ".txt")
MessageBox.Show("You must select a.txt file");
else // file is ok
{
File.WriteAllText(dialog.FileName, txtEditor.Text);
break;
}
}
答案 1 :(得分:4)
我建议如下:
using (SaveFileDialog dialog = new SaveFileDialog()) {
dialog.Filter = "Text files|*.txt";
while (true) {
if (dialog.ShowDialog() == DialogResult.OK) {
if (!System.IO.Path.GetExtension(dialog.FileName).Equals(".txt", StringComparison.InvariantCultureIgnoreCase)) {
MessageBox.Show("You must select a .txt file");
}
else {
File.WriteAllText(dialog.FileName, txtEditor.Text);
break;
}
}
else break;
}
}
虽然使用goto语句有合理的原因,但在这种情况下可以避免使用它,并用更易读的解决方案替换。
另请注意,不应将DialogResult(ShowDialog()的返回值)强制转换为bool。