【问题标题】:Can this if-else-else logic be rewritten into something neater?这个 if-else-else 逻辑可以改写成更简洁的东西吗?
【发布时间】:2011-04-03 06:51:42
【问题描述】:

我能否以更简单、更易于阅读的方式编写以下逻辑?下面做我需要的,但是很乱:

if (IsChanged == true)
{
    return;
}

// Executed when the close (x) button is pressed,
// as the Status string is not yet set to a real value...
else if (Status == "" && IsChanged == false) 
{
    CancelClose();
}

// saving logic falls to here...
else if (IsChanged == false && Status == "saving") 
{
    IsChanged = false;
}

谢谢

【问题讨论】:

  • == (true|false) 是魔鬼。我说的是魔鬼!
  • 是的,使用!IsChanged 超过IsChanged == False
  • 使用 string.Empty 而不是 "" 以避免不必要的对象创建
  • 在哪里测试,IsChanged 永远不会是假的,所以这是不必要的测试!

标签: c# .net boolean-logic


【解决方案1】:

我不熟悉c#,但是it supports the conditional operator

condition ? first_expression : second_expression;

由于我不熟悉c#,所以我不会尝试重写你的代码,但无论如何,三元运算符在某些地方可以带来令人愉悦的简洁。

【讨论】:

    【解决方案2】:
    if(IsChanged)
      return;
    
    if(Status == "saving")
    {
        // save      
    }
    else if(string.IsNullOrEmpty(Status))
    {
        CancelClose();    
    }
    

    【讨论】:

    • 当然。如果isChanged 为真,它会返回时,检查它是否为假是没有意义的。
    • 在 else 情况下不检查 Status == ""
    • 如果有更多的状态选项可用,这将失败
    • 想了很多,并编辑了答案以符合原始实现。
    【解决方案3】:
    if (IsChanged) 
       return;
    
    if (String.IsNullOrEmpty(Status)) // better use this unless you would like a
       CancelClose();                 // nullPointerException
    
    else if (Status.equals("Saving"))
       // whatever you want for save
    

    【讨论】:

      【解决方案4】:
      if (IsChanged) return;
      
      if (Status == "saving")
      {
        //IsChanged = false;
      }
      else if (Status = "")
      {
        CancelClose();
      }
      

      我会避免以大写开头的变量名。

      【讨论】:

      • 你可以从大的 else 块中取出所有东西。
      • 也许IsChanged 和“状态”是一个属性?
      • 这些是属性名称,属性名称通常以大写字母开头。替代方案类似于私有 _isChanged。
      【解决方案5】:
      if (isChanged) return;
      
      switch (Status) {
         case "": 
             CancelClose(); 
             break;
         case "saving": 
             // IsChanged = false;
             break;
      }
      

      这是最简洁的。请注意,因为如果 isChanged 为 true 则返回,因此您可以进一步假设 isChanged 为 false。

      【讨论】:

      • 我认为这是最有效的解决方案,固定两边。
      • “if (isChanged == true)”可以改写为“if (isChanged)”。
      • 可以保存== true部分
      • 我没想到!我只是复制了他的 ischanged == true :(
      【解决方案6】:

      这有点干净:

      if (IsChanged)
      {
      
      }
      else if (Status == "saving")
      {
      
      }
      else if (Status == "")
      {
      
      }
      else
      {
      
      }
      

      我建议您使用enum 来表示状态。这将允许您的代码被强类型化。

      public enum Status
      {
          Closing,
          Saving,
          Changed,
      }
      

      然后你可以使用一个很好的switch 语句来决定采取什么行动。

      switch (_status)
      {
          case Status.Saving:
              break;
          case Status.Closing:
              break;
          case Status.Changed:
              break;
          default:
              break;
      }
      

      【讨论】:

      • 在 else 情况下不检查 Status == ""
      【解决方案7】:
          if(!IsChanged) {
              if (Status == "saving") // saving logic falls to here...
              {
                  //     IsChanged = false;
              } 
              else if (Status == "") // Executed when the close (x) button is pressed, as the Status string is not yet set to a real value...
              {
                  CancelClose();
              }
          } else {
              return;
          }
      

      【讨论】:

        【解决方案8】:
        • 将第一个 else if 剪切为 just if。如果 IsChanged 为真,则永远不会到达“else”。
        • 从您的其他 if 中删除 IsChanged==false,因为它们始终为真。
        • 考虑使用枚举而不是字符串来代表您的状态。

        我会推荐:

        if (IsChanged)
        {
              return;
        }
        
        if (CurrentStatus == Status.None) 
        {
             CancelClose();
             return;
        }
        
        if (CurrentStatus == Status.Saving) 
        {
          //     IsChanged = false;
        }
        

        【讨论】:

          【解决方案9】:

          由于如果 IsChanged==true 则返回,因此在其他 if 中不需要它。

              if (IsChanged == true)
                  return;
          
              switch (Status)
              { 
                 case "":
                  CancelClose();
                  break;
                 case "saving":
                  break;
              }
          

          【讨论】:

          • 对于少量字符串,我倾向于避免使用switch 语句。
          • 我认为switch语句在这种情况下的优势在于。您可以很容易地看到流程将如何取决于状态(并且没有其他变量),并且可以很容易地想象根据状态的新值添加更多案例。
          【解决方案10】:

          可以简化为

              if (IsChanged)
              {
                  return;
              }
          
              else if (Status == "") // Executed when the close (x) button is pressed, as the Status string is not yet set to a real value...
              {
                  CancelClose();
              }
          
              else if (Status == "saving") // saving logic falls to here...
              {
                  //     IsChanged = false;
              }
          

          您不需要在第一次检查中使用 == True,因为它已经是 true 或 false。您不需要在其他选项中检查是否为假,因为如果不是真的,它一定是假的。

          【讨论】:

            【解决方案11】:

            是的:

               if (IsChanged) return;
               if (String.IsNullOrEmpty(Status)) CancelClose();
            

            【讨论】:

            • 那不完整。您错过了实际保存逻辑的位置 - 如果调用 CancelClose,您不想陷入其中。
            • 我上面的内容与所提供的示例等效,因为无论如何在最后一个块中都没有发生任何事情。 (除非 status 属性除了返回一个字符串值之外还有一些副作用,这将是非常非常糟糕的......)
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2022-01-07
            • 1970-01-01
            • 2014-11-04
            • 1970-01-01
            • 1970-01-01
            • 2017-07-12
            • 2016-03-24
            相关资源
            最近更新 更多