是否正在使用短路评估来避免指数超出范围异常的坏习惯?

Dan*_*iel 0 c# coding-style

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

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

if ((x > 0) && (bar[x] == foo))
Run Code Online (Sandbox Code Playgroud)

要么

if (((x > 0) && (x < bar.Length)) && (bar[x] == foo))
Run Code Online (Sandbox Code Playgroud)

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

if (x > 0)
{
    if (bar[x] == foo)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

但我发现这是非常难以理解的.

Gre*_*ill 6

我会这样说

if ((x > 0) && (bar[x] == foo))
Run Code Online (Sandbox Code Playgroud)

编码风格也不错.它甚至可能都很好.我肯定更喜欢它if像你描述的嵌套结构.

顺便说一句,我会减少你使用的括号数量.这些都是同样正确的,至少在C#和大多数其他C语言中是这样的:

if (x > 0 && bar[x] == foo)
if (x > 0 && x < bar.Length && bar[x] == foo)
Run Code Online (Sandbox Code Playgroud)

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

  • @Daniel"`说有更大的问题仍然没有消除问题`"有****(IMO)没问题.您假设的问题(移植到具有不同评估逻辑的语言)几乎不存在,如果它存在于某种罕见的情况下,那么该语言很可能会有更多的"不兼容性",因此您也必须满足这些需求. .它在哪里结束?恕我直言,这与"过早优化*是万恶之源"完全一致.*严格地说,除了可读性之外,我们不是在谈论优化. (2认同)
  • @Daniel然后为什么要问这个问题呢?你回答了自己的问题:永远不要使用"短路评估",因为你有一天*可能*的某些其他语言必须移植到*可能*不兼容.我错过了什么? (2认同)