Какова цель дополнительных брекетов в корпусе Switch?

Мне интересно об этом... см. пример:

switch(x)
{
    case(a):
        {
        //do stuff
        }
        break;
    case(b):
        //do stuff
        break;
}

Всю свою жизнь я делал это как случай b, но так как С# позволяет мне его использовать, а Visual Studio позволяет мне свернуть эту вещь, мне любопытно - какова реальная разница между случаем a (с фигурными скобками) и случай b?

Ответ 1

Брекеты {} используются для определения области для набора операций. Необычно, компилируется и работает следующее:

private void ConnectionStateChange(object sender, StateChangeEventArgs e)
{
    string s = "hi";
    switch(s)
    {
        case "hi":
            {
                int a = 1;
                a++;
            }
            {
                int a = 2;
                a++;
            }
            break;
    }

    {
        int a = 1;
        a++;
    }
    {
        int a = 2;
        a++;
    }
}

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

Означает ли это какой-то смысл?

Ответ 2

Пара фигурных скобок (не скобки - [] - и не круглые скобки - () - но фигурные скобки {}) с нулевыми или более операторами в них - это юридический оператор в С#, и поэтому может появятся в любом месте, где выражение может быть законным.

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

Я отмечаю, что это особенно интересно в инструкции switch, потому что правила определения области действия в коммутаторе немного странны. Подробности о том, насколько они странны, см. В "Случай 3:" в моей статье по теме:

http://ericlippert.com/2009/08/13/four-switch-oddities/

Ответ 3

Создает новую область, в которой вы можете создавать новые переменные.

Ответ 4

Он создает новую область для используемых вами переменных. Сфера действия переменных иногда может быть сложной. Например, в опубликованном вами коде;

switch(x)
{
    case(a):
        {
        int i = 0;
        }
        break;
    case(b):
        i = 1; // Error: The name 'i' doesn't exist in the current context
        break;
}

Ошибка здесь имеет смысл, так как в case(b) переменная a выходит за пределы области видимости. Теперь, с другой стороны,

switch(x)
{
    case(a):
        {
        int i = 0;
        }
        break;
    case(b):
        int i = 1; // Error: A local variable named 'i' cannot be declared in this scope because it would give a different meaning to 'i', which is already used in a 'child' scope to denote something else
        break;
}

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

switch(x)
{
    case(a):
        {
        int i = 0;
        }
        break;
    case(b):
        {
        int i = 1; // No error
        }
        break;
}

Эрик Липперт поделился очень хорошей ссылкой