Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多个if块或带有AND条件的单个if_C#_Coding Style - Fatal编程技术网

C# 多个if块或带有AND条件的单个if

C# 多个if块或带有AND条件的单个if,c#,coding-style,C#,Coding Style,如果我需要检查多个条件,哪种方法是性能方面的首选方法 if( CND1 && CND2 && CND3 && CND4) { } else { } 或 性能是相同的,因为一旦发现错误的参数(短路),它将停止检查参数,所以一定要使用第一个参数。这是一行,而不是10行。这也意味着你的else将更容易处理。它们在性能方面将是相同的,但第一种形式在我看来更容易阅读 我将条件拆分的唯一情况是,如果存在一组逻辑条件: if (x && y)

如果我需要检查多个条件,哪种方法是性能方面的首选方法

if( CND1 && CND2 && CND3 && CND4)
{
}
else
{
}


性能是相同的,因为一旦发现错误的参数(短路),它将停止检查参数,所以一定要使用第一个参数。这是一行,而不是10行。这也意味着你的
else
将更容易处理。

它们在性能方面将是相同的,但第一种形式在我看来更容易阅读

我将条件拆分的唯一情况是,如果存在一组逻辑条件:

if (x && y) // x and y are related
{
   if (a && b) // a and b are related
   {
   }
}
尽管有一个读起来不错的替代方案(但无可否认,它评估了更多的条件)是:


因为他们是一样的<代码>&短路,因此如果
CND1
为false,则不会对其余部分进行评估

C#使用,因此性能方面,两者应该相同

在没有短路评估的语言中,后者可能会更有效,但与所有优化一样,您应该进行基准测试,以查看是否有性能提升,并决定是否值得让代码变得更复杂、更不易维护

此外,像这样的“优化”也可能不是真正的优化。如果条件很便宜,并且额外的复杂性增加了代码的大小,使得它现在(例如)不再适合缓存,那么它实际上可能执行得不太好

从编码风格的角度来看,这实际上应该由您对
的其他
的操作决定。如果你想做一件事情,如果所有的事情都是真的,而另一件事情是假的,那么选择前者。如果您希望能够根据哪些条件为false来执行不同的操作,请使用后者

这其实不是风格的问题,而是你想要实现什么。当然,如果你想做同样的事情,如果有错误,你应该使用第一种形式,这样你就不会在每一个else块中重复同样的代码。如果有疑问,给定两种实现相同需求的方法,选择最简单、最清晰、最可维护的选项总是一个好主意

哦,以防万一你不知道,如果你想急切地在C中计算条件,你可以使用
&
而不是
&
|
。因此,如果希望运行所有条件(可能是为了副作用),可以执行以下操作:

if (CND1 & CND2 & CND3 & CND4) { // Eagerly evaluate all conditions.
    ...
}
else {
    ...
}

这里要记住的一件事是,这看起来与短路版本非常相似,所以它非常值得评论,尤其是如果C或C++用户可能在看代码。 此外,我发现以下惰性构造非常有用:

ok = ok && CND;
但严格的等价物看起来太相似了:

ok = ok & CND;
因此,我确保将这样的代码重新分解为:

ok &= CND;

这使得行为上的差异更加明显。

if循环?我认为if是一个条件,而不是一个循环;)你在比较两种不同的情况。在第二个示例中,您会将
else
放在哪里?@Ram:如果您在此处指定语言(或至少是族),这将非常有用-请参阅对nickf答案的注释。@Prutswonder-很抱歉造成混淆。我对表演很好奇,所以忽略了其他部分。我现在已经添加了它。谢谢你的评论。@Johannes:在一种没有短路的语言中,这两种语言并不等同于一开始-在任何情况下,评估(比如)CND2的任何副作用都会在第一个版本中观察到,但在第二个版本中不会。“我很乐意假设这里短路。@Johannes,这个问题最初不是被标记为c#then吗?@Jon Skeet,看看我的答案,为什么这两种语言在性能上可能存在差异。尽管不完全像@nickf所想的那样*8')@Mark:正如我所说,我假设这是一种有短路的语言,否则它们就不等同于一开始。@Mark:不,它当时只有“编码风格”作为标记。+1我喜欢你提到的第二种方法。我要说的是,在性能优势几乎可以忽略不计的情况下,总是选择可读性最好的。
ok = ok & CND;
ok &= CND;