在case语句中检测到无法访问的代码

Але*_* Д. 17 c#

我有一个代码:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        switch (keyData)
        {
            case Keys.Alt|Keys.D1:

                if (this._condition1)
                {
                    return true;
                }
                else
                {
                    return base.ProcessCmdKey(ref msg, keyData);
                }

                break;

            case Keys.Control |Keys.U:

                if (this._condition2)
                {
                    return true;
                }
                else
                {
                    return base.ProcessCmdKey(ref msg, keyData);
                }

                break;

            default:

                return base.ProcessCmdKey(ref msg, keyData);
        }

        return true;
Run Code Online (Sandbox Code Playgroud)

它让我在休息时"检测到无法访问的代码"警告.

在这里不使用break运算符是一种好习惯吗?我不想关闭"检测到无法访问的代码"警告.

PS:我的ProcessCmdKey方法有很多种情况.

Aka*_*ava 19

有你的码连续3条可达语句,前两个是break语句,最后一个诠释他的最后一行"返回true"也无法访问,我不知道C#编译器是否检测到或没有,但在逻辑上是没有办法最后一个返回声明也将达成.

有多种方法可以解决这个问题,

  1. 存储一个名为bool retVal的临时变量,保持retVal并断开你的开关盒,并在函数返回retVal的末尾.
  2. 如果在break之前返回值,break语句就没用了.

更好的设计方式

如果在switch case中返回值,可能很难在以后由你或其他人分析你的代码,通常最好保留一个返回值temp变量并在函数结束时返回它,这样就更容易调试和理解新编码器的代码.

交换机可能很复杂,并且交换机内的更多返回可能没有更好的控制,如果要实现日志记录,调试,从案例返回可能会很复杂.并且它成为难以浏览逻辑流程图的方法.

所以最好避免返回altogather,但仍然依赖于situtations,需要在这里做出明智的决定.

  • 如果你的`switch`案例很长,以至于在使用`return`语句时很难分析,那么你的`switch`案例太长了.有争议的是,使用临时值并在最后返回至少与多次返回一样令人困惑,可能更多. (4认同)

Dan*_*vil 18

break如果case语句中的所有路径都以a 结尾,则不是必需的return.不要使用它,否则你会收到上述警告.

  • @alex:嗯,编译器告诉你这是一个好习惯,当你不遵循它时给你一个警告. (5认同)

Hin*_*nek 9

在这种情况下,好的做法imho将结束每个案例的回报,如下所示:

case Keys.Alt|Keys.D1:
    bool result;
    if (this._condition1) 
        { 
            result = true; 
        } 
        else 
        { 
            result = base.ProcessCmdKey(ref msg, keyData); 
        }
    return result;
Run Code Online (Sandbox Code Playgroud)

要么

case Keys.Alt|Keys.D1:
    bool result = (this._condition1)
        ? true
        : base.ProcessCmdKey(ref msg, keyData); 
    return result;
Run Code Online (Sandbox Code Playgroud)


Wil*_*den 5

删除break此处的语句没有错.