Подтвердить что ты не робот

Оператор switch внутри оператора switch (С#)?

Мне нужно оценить многие условия. В моем случае я должен сделать что-то вроде этого:

switch(id)
{
    case 5:
         // switch some other cases here
    case 6:
         // set some value
    ...
 }

Хорошо ли иметь другой переключатель в случае 5? Если нет, то что лучше? Есть ли там?

Спасибо: -)

4b9b3361

Ответ 1

Я бы назвал функцию, которая была специфичной для случая 5, а затем имеет случай переключения в этой функции. Например:

switch(id)
{
    case 5:
         functionFiveSpecific(id);
    case 6:
         // set some value
    ...
 }

Функция, специфичная для случая 5:

private void functionFiveSpecific(id)
{
   // other switch in here
}

Хотя

Настоятельно рекомендуется избегать использования операторов switch, если это возможно. Здесь читайте .

Ответ 2

Единственное, что может быть неправильным в том, что это может ухудшить читаемость:

switch(id)
{
    case 5:
    {
        switch (somethingElse)
        {
            case 1:
                // blah...
        }
    }
    case 6:
         // set some value
    ...
}

Вы можете улучшить это, перемещая вложенный раздел в метод:

switch(id)
{
    case 5:
        Foo();
        break;
    case 6:
         // set some value
    ...
}

Ответ 3

Избегайте!

Попробуйте реорганизовать свой код, чтобы исключить случаи переключения. Операторы switch для поведения могут быть реорганизованы в шаблон стратегии.

Strategy Pattern](![Strategy Pattern

Ответ 4

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

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

Ответ 5

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

Это не всегда возможно, и если вы должны использовать операторы switch, я бы не добавил другой вложенный оператор switch (или набор операторов if), но, вероятно, имел бы вызов метода, который бы содержал эту логику.

Если вы разместите более подробную информацию о том, что вы пытаетесь сделать, мы можем предложить лучшие предложения.

Ответ 6

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

switch (order.Status)
{
    case OrderStatus.New: 
        // Do something to a new order;
        break;

    ...

    case OrderStatus.ReadyToShip
        // Process Shipping Instructions
        ShipOrder(order);
        break;
}

а затем, если у вас есть переключатель в зависимости от типа доставки, оплаченного за

void ShipOrder(Order order)
{
    switch (order.ShippingMethod)
    {
    }
}

Перемещение второго оператора switch из первого упрощает его обслуживание, а также может быть протестировано изолированно

Ответ 7

Используйте Полиморфизм, если это возможно. Это сделает ваш код намного более чистым.

Ответ 8

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