在switch语句中切换语句?

时间:2011-05-23 12:58:59

标签: c# switch-statement

我必须评估许多条件。就我而言,我必须做这样的事情:

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

在案例5中使用另一个开关是一种好习惯吗?如果没有,有什么更好的?那里有if个陈述?

8 个答案:

答案 0 :(得分:19)

我会调用一个特定于案例5的函数,然后在该函数中使用switch case。例如:

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

案例5特有的功能:

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

<强>虽然

强烈建议尽可能避免使用switch语句。阅读here

答案 1 :(得分:7)

唯一可能出错的是它可能会损害可读性:

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
    ...
}

答案 2 :(得分:7)

避免!

尝试重构代码以消除切换案例。行为的切换语句可以重构为策略模式。

Strategy Pattern](![Strategy Pattern

答案 3 :(得分:6)

切换语句也不错。嵌套的switch语句可能很麻烦。

或许考虑将嵌套的switch语句嵌入到另一种方法中以提高清晰度。

答案 4 :(得分:6)

一旦你开始筑巢,你的Cyclomatic complexity开始上升。根据嵌套开关的复杂程度,维护起来很有趣。您可能想要考虑将第二个嵌套开关移动到它自己的函数。例如

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语句移出第一个,它更容易维护,也可以单独测试

答案 5 :(得分:5)

更好的做法是将不同的行为以多态方式封装在不同的类中,并尽可能避免使用switch语句。

这并不总是可行,如果你必须使用switch语句,那么我不会放置另一个嵌套的switch语句(或if语句的集合),但可能会有一个包含该逻辑的方法调用。

如果你发布一些关于你想要做的事情的更多细节,那么我们可能会提供更好的建议。

答案 6 :(得分:2)

尽可能使用多态性。这将使您的代码更清晰。

答案 7 :(得分:1)

我会调用一个函数并传入其他案例,并在函数中对它们执行开关案例。使清洁代码。我经常使用的另一种方法确实是嵌套的,如果是