C# 这个逻辑能被改写成更整洁的东西吗?

C# 这个逻辑能被改写成更整洁的东西吗?,c#,.net,boolean-logic,C#,.net,Boolean Logic,我可以用一种更简单、更容易阅读的方式来写下面的逻辑吗?下面是我需要的,但它非常混乱: 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 == fal

我可以用一种更简单、更容易阅读的方式来写下面的逻辑吗?下面是我需要的,但它非常混乱:

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;
}
谢谢

这有点干净:

if (IsChanged)
{

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

}
else if (Status == "")
{

}
else
{

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

public enum Status
{
    Closing,
    Saving,
    Changed,
}
然后,您可以使用一个漂亮的
开关
语句来决定要采取的操作

switch (_status)
{
    case Status.Saving:
        break;
    case Status.Closing:
        break;
    case Status.Changed:
        break;
    default:
        break;
}
这是最整洁的了。请注意,如果isChanged为true,则返回值,因此可以进一步假定isChanged为false。

是:

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

它可以简化为

    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了。您不需要在其他选项中检查false,因为如果它不为true,则必须为false。

由于您返回if IsChanged==true,因此在其他ifs中不需要它

    if (IsChanged == true)
        return;

    switch (Status)
    { 
       case "":
        CancelClose();
        break;
       case "saving":
        break;
    }
我会避免以大写字母开头变量名。

  • 将第一个else if剪切为just if。如果IsChanged为true,则永远不会到达“else”
  • 从其他ifs中删除IsChanged==false,因为它们总是true
  • 对于您的状态,请考虑枚举而不是字符串
我建议:

if (IsChanged)
{
      return;
}

if (CurrentStatus == Status.None) 
{
     CancelClose();
     return;
}

if (CurrentStatus == Status.Saving) 
{
  //     IsChanged = false;
}
我对c不熟悉,但是


由于我不熟悉c#,我不会尝试重新编写您的代码,但在任何情况下,三元运算符都可以在某些地方带来令人满意的简洁性。

对于少量字符串,我倾向于避免使用
switch
语句。我认为在这种情况下switch语句的优点在于。您可以很容易地看到流程将如何依赖于状态(没有其他变量),并且可以很容易地想象根据状态的新值添加更多案例。这是不完整的。您缺少了实际保存逻辑的一个点——如果调用CancelClose,您不希望落入该逻辑。我上面的内容与提供的示例相同,因为最后一个块中没有发生任何事情。(除非status属性除了返回字符串值之外还有一些副作用,这将是非常糟糕的…)绝对正确。如果
isChanged
为false,则当它返回为true时,不会检查Status==“”在其他情况下,如果有更多的Status选项可用,则此操作将失败考虑更多问题并将答案编辑为与原始实现一致。不检查Status=“”在其他情况下,我认为这是最有效的解决方案,修复双方。“if(isChanged==true)”可以重写为“if(isChanged)”。可以保存
==true
partI没有想到!我刚刚复制了他的ischanged==true:(你可以从大的else块中删除所有内容。也许
ischanged
和'Status'是一个属性?这些是属性名,属性名通常以大写字母开头。另一种方法是类似private的ischanged。
==(true | false)
是魔鬼的。魔鬼的,我说!是的,使用
!IsChanged
超过
IsChanged==False
使用string.Empty not“”,以避免不必要的对象创建在测试的地方,IsChanged永远不能为False,因此这是不必要的测试!
    if (IsChanged == true)
        return;

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

if (Status == "saving")
{
  //IsChanged = false;
}
else if (Status = "")
{
  CancelClose();
}
if (IsChanged)
{
      return;
}

if (CurrentStatus == Status.None) 
{
     CancelClose();
     return;
}

if (CurrentStatus == Status.Saving) 
{
  //     IsChanged = false;
}
    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;
    }
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
condition ? first_expression : second_expression;