C# Switch语句中的Switch语句?

C# Switch语句中的Switch语句?,c#,switch-statement,C#,Switch Statement,我必须评估许多条件。就我而言,我必须这样做: switch(id) { case 5: // switch some other cases here case 6: // set some value ... } 在案例5中使用另一个开关是否是良好的做法?如果没有,还有什么更好?有if语句吗?我会调用一个特定于案例5的函数,然后在该函数中使用开关案例。例如: switch(id) { case 5: Fu

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

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

在案例5中使用另一个开关是否是良好的做法?如果没有,还有什么更好?有
if
语句吗?

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

switch(id)
{
    case 5:
         FunctionFiveSpecific(id);
    case 6:
         // set some value
    ...
 }
特定于案例5的功能:

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

我会调用一个函数,在传统的情况下传递,在函数中对它们进行切换。使代码更清晰。我经常使用的另一种方法确实是嵌套式的,如果

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

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

Switch语句不是坏习惯。嵌套的switch语句看起来可能很混乱


也许可以考虑在另一种方法中嵌入嵌套的switch语句以提高清晰度。

如果可能,请使用多态性。这将使您的代码更干净。

更好的做法是将不同的行为多层次地封装在不同的类中,并尽可能避免使用switch语句

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


如果您在文章中详细介绍您正在尝试做的事情,我们可能会提供更好的建议。

一旦您开始筑巢,您的体重就会开始上升。根据嵌套开关的复杂程度,维护它可能会很有趣。您可能需要考虑将第二个嵌套开关移动到它自己的函数。比如说

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

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


使用switch语句本身就是一种不好的做法。只要它能工作,任何事情都是好的。@the Power查看Int3的配置文件,生活在一个无法(或可能永远无法)获得理想解决方案的世界中,我对这一评论持保留态度。有时,任何有效的东西都是当时能够实现的。不幸的是,并不是总是可以避免的。你的条件会随着使用类和多态性而消失吗?你也可以考虑使用“表驱动”的方法。通常可以将一个大的嵌套switch语句转换为字典或数组查找。事实上,这是一个非常适合本文的答案。想象一下,通过使用这里提到的OOP概念之一,可以实现一个没有if语句的代码。+1用于将多态行为分离为策略。不幸的是,对于简单的事情来说,这是过度的工作,因为你不能重构你的代码,因为它来自“外部”:(您能为您的模式提供一个简单的代码示例吗?我不确定我是否能理解如何将嵌套开关转换为此模式。。那篇文章似乎并没有建议强烈建议避免使用非嵌套开关。对于嵌套开关,是否有其他特定的原因避免使用开关?除了性能原因,性能原因并非如此。)在今天的机器上是很重要的。强烈建议尽可能避免使用switch语句。不要传播fud。有限制的东西并不是避免它的理由。foreach有限制,为什么要使用它?见鬼C#有限制,为什么要麻烦?
switch
可读性更高,意义不大如果重要的话会更快。但如果你是指多态性,那么我同意。你能更具体一点并给出代码示例吗?