如果使用||,我该怎么写呢? ,&&短?

时间:2012-09-18 14:13:34

标签: c# .net

如果我有这样的东西怎么办:

if (data == null || (data != null && (data.Count() != 3 || data.IsNotCorrect()))
{
  //error...
}

数据== null然后是|| (data!= null)部分有些丑陋。那是如何在c#中解决这个问题的?

编辑: 抱歉!已将data.IsCorrect()更改为data.IsNotCorrect()

5 个答案:

答案 0 :(得分:8)

好。 data.Count() != 3 || data.IsCorrect()。你所说的是,如果计数为3,数据是不正确的。那么为什么额外的if条件而不是在内部进行检查?

if (data == null || data.IsCorrect())
{
  //error...
}

<强>更新

似乎对将验证逻辑移到课堂内的意思感到困惑。所有类都应负责确定适当的OOP中的有效状态。它被称为封装。

自从引入OR / Ms,mappers等以来,让调用者而不是类本身决定什么是正确的这一想法已经越来越多了。但事实是那些不验证自己的类信息没有真正正确设计的OOP类。它们只是像DTO这样的容器。

这样做的危险在于,每个调用代码块都负责确保DTO包含正确有效的信息。这意味着您的代码中有n个地方可以引入错误,而不仅仅是1

这就是为什么我建议您将所有验证逻辑移到IsCorrect内或您想要调用它的任何内容。但是如果你 真的 想要根据基本的OOP原则进行编码,那么你就不应该让这个类进入一个不一致的状态。这就像我在下面的博客文章中描述的那样完成。

http://blog.gauffin.org/2012/06/protect-your-data/

答案 1 :(得分:7)

您可以暂停(data != null && ... )(即离开...部分)。

如果||之前的参数求值为true(即data为空),则||之后的参数不会被评估 - 所以您不必担心关于null引用异常。这称为短路

答案 2 :(得分:5)

您可以删除第二次data != null检查,因为延迟评估,然后您不再需要parens,因为您只剩下||个运算符:

if (data == null || data.Count() != 3 || data.IsCorrect())

当然上面有点怀疑(我原本希望看到!data.IsCorrect())。

答案 3 :(得分:3)

||的右侧仅在左侧不为真时才会被评估(||是短路的)

  

条件OR运算符(||)执行其bool操作数的逻辑或。如果第一个操作数的计算结果为true,则不计算第二个操作数。如果第一个操作数的计算结果为false,则第二个操作符将确定整个OR表达式的计算结果为true或false。

引自|| Operator (C# Reference)(MSDN)

将其应用于您的表达式:

data == null || (data != null && (data.Count() != 3 || data.IsCorrect())

这意味着到达data != null时,data保证与null不同,因此保证data != null为真,您可以将其排除在外

因此你的表达式相当于:

data == null || data.Count() != 3 || data.IsCorrect()

答案 4 :(得分:1)

摆脱data != null部分。既然你已经通过了语句的第一部分,那么你知道那时数据不是null,所以不需要检查它。

if (data == null || (data.Count() != 3 || data.IsCorrect()))