C# 开关语句比 vb.net“大小写”更受限制

本文关键字:大小写 受限制 net 开关 语句 vb | 更新日期: 2023-09-27 17:55:19

我在这里读了一篇有趣的文章,它提出了一个有趣的观点,关于 vb.net 中的"case"语句与 C# 中的"switch"语句,我粘贴在下面:

下面的 Visual Basic Select Case 语句不能在 C# 中使用单个开关语句表示:

Dim Condition As Integer = 55
Select Case Condition
  Case 1, 3 To 5, 10, 12, 14, Is > 50
    'value 55 executes code here
  Case Else
    'values <1, 2, 6-9, 11, 13, 15-49
End Select

我总是发现 C# 中的 switch 语句,在每种情况下都有删除和相应的中断要求,有点笨拙。 他们有什么理由没有增强 switch 命令以允许这些情况吗? 什么时候会有用? 有人知道该结构的任何扩展以允许更大的灵活性吗?

干杯

C# 开关语句比 vb.net“大小写”更受限制

在 C# 中,只能在情况下使用不同的值。这使得它更加有限,但另一方面,它使它更快,因为它可以使用哈希查找来实现。

与 C/C++ 中的相比,C# 中的开关语法受到更多限制。你仍然可以做同样的事情,但失败不是隐式的,你必须写一个特定的跳转到下一个案例。这种限制的原因是,错误地失败比故意失败要常见得多。

在 C# 中,默认情况下需要一个 if 语句来处理范围:

int condition = 55;
switch (condition) {
  case 1:
  case 3:
  case 4:
  case 5:
  case 10:
  case 12:
  case 14:
    // values 1, 3-5, 10, 12, 14
    break;
  default:
    if (condition > 50) {
      // value 55 executes code here
    } else {
      // values <1, 2, 6-9, 11, 13, 15-49
    }
    break;
}

我记得一位大学讲师曾经告诉我们,他发现唯一有用的事情就是写出圣诞节十二天的歌词。

类似的东西

for (int i = 1; i <= 5; i++) {
    Console.WriteLine("On the " + i + " day of christmast my true love gave to me");
    switch (i) {
    case 5:
        Console.WriteLine("5 Gold Rings");
        goto case 4;
    case 4:
        Console.WriteLine("4 Colly Birds");
        goto case 3;
    case 3:
        Console.WriteLine("3 French Hens");
        goto case 2;
    case 2:
        Console.WriteLine("2 Turtle Doves");
        goto case 1;
    case 1:
        Console.WriteLine("And a Partridge in a Pear Tree");
        break;
    }
    Console.WriteLine("-");
}

10 years later I tend to agree with him. At the time we were doing java which does fall through, had to fake it for C#.

Drop through is allowed for the special case of matching multiple cases, but the comparative and range cases aren't allowed. So:

int condition = 55;
switch (condition) {
  case 1: case 3: case 4: case 5: case 10: case 12: case 14:
    // value 55 doesn't execute here anymore
  default:
    //values <1, 2, 6-9, 11, 13, >14
}