0

这个问题适用于所有具有短路 AND 运算符的编程语言,而不仅仅是 C#。

问题很简单 - 使用短路评估来避免超出范围的索引异常,例如:

if ((x > 0) && (bar[x] == foo))

或者

if (((x > 0) && (x < bar.Length)) && (bar[x] == foo))

糟糕的编码风格?我知道我可以像这样嵌套循环:

if (x > 0)
{
    if (bar[x] == foo)
    {
    }
}

但我发现它非常难以阅读。

4

4 回答 4

6

我会这样说

if ((x > 0) && (bar[x] == foo))

不错的编码风格。它可能甚至还不错。我肯定更if喜欢你描述的嵌套结构。

顺便说一句,我会减少您使用的括号数量。这两个都同样正确,至少在 C# 和大多数其他 C 派生语言中:

if (x > 0 && bar[x] == foo)
if (x > 0 && x < bar.Length && bar[x] == foo)

了解该语言的读者(您必须在某种程度上假设这一点)将很容易理解上述短路表达式。那些读者可能会反对嵌套if样式,因为它占用的空间比获得正确行为所需的空间多得多。

于 2012-07-18T01:21:05.337 回答
1

“糟糕的编码风格”(至少在这种情况下)是你定义的。两者都是完全有效的,这只是一个品味问题。它还取决于您在实际if()语句中的操作数。如果有很多比较像

if ((foo == bar) && (foobar == something) && ((a==b) || (c==d)))

将其包装在以下方法中可能会有所帮助:

if (AllMyConditionsAreMet(OnSomeObject))

为了更容易阅读/理解正在发生的事情。

于 2012-07-18T01:19:51.567 回答
1

我认为通过将其移入自己的方法可以使其更清洁:

bool IsXBarValid(int x, Bar bar)
{
    return (x > 0) && (bar[x] == foo);
}

// .. then ..
if (IsXBarValid(x, bar))
{
    // etc..
}

显然我不确定你是如何实现它的,所以方法名称有点奇怪,但通常这是清理这类代码的好方法。

于 2012-07-18T01:22:32.887 回答
0

到目前为止,我最喜欢 simon-whitehead 的回答。

如果我不想要另一种方法,我会这样做:

  bool foobar = (x > 0) && (bar[x] == foo);
  if (foobar)
     // etc...

我发现这些样式比原始帖子中的任何建议都更具可读性。

它可以帮助其他正在阅读代码的人(搬运工与否)。

他们阅读 foobar,并立即可以决定这是否是他们需要详细检查的代码部分,或者他们是否可以略读。

另一方面,如果他们看到一个复杂的 if 语句,内部可能存在语言技巧:-),那么它会减慢他们的速度。

于 2012-07-18T01:42:57.470 回答