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)
{ … }