2010-08-24 20 views
2

我可以用更简单,更易于阅读的方式编写以下逻辑吗?下面做什么,我需要的,但它是非常混乱:这个if-else-else逻辑可以被重写成更整洁的东西吗?

if (IsChanged == true) 
{ 
    return; 
} 

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

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

感谢

+12

'==(true | false)'是魔鬼。我说,魔鬼! – delnan 2010-08-24 16:31:08

+0

是的,用'!IsChanged'与'IsChanged == False'一起去# – Skilldrick 2010-08-24 16:34:31

+1

使用字符串。空不是“”,以避免不必要的对象创建 – 2010-08-24 16:37:18

回答

12

这是一个有点清洁:

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; 
} 
+0

如果使用枚举,则不检查其他情况下的状态==“” – recursive 2010-08-24 16:29:50

+2

+1。 – Charles 2010-08-24 18:02:41

20
if (isChanged) return; 

switch (Status) { 
    case "": 
     CancelClose(); 
     break; 
    case "saving": 
     // IsChanged = false; 
     break; 
} 

这大约是整齐的,因为它得到。请注意,因为如果isChanged为true,您可以进一步始终假定isChanged为false。

+0

我认为这是解决双方最有效的解决方案。 – Jookia 2010-08-24 16:30:50

+0

“if(isChanged == true)”可以重写为“if(isChanged)”。 – TrueWill 2010-08-24 16:34:04

+0

可以保存'== true'部分 – 2010-08-24 16:34:07

1

是:

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

这是不完整的。你错过了一个实际的保存逻辑 - 你不想陷入如果CancelClose被调用。 – 2010-08-24 16:29:30

+0

我上面的东西等同于示例,因为无论如何都不会发生在最后一个块中(除非状态属性除了返回字符串值之外还有一些副作用,这会非常糟糕......) – 2010-08-24 19:40:13

4
if(IsChanged) 
    return; 

if(Status == "saving") 
{ 
    // save  
} 
else if(string.IsNullOrEmpty(Status)) 
{ 
    CancelClose();  
} 
+0

绝对没有关系,检查'isChanged'是否为false时它会返回如果它是真的 – Skilldrick 2010-08-24 16:29:47

+0

在其他情况下不检查状态==“” – recursive 2010-08-24 16:30:16

+2

如果有更多的状态选项可用,这将失败 – 2010-08-24 16:32:47

0

它可以以

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在第一次检查,因为它已经是真还是假来simplifed。你不需要在其他选择中检查错误,因为如果它不是真的,它肯定是错误的。

2

既然你返回,如果IsChanged == true,你不需要它在其他ifs。

if (IsChanged == true) 
     return; 

    switch (Status) 
    { 
     case "": 
     CancelClose(); 
     break; 
     case "saving": 
     break; 
    } 
+1

我倾向于避免少数字符串的'switch'语句 – ChaosPandion 2010-08-24 16:29:22

+0

我认为优势在这种情况下switch语句的s就是这样。您可以很容易地看到流程将如何取决于状态(并且没有其他变量),并且可以轻松想象根据状态的新值添加更多情况。 – HaskellElephant 2010-08-24 16:41:01

0
if (IsChanged) return; 

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

我会避免用大写字母开头的变量名。

+0

您可以将其他大块中的所有内容全部取出。 – recursive 2010-08-24 16:31:06

+0

也许'IsChanged'和'状态'是属性? – 2010-08-24 16:33:07

+0

这些是属性名称,属性名称通常以大写字母开头。另一种方法就像私人的_isChanged。 – Thorsten79 2010-08-24 16:34:16

1
  • 切第一个else if if just if。如果IsChanged为真,那么“其他”将永远达不到。
  • 从其他ifs中删除IsChanged == false,因为它们始终为真。
  • 想想你的状态的枚举而不是字符串。

我建议:

if (IsChanged) 
{ 
     return; 
} 

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

if (CurrentStatus == Status.Saving) 
{ 
    //  IsChanged = false; 
} 
1
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; 
    } 
0
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 
0

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

condition ? first_expression : second_expression; 

由于我不熟悉C#,我不会尝试重新编写代码,但无论如何,三元运算符可以导致在某些地方令人愉快的简洁秒。

相关问题