C# 如果使用| |,&&;更短的

C# 如果使用| |,&&;更短的,c#,.net,C#,.net,如果我有这样的东西怎么办: if (data == null || (data != null && (data.Count() != 3 || data.IsNotCorrect())) { //error... } data==null,然后是| |(data!=null)部分不知何故很难看。这就是用c#解决这个问题的方法吗 编辑: 很抱歉将数据.IsCorrect()更改为数据.IsNotCorrect()您可以只保留(数据!=null&&…(即保留…部分) 如果|

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

if (data == null || (data != null && (data.Count() != 3 || data.IsNotCorrect()))
{
  //error...
}
data==null,然后是| |(data!=null)部分不知何故很难看。这就是用c#解决这个问题的方法吗

编辑:
很抱歉将
数据.IsCorrect()
更改为
数据.IsNotCorrect()

您可以只保留
(数据!=null&&…
(即保留
部分)


如果
| |
之前的参数计算结果为
true
(即
数据
为null),则
|
之后的参数不计算-因此您不必担心null引用异常。这称为短路。

您可以只保留
(数据!=null&&…
(即保留
部分)


如果
| |
之前的参数计算结果为
true
(即
数据
为null),则
|
之后的参数不计算-因此您不必担心null引用异常。这称为短路。

您可以删除第二个
数据!=null
由于延迟计算而检查,然后您不再需要paren,因为只剩下
|
运算符:

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

当然,上面的内容有点可疑(我希望看到
!data.IsCorrect()
)。

您可以删除第二个
数据!=null
由于延迟计算而检查,然后您不再需要paren,因为只剩下
|
运算符:

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

当然,上面的内容有点可疑(我本来希望看到
!data.IsCorrect()
)。

只要去掉
数据就行了!=空
部分。因为您已经传递了语句的第一部分,所以在那个时候您知道数据不是空的,所以不需要检查它

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

只需除去
数据!=空
部分。因为您已经传递了语句的第一部分,所以在那个时候您知道数据不是空的,所以不需要检查它

if (data == null || (data.Count() != 3 || data.IsCorrect()))
嗯<代码>数据。计数()!=3 | | data.IsCorrect()。您的意思是,如果计数为3,则数据不正确。那么,为什么要使用额外的if条件,而不是在内部执行该检查呢

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

似乎对我将验证逻辑移到类内部的意思感到困惑。所有类都应该负责确定在适当的OOP中什么是有效状态或什么不是有效状态。这叫做封装

自从or/Ms、映射器等的引入以来,让调用者而不是类本身来决定什么是正确的或不正确的想法越来越多地出现了。但事实是,没有验证自己信息的类并不是真正正确设计的OOP类。它们只是像DTO一样的容器

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

因此,我建议您将所有验证逻辑移到
IsCorrect
或任何您喜欢的名称中。但是如果你真的想按照OOP的基本原则来编码,你就不应该让类处于不一致的状态。正如我在下面的博客文章中所描述的那样

很好<代码>数据。计数()!=3 | | data.IsCorrect()。您的意思是,如果计数为3,则数据不正确。那么,为什么要使用额外的if条件,而不是在内部执行该检查呢

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

似乎对我将验证逻辑移到类内部的意思感到困惑。所有类都应该负责确定在适当的OOP中什么是有效状态或什么不是有效状态。这叫做封装

自从or/Ms、映射器等的引入以来,让调用者而不是类本身来决定什么是正确的或不正确的想法越来越多地出现了。但事实是,没有验证自己信息的类并不是真正正确设计的OOP类。它们只是像DTO一样的容器

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

因此,我建议您将所有验证逻辑移到
IsCorrect
或任何您喜欢的名称中。但是如果你真的想按照OOP的基本原则来编码,你就不应该让类处于不一致的状态。正如我在下面的博客文章中所描述的那样


只有在左侧不正确时才会计算
|
的右侧(
|
短路)

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

引用自(MSDN)

将其应用于表达式:

data == null || (data != null && (data.Count() != 3 || data.IsCorrect())
这意味着当
数据!=如果达到空值
数据
保证与
空值
不同,因此
数据!=null
保证为true,您可以将其忽略

因此,您的表达式相当于:

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

只有当左侧不正确时,
|
的右侧才会被计算(
|
短路)

条件OR运算符(
|
)对其布尔操作数执行逻辑OR。如果第一个操作数的计算结果为true,则不计算第二个操作数。如果第一个操作数的计算结果为false,则第二个运算符将