交换机中的情况怎么能没有休息?

时间:2015-11-13 14:36:41

标签: c# c#-4.0

我最近继承了一些写得很差的代码。不幸的是,它是一个我们高度依赖的系统,而且没有时间重新编写它,所以我坚持维护它并重新编写文件。但是,今天我偶然发现这个包含一个开关的方法,其中一个case语句没有中断。这怎么能编译?我的理解是,所有案件都必须打破,返回或转到。

private void ReadBadge_Activated(object sender, EventArgs e)
    {
        try
        {
            if (!bInHideMode)
            {
                // Set Button states
                btnCancelSwipe.Visible = true;
                btnCancelSwipe.Refresh();

                // Enable the Timeout timer
                //tmrTimeout.Enabled = true;

                // Refresh data
                switch (mManageAction)
                {
                    case "LogOnManager":
                    case "NormalUse":
                        lblSwipeStatus.Text = "Pass ID Badge\nNear The Reader";
                        break;
                    case "AddNewUser":
                        lblSwipeStatus.Text = "Pass ID Badge\nNear The Reader\nFor: " + mUserName;
                        break;
                    default:
                        lblSwipeStatus.Text = "Pass ID Badge\nNear The Reader\nFor: " + mUserName;
                        break;
                }
            }
        }
        catch (Exception ex)
        {
            MessageBoxNoClick.MessageBox2(ex.Message, "Error Message");
        }
    }

8 个答案:

答案 0 :(得分:9)

这个结构:

case "LogOnManager":
case "NormalUse":
    lblSwipeStatus.Text = "Pass ID Badge\nNear The Reader";
    break;

基本上意味着第二个case中的代码将用于 case。因此,两种情况都使用相同的代码。

语义上这可以被认为是:

case "LogOnManager" || "NormalUse":
    lblSwipeStatus.Text = "Pass ID Badge\nNear The Reader";
    break;

除此之外,它不会编译为switch语句的有效条件。 (可能有几个原因,如果你想获得真正的技术,但主要是因为这评估为boolswitch正在string上运行。)所以版本你&# 39;我找到了工作。

当省略break语句时(或者更具体地说,当case块为空时),该过程将继续执行下一个case的任何内容,无论值是什么用于下一个case

答案 1 :(得分:4)

如果开关盒没有断裂,那么它将在下一种情况下掉线。请注意,在C#中,只有在案例正文中没有任何内容时才能生效。

来自Documentation

  

C#不支持从一个案例标签到另一个案例标签的隐式下降。一个例外是如果case语句没有代码。

答案 2 :(得分:2)

在这种情况下没有休息的情况只意味着它将与它下面的情况相同。

因此,这些案例中的任何一个都会做同样的事情:

  case "LogOnManager":
  case "NormalUse":
                    lblSwipeStatus.Text = "Pass ID Badge\nNear The Reader";
                    break;

它被称为堕落

答案 3 :(得分:1)

根据C#规范:

  

8.7.2 如果可以访问切换部分的语句列表的结束点,则会发生编译时错误。这被称为“不倒   通过“规则。

在您的情况下,由于LogOnManagerNormalUse都会执行第一个表达式

,因此终点无法访问

答案 4 :(得分:1)

唯一没有明确结束的情况(breakreturngotothrow等)是case "LogOnManager":。它没有一个机构,但与后一个案例相同。这是允许的,允许多个案例标签共享一个块。

长期以来一直被认为是避免堕落的最佳做法,但这样的情况被认为是可以的,因为仍然只有一个身体。当C#禁止隐式直通(要求goto使其显式)时,由于这种观点,只有像这样的例子才是好习惯。因此,该类型并未被禁止。

答案 5 :(得分:1)

正如其他人所指出的,这是一个有效的落实案例。由于两个案例之间没有任何代码行'语句,都将运行相同的代码行。

因此,会导致错误:

switch (mManageAction)
{
    case "LogOnManager":
         lblSwipeStatus.Text = "Pass ID Badge\nNear The Reader";
         // Hey! Add a break here. ERROR
    case "NormalUse":
        lblSwipeStatus.Text = "Pass ID Badge\nNear The Reader";
        break;
}

供参考https://msdn.microsoft.com/en-us/library/06tc147t.aspx

答案 6 :(得分:0)

如果case语句没有中断,则将执行下一个案例中的traitement

答案 7 :(得分:0)

这意味着对同一段代码应用了2个标签。这是一个有效的案例。

Here是官方文档,其中包含:

  

switch语句可以包含任意数量的开关部分,每个部分可以有一个或多个case标签(如下面的字符串case标签示例所示)。但是,没有两个案例标签可能包含相同的常量值。