代码之家  ›  专栏  ›  技术社区  ›  Even Mien

检查先决条件然后调用switch语句的最简洁语法检查是什么?

  •  0
  • Even Mien  · 技术社区  · 16 年前

    将某些先决条件的检查与switch语句结合起来最简洁的语法是什么?我可以合并if/else和switch语句吗?

    if (!IsValid(text))
    {
       DoSomeLogging();
    }
    else
    {
       switch (text)
       {
         case "1":
            DoSomething();
            break;
         case "2"
            DoSomethingElse();
            break;
         default:
            break;
       }
    }
    

    编辑: 删除跳过评论。我不想颠倒这个说法。

    9 回复  |  直到 16 年前
        1
  •  6
  •   Jon Skeet    16 年前

    即使可以,我也不想把它们结合起来。我认为将“验证”和“处理”分开是个好主意。

    能够

    switch (Validate(text))
    {
        case null:
            throw ArgumentException("Invalid text");
        case "1":
           DoSomething();
           break;
        case "2"
           DoSomethingElse();
           break;
        default:
            break;
    }
    

    ... 哪里 Validate 如果文本无效,则返回null。(当然,这假设null不是一个有效的起始值。)

    if (!IsValid(text))
    {
        throw ArgumentException("Invalid text");
    }
    // No need for an else, just proceed with the switch from here
    
        2
  •  2
  •   D'Arcy Rittich    16 年前
    if (IsValid(text))
    {
       switch (text)
       {
         case "1":
            DoSomething();
            break;
         case "2"
            DoSomethingElse();
            break;
         default:
            break;
       }
    }
    
        3
  •  2
  •   Polyfun MicBehrens    16 年前

    if (!IsValid(text))
    {
        DoSomeLogging();
    }
    else switch (text)
    {
    }
    

    if (!IsValid(text))
    {
        DoSomeLogging();
    }
    else 
    {
        switch (text)
        {
        }
    }
    

    这个语法是通过C++继承的。

        4
  •  0
  •   unwind    16 年前

    怎么样

    if (!IsValid(text))
        return;
    switch (text)
    {
      case "1":
        DoSomething();
        break;
      ...
    }
    

    也就是说,只需使用早期退出,无需尝试合并这两种构造。

        5
  •  0
  •   Anton Gogolev    16 年前

    // Skip 实际上是这样的,然后颠倒条件:

    if (IsValid(text))
    {
       switch (text)
       {
         case "1":
            DoSomething();
            break;
         case "2"
            DoSomethingElse();
            break;
         default:
            break;
       }
    }
    
        6
  •  0
  •   Charles Bretana    16 年前

    容易的

     if (IsValid(Text)) 
        switch(text)
        { 
            // cases 
    
        }
    

    或者更简洁地说,如果IsValid返回文本,如果文本有效,则返回文本;如果文本无效,则返回null,

     private string IsValid(string text)
     {
          if (/* code to check if text is valid */)
             return text;
          else return null;
     }
    

    那么你所需要的就是:

     switch(isValid(text))
     {
          //cases:
     }
    
        7
  •  0
  •   Even Mien    16 年前

    if (!IsValid(text))
       DoSomeLogging();
    else switch (text)
    {
      case "1":
         DoSomething();
         break;
      case "2"
         DoSomethingElse();
         break;
      default:
         break;
    }
    
        8
  •  0
  •   Community Mohan Dere    9 年前

    Switch语句通常可以替换为多态性(例如,参见 here

    if (!myObject.IsValid())
    {
       DoSomeLogging();
    }
    else
    {
        myObject.ExecuteSomeMethod();
    }
    

    如果你担心代码变得过于冗长,也许你应该考虑将其重构成类层次结构。

        9
  •  0
  •   Tim Cooper    14 年前

    简洁的版本可以是:

    switch (IsValid (text) ? text : null)
    {
    case null:
      DoSomeLogging ();
      break;
    case "1":
      DoSomething();
      break;
    case "2"
      DoSomethingElse();
      break;
    default:
      break;
    }
    

    然而,我从未想过打开字符串是一个特别好的主意。我不知道编译器将在这里生成什么代码,所以不能真正说明性能。如果这是一个偶然的代码路径,它可能是好的。如果这是一种叫做“很多”的东西,那么它就是一种值得警惕的东西。