C# 简化if-else表达式

C# 简化if-else表达式,c#,C#,我正在尝试管理一个3结果对话框,如果。。。除此之外,我发现它很难使用。这是我的代码: if (MessageBox.Show("Are you sure you want to exit", "", MessageBoxButtons.YesNoCancel) == DialogResult.Yes) { MessageBox.Show("Why?!", "", MessageBoxButtons.RetryCancel); Application.Restart(); } else

我正在尝试管理一个3结果对话框,如果。。。除此之外,我发现它很难使用。这是我的代码:

if (MessageBox.Show("Are you sure you want to exit", "", MessageBoxButtons.YesNoCancel) == DialogResult.Yes) {
   MessageBox.Show("Why?!", "", MessageBoxButtons.RetryCancel);
   Application.Restart();
} else if (MessageBox.Show("Are you sure you want to exit", "", MessageBoxButtons.YesNoCancel) == DialogResult.No) {
    if (MessageBox.Show("OK ^_^! Good Luck!", "", MessageBoxButtons.OK) == DialogResult.OK) 
        Application.Restart();
} else {
    if (MessageBox.Show("Are you sure you want to cancel?", "", MessageBoxButtons.OKCancel) == DialogResult.OK) {
        MessageBox.Show("Ok! Good Luck!");
        Application.Restart();
    } else {
        MessageBox.Show("Error!");
        Application.Restart();
    }
}
每当我运行它时,如果我按“否”或“取消”,它就会打开一个新对话框。如何避免这种情况?

您应该首先获得DialogResult,然后在if-else语句中使用它:

DialogResult result = MessageBox.Show("Are you sure you want to exit", "", MessageBoxButtons.YesNoCancel);

if(result == DialogResult.Yes)
{
    //Code if Ok
}
else if(result == DialogResult.No)
{
    //Code if No
}
else
{
    //Code if Cancel
}
这样,消息框只会打开一次,如果您的第一条if语句正在检查Yes的结果:

如果用户选择“否”或“取消”,则转到下一条If语句,该语句将生成另一个MessageBox:

最后,如果用户选择“取消”,您将获得另一个MessageBox:

这就是为什么会看到多个MessageBox实例

因此,您应该只显示一个框,然后处理结果。但是,该准则建议,必须收集某些情况下的其他信息:

var result = MessageBox.Show("Are you sure you want to exit", "", MessageBoxButtons.YesNoCancel);
switch(result)
{
    case DialogResult.Yes:
        //Another box pops up to ask the user why
        MessageBox.Show("Why?!", "", MessageBoxButtons.RetryCancel);
        Application.Restart();
        break;
    case DialogResult.No:
        //Informational box
        MessageBox.Show("OK ^_^! Good Luck!", "", MessageBoxButtons.OK);
        Application.Restart();
    default:
        //Assume Cancel to be the default behavior, 
        //Pick any value to be the default. It's up to you.
        //Make sure they really, REALLY want to cancel
        if (MessageBox.Show("Are you sure you want to cancel?", "", MessageBoxButtons.OKCancel) == DialogResult.OK) 
        {
            MessageBox.Show("Ok! Good Luck!");
            Application.Restart();
        } 
        else 
        {
            MessageBox.Show("Error!");
            Application.Restart();
        }
}
我认为您的代码不应该调用应用程序。请在Cancel选项的false分支重新启动,但逻辑取决于您


正如其他人所指出的,请尝试正确地缩进/格式化代码。这将使您和其他人更容易理解。

您应该在代码中缩进至少四个空格,以使其格式正确。类似于codereview.stackexchange.com分配MessageBox的结果。显示一个变量,并在if语句中选中该变量。使用调试器。@如果语句是一种编码样式,MichaWiedenmann将省略单个语句周围的花括号。除非括号内的语法有错误,否则您提到的if语句仍然可以编译。@MichaWiedenmann:怎么会这样?根据OP的问题:每当我运行它时,如果我按“否”或“取消”,它就会打开一个新对话框。我怎样才能避免呢?确实如此。非常感谢@MaxGrip很高兴这对你有帮助。请接受答案
else if (MessageBox.Show("Are you sure you want to exit", "", MessageBoxButtons.YesNoCancel) == DialogResult.No) {
else {
    if (MessageBox.Show("Are you sure you want to cancel?", "", MessageBoxButtons.OKCancel) == DialogResult.OK) 
     //Other code here...
     }
var result = MessageBox.Show("Are you sure you want to exit", "", MessageBoxButtons.YesNoCancel);
switch(result)
{
    case DialogResult.Yes:
        //Another box pops up to ask the user why
        MessageBox.Show("Why?!", "", MessageBoxButtons.RetryCancel);
        Application.Restart();
        break;
    case DialogResult.No:
        //Informational box
        MessageBox.Show("OK ^_^! Good Luck!", "", MessageBoxButtons.OK);
        Application.Restart();
    default:
        //Assume Cancel to be the default behavior, 
        //Pick any value to be the default. It's up to you.
        //Make sure they really, REALLY want to cancel
        if (MessageBox.Show("Are you sure you want to cancel?", "", MessageBoxButtons.OKCancel) == DialogResult.OK) 
        {
            MessageBox.Show("Ok! Good Luck!");
            Application.Restart();
        } 
        else 
        {
            MessageBox.Show("Error!");
            Application.Restart();
        }
}