在switch语句中切换语句?

gra*_*ady 20 c# switch-statement

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

switch(id)
{
    case 5:
         // switch some other cases here
    case 6:
         // set some value
    ...
 }
Run Code Online (Sandbox Code Playgroud)

在案例5中有另一个开关是好的做法吗?如果没有,有什么更好的?在if那里发表声明?

Llo*_*ell 19

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

switch(id)
{
    case 5:
         functionFiveSpecific(id);
    case 6:
         // set some value
    ...
 }
Run Code Online (Sandbox Code Playgroud)

案例5的具体功能:

private void functionFiveSpecific(id)
{
   // other switch in here
}
Run Code Online (Sandbox Code Playgroud)

虽然

强烈建议尽可能避免使用switch语句.请在这里阅读.

  • *强烈建议尽可能避免使用switch语句.*不要传播fud.有限制的东西并不是为了它能够避免它的原因.`foreach`有限制,为什么要使用它?哎呀C#有局限性,为什么要这么麻烦?`switch`更具可读性,如果重要的话,速度微不足道.但如果你的意思是多态性,那么我同意. (9认同)

And*_*are 7

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

switch(id)
{
    case 5:
    {
        switch (somethingElse)
        {
            case 1:
                // blah...
        }
    }
    case 6:
         // set some value
    ...
}
Run Code Online (Sandbox Code Playgroud)

您可以通过将嵌套部分移动到方法中来改进这一点:

switch(id)
{
    case 5:
        Foo();
        break;
    case 6:
         // set some value
    ...
}
Run Code Online (Sandbox Code Playgroud)


abh*_*ash 7

避免!

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

战略模式](![战略模式

  • 你能为你的模式提供一个简单的代码示例吗?我不确定我是否能理解如何从嵌套开关转换为此模式.. (5认同)
  • +1 用于将多态行为分离为策略。不幸的是,这对于您无法重构代码的简单事情来说太过分了,因为它来自“外部”:( (2认同)

Ada*_*rth 6

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

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


blo*_*art 6

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

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

    ...

    case OrderStatus.ReadyToShip
        // Process Shipping Instructions
        ShipOrder(order);
        break;
}
Run Code Online (Sandbox Code Playgroud)

然后,如果你有一个基于付费运输类型的开关

void ShipOrder(Order order)
{
    switch (order.ShippingMethod)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

通过将第二个switch语句移出第一个,它更容易维护,也可以单独测试


Sam*_*der 5

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

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

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