C# 对整个if语句求反以检查空值是否合适?

C# 对整个if语句求反以检查空值是否合适?,c#,C#,我是一个初学者程序员。我在这里要做的是检查是否有时间,是否选择了时间,以及该时间是否与另一个时间相等。如果这都是真的,那么我想跳过它下面的代码块。下面是代码示例: if (currentGVR.Round_Start_Time) { if (tr.StartLunchDateTime != null && currentGVR.Round_Start_Lunch && roundedStart == roundedStartL) /

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

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#中的值之前检查是否有值可比较的最佳方法?在某些记录中,时间可以为空(或不存在)。有什么建议吗?

声明

 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))


请参阅。

我将否定所有这些条件,并将
&
切换到
|
,以便更快速地确定代码将在什么条件下执行(或不执行)

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

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

if (!someLongCondition)
{
    doStuff();
}
所以是的,你可以否定你的整个状况:

if (!(tr.StartLunchDateTime != null && currentGVR.Round_Start_Lunch && roundedStart == roundedStartL))
{ … }
但是你也可以把否定词拉进去(应用),这样写:

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

所有这些都是等价的,所以选择条件更明确的(实际上,考虑把它存储在一个单独的变量中,你可以给出一个描述性的名称)。我陷入了这样的想法:在某个地方,我必须先检查非空值,然后再继续比较,但从逻辑上讲,对空值使用短路检查也会起到同样的作用。谢谢
if (!(tr.StartLunchDateTime != null && currentGVR.Round_Start_Lunch && roundedStart == roundedStartL))
{ … }
if (tr.StartLunchDateTime == null || !currentGVR.Round_Start_Lunch || roundedStart != roundedStartL)
{ … }