如果我有这样的东西怎么办:
if (data == null || (data != null && (data.Count() != 3 || data.IsNotCorrect()))
{
//error...
}
数据== null然后是|| (data!= null)部分有些丑陋。那是如何在c#中解决这个问题的?
编辑:
抱歉!已将data.IsCorrect()
更改为data.IsNotCorrect()
答案 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原则进行编码,那么你就不应该让这个类进入一个不一致的状态。这就像我在下面的博客文章中描述的那样完成。
答案 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()))