如果我有这样的东西怎么办:
if (data == null || (data != null && (data.Count() != 3 || data.IsNotCorrect()))
{
//error...
}
数据 == null 然后 || (data != null) 部分有点难看。那是如何在c#中解决这个问题?
编辑:对不起!改为data.IsCorrect()
_data.IsNotCorrect()
好。data.Count() != 3 || data.IsCorrect()
. 您的意思是,如果计数为 3,则数据不正确。那么为什么要使用额外的 if 条件而不是在内部进行检查呢?
if (data == null || data.IsCorrect())
{
//error...
}
更新
似乎对我将验证逻辑移到类内部的意思感到困惑。所有类都应负责确定在正确的 OOP 中什么是有效状态。这叫做封装。
自从引入 OR/Ms、映射器等以来,让调用者而不是类本身来确定什么是正确或不正确的整个想法越来越多。但事实是,不验证自己信息的类不是真正正确设计的 OOP 类。它们只是像 DTO 这样的容器。
这样做的危险在于,每个调用代码块都负责确保 DTO 包含正确和有效的信息。这意味着n
在您的代码中有一些地方可以引入错误,而不仅仅是1
.
这就是为什么我建议您将所有验证逻辑移到内部IsCorrect
或任何您喜欢的名称。但是,如果你真的想根据基本的 OOP 原则进行编码,你不应该让类永远处于不一致的状态。正如我在下面的博客文章中所描述的那样。
你可以离开(data != null && ... )
(即离开...
部分)。
如果参数 before||
计算为true
(即为data
null),||
则不会计算 after 参数 - 因此您不必担心 null 引用异常。这称为短路。
由于延迟评估,您可以删除第二个data != null
检查,然后您不再需要括号,因为您只剩下||
运算符:
if (data == null || data.Count() != 3 || data.IsCorrect())
当然,以上内容有点可疑(我本来希望看到的!data.IsCorrect()
)。
||
仅当左侧不正确时才评估右侧(短路||
)
条件或运算符 (
||
) 对其布尔操作数执行逻辑或。如果第一个操作数的计算结果为真,则不计算第二个操作数。如果第一个操作数的计算结果为 false,则第二个运算符确定整个 OR 表达式的计算结果为 true 还是 false。
引自||
运算符(C# 参考)(MSDN)
将其应用于您的表达式:
data == null || (data != null && (data.Count() != 3 || data.IsCorrect())
这意味着何时data != null
到达,data
保证与 不同null
,因此data != null
保证为真,您可以将其省略。
因此,您的表达式等效于:
data == null || data.Count() != 3 || data.IsCorrect()
只是摆脱data != null
部分。由于您已经通过了语句的第一部分,因此您知道那个时候数据不为空,因此无需检查它。
if (data == null || (data.Count() != 3 || data.IsCorrect()))