我最近继承了一些写得很差的代码。不幸的是,它是一个我们高度依赖的系统,而且没有时间重新编写它,所以我坚持维护它并重新编写文件。但是,今天我偶然发现这个包含一个开关的方法,其中一个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");
}
}
答案 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
语句的有效条件。 (可能有几个原因,如果你想获得真正的技术,但主要是因为这评估为bool
而switch
正在string
上运行。)所以版本你&# 39;我找到了工作。
当省略break
语句时(或者更具体地说,当case
块为空时),该过程将继续执行下一个case
的任何内容,无论值是什么用于下一个case
。
答案 1 :(得分:4)
如果开关盒没有断裂,那么它将在下一种情况下掉线。请注意,在C#中,只有在案例正文中没有任何内容时才能生效。
C#不支持从一个案例标签到另一个案例标签的隐式下降。一个例外是如果case语句没有代码。
答案 2 :(得分:2)
在这种情况下没有休息的情况只意味着它将与它下面的情况相同。
因此,这些案例中的任何一个都会做同样的事情:
case "LogOnManager":
case "NormalUse":
lblSwipeStatus.Text = "Pass ID Badge\nNear The Reader";
break;
它被称为堕落
答案 3 :(得分:1)
根据C#规范:
8.7.2 如果可以访问切换部分的语句列表的结束点,则会发生编译时错误。这被称为“不倒 通过“规则。
在您的情况下,由于LogOnManager
和NormalUse
都会执行第一个表达式
答案 4 :(得分:1)
唯一没有明确结束的情况(break
,return
,goto
,throw
等)是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;
}
答案 6 :(得分:0)
如果case语句没有中断,则将执行下一个案例中的traitement
答案 7 :(得分:0)
这意味着对同一段代码应用了2个标签。这是一个有效的案例。
Here是官方文档,其中包含:
switch语句可以包含任意数量的开关部分,每个部分可以有一个或多个case标签(如下面的字符串case标签示例所示)。但是,没有两个案例标签可能包含相同的常量值。