C#:我是否以正确的方式验证文件类型并使用goto?

时间:2010-08-23 07:08:04

标签: c#

我有保存文件的代码,如

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并检查是否选择了有效的扩展名,但这将添加许多不必要的代码。我觉得这个整洁。还是有更好/更正确的方式?

2 个答案:

答案 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。