Оператор C# Switch с / без фигурных скобок... в чем разница?

всегда ли C# позволял вам опустить фигурные скобки внутри switch() заявление case: заявления?

каков эффект их исключения, как это часто делают программисты javascript?

пример:

switch(x)
{
  case OneWay:
  {                               //  <---- Omit this entire line
    int y = 123;
    FindYou(ref y);
    break;
  }                               //  <---- Omit this entire line
  case TheOther:
  {                               //  <---- Omit this entire line
    double y = 456.7; // legal!
    GetchaGetcha(ref y);
    break;
  }                               //  <---- Omit this entire line
}

4 ответов


фигурные скобки не требуются, но они могут пригодится ввести новый пространство. Насколько я знаю, это поведение не изменилось с C# 1.0.

эффект их пропуска заключается в том, что все переменные объявлены где-то внутри switch оператор виден с их точки объявления во всех ветвях case.

см. также пример Эрика Липперта (случай 3 в сообщении):

четыре переключатель странностей

Ерик:
switch(x)
{
  case OneWay:
    int y = 123;
    FindYou(ref y);
    break;
  case TheOther:
    double y = 456.7; // illegal!
    GetchaGetcha(ref y);
    break;
}

это не компилируется, потому что int y и double y в одном объявлении пространства введен switch заявление. Вы можете исправить ошибку, разделив пробелы объявления с помощью фигурных скобок:

switch(x)
{
  case OneWay:
  {
    int y = 123;
    FindYou(ref y);
    break;
  }
  case TheOther:
  {
    double y = 456.7; // legal!
    GetchaGetcha(ref y);
    break;
  }
}

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

Они могут быть полезны для ограничения в блоке переключателя. Например:

int x = 5;

switch(x)
{
case 4:
    int y = 3;
    break;
case 5:
    y = 4;
    //...                      
    break;
}

и..

int x = 5;

switch(x)
{
  case 4:
  {
    int y = 3;
    break;
  }
  case 5:
  {
    y = 4;//compiling error
    //...                      
    break;
  }
}

Примечание: C# потребует, чтобы вы установили значение y в блоке case 5 в первом примере перед его использованием. Этот защита против случайной переменной следовать до конца.


фигурные скобки внутри коммутатора на самом деле не являются частью структуры коммутатора вообще. Это просто блоки области, которые вы можете применить в коде в любом месте.

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

пример:

int x = 42;
{
  int y = x;
}
{
  int y = x + 1; // legal, as it's in a separate scope
}

они не являются строго необходимыми, но как только вы начинаете объявлять локальные переменные (в ветвях коммутатора), они очень рекомендуются.

Это не сработает:

    // does not compile
    switch (x)
    {
        case 1 :               
            int j = 1;
            ...
            break;

        case 3:
            int j = 3;   // error
            ...
            break;
    }

это компилируется, но это жутко:

    switch (x)
    {
        case 1 :               
            int j = 1;
            ...
            break;

        case 3:
            j = 3;
            ...
            break;
    }

Так что это лучше всего:

  switch (x)
    {
        case 1 : 
         {             
            int j = 1;
            ...
         }
         break;  // I prefer the break outside of the  { }

        case 3: 
         {
            int j = 3;
            ...
         }
         break;
    }

просто держите его простым и читаемым. Вы не хотите требовать от читателей подробного знания правил, описанных в среднем примере.