Оператор С# switch более ограничен, чем vb.net 'case'

Я читал интересную статью здесь, и он сделал интересный момент в отношении оператора case в vb.net vs 'switch 'в С#, который я вставил ниже:

Следующий оператор Visual Basic Select Case не может быть представлен в С# с помощью одного оператора switch:

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

Я всегда находил оператор switch в С# с переходом и последовательными требованиями для разрыва в каждом случае, чтобы быть немного громоздким. Есть ли причина, по которой они не улучшили команду переключения, чтобы разрешить эти ситуации? Когда все-таки будет полезно? Кто-нибудь знает о каких-либо расширениях конструкции, чтобы обеспечить большую гибкость?

Приветствия

Ответы

Ответ 1

В С# вы можете использовать только отдельные значения в случаях. Это делает его более ограниченным, но, с другой стороны, он делает его быстрее, потому что его можно реализовать с помощью поиска хэшей.

Синтаксис коммутатора был более ограничен в С#, чем в 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;
}

Ответ 2

Я помню, как один преподаватель сказал нам, что единственная полезная вещь, которую он когда-либо делал, чтобы провалиться, заключалась в том, чтобы написать текст в двенадцать дней рождества.

Что-то в этом направлении

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 лет я с ним согласен. В то время, когда мы делали java, который проваливался, он должен был подделать его для С#.

Ответ 3

Пропуск разрешен для специального случая совпадения нескольких случаев, но случаи сравнения и диапазона не допускаются. Итак:

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
}