否定整个if语句以检查空值是否合适?

时间:2015-05-19 21:00:17

标签: c#

我有点像初学程序员。我在这里要做的是检查是否有时间,是否被选中,以及该时间是否等于另一个。如果这是真的,那么我想跳过它下面的代码块。这是代码示例:

if (currentGVR.Round_Start_Time)
{
     if (tr.StartLunchDateTime != null && currentGVR.Round_Start_Lunch && roundedStart == roundedStartL)
           // skip
     else
     {
           key = tr.TransactionID;
           TransactionRecords[key]["Start_DateTime"] = roundedStart;
     }
}

我考虑过使用OR运算符,但是如果没有时间进行比较,我可以看到错误发生的位置。使用AND运算符可以避免这种困境。

所以整体问题是,是否正确编码否定所有条件以获得正确的结果,例如if(!(cond' s)),并且,在C#中实际比较它之前,这是检查是否有值要比较的最佳方法吗?某些记录中的时间可以为空(或不存在)。有什么建议吗?

3 个答案:

答案 0 :(得分:6)

我否定所有这些条件并将&&切换为||,以便在代码将(或不会)执行的条件下更快地显现。

另外(根据我的经验),您通常看不到包含if下所有代码的空else块。

if (tr.StartLunchDateTime == null || !currentGVR.Round_Start_Lunch || roundedStart != roundedStartL)
{
    key = tr.TransactionID;
    TransactionRecords[key]["Start_DateTime"] = roundedStart;
}

答案 1 :(得分:3)

声明

 if (tr.StartLunchDateTime != null && currentGVR.Round_Start_Lunch && roundedStart == roundedStartL){
       // skip
 }
 else
 {
       key = tr.TransactionID;
       TransactionRecords[key]["Start_DateTime"] = roundedStart;
 }

相当于

 if (!(tr.StartLunchDateTime != null && currentGVR.Round_Start_Lunch && roundedStart == roundedStartL))
 {
       key = tr.TransactionID;
       TransactionRecords[key]["Start_DateTime"] = roundedStart;
 }
 else {
       // skip
 }

这可以进一步简化,因为

!(tr.StartLunchDateTime != null && 
  currentGVR.Round_Start_Lunch &&
  roundedStart == roundedStartL)

相同
(!(tr.StartLunchDateTime != null) ||
  !(currentGVR.Round_Start_Lunch) ||
  !(roundedStart == roundedStartL))

(tr.StartLunchDateTime == null ||
 !currentGVR.Round_Start_Lunch ||
 roundedStart != roundedStartL)

请参阅DeMorgan's Laws

答案 2 :(得分:0)

if (someLongCondition)
{ }
else
{
    doStuff();
}

相当于:

if (!someLongCondition)
{
    doStuff();
}

所以是的,你可以否定你的整个情况:

if (!(tr.StartLunchDateTime != null && currentGVR.Round_Start_Lunch && roundedStart == roundedStartL))
{ … }

但你也可以在(应用De Morgan's laws)中取消否定并将其写成:

if (tr.StartLunchDateTime == null || !currentGVR.Round_Start_Lunch || roundedStart != roundedStartL)
{ … }

所有这些都是等价的,所以选择任何使条件更清晰的东西(实际上,考虑将它存储在一个单独的变量中,你给出一个描述性名称)。