我不喜欢这个...这是欺骗语言吗?

时间:2009-05-07 20:47:37

标签: c# syntax short-circuiting

我已经看过几次以下的东西......我讨厌它。这基本上是“欺骗”的语言吗?或者..你会认为这是'ok',因为IsNullOrEmpty会一直被评估吗?

(我们可以争论一个字符串在函数出现时是否应该为NULL,但这不是问题。)

string someString;
someString = MagicFunction();

if (!string.IsNullOrEmpty(someString) && someString.Length > 3)
{
    // normal string, do whatever
}
else
{
   // On a NULL string, it drops to here, because first evaluation of IsNullOrEmpty fails
   // However, the Length function, if used by itself, would throw an exception.
}

修改 再次感谢大家提醒我这种语言的基础。虽然我知道“为什么”它起作用,但我无法相信我不知道/记住这个概念的名称。

(如果有人想要任何背景..我在解决由NULL字符串和.Length> x例外...在代码的不同位置生成的异常时遇到此问题。所以当我看到上面的代码时,另外对于其他一切,我的挫败感从那里开始。)

15 个答案:

答案 0 :(得分:106)

您正在利用称为短路的语言功能。这并不是欺骗语言,而是实际上使用的功能完全是如何设计使用的。

答案 1 :(得分:24)

如果你问是否可以依赖“短路”关系运算符&&||,那么是的,这完全没问题。

答案 2 :(得分:6)

这没有任何问题,因为你只是想确定你不会得到一个nullpointer异常。

我认为这样做是合理的。

使用扩展程序,您可以使其更清晰,但基本概念仍然有效。

答案 3 :(得分:5)

此代码完全有效,但我喜欢使用Null Coalesce Operator来避免空类型检查。

string someString = MagicFunction() ?? string.Empty;
if (someString.Length > 3)
{
    // normal string, do whatever
}
else
{
   // NULL strings will be converted to Length = 0 and will end up here.
}

答案 4 :(得分:4)

这没什么不对。

if(从左到右评估条件,所以将它们堆叠起来就好了。

答案 5 :(得分:2)

这是有效的代码,在我看来(尽管声明一个变量并在下一行分配它是非常烦人的),但你应该意识到你也可以在条件的长度上输入else-block字符串是< 3。

答案 6 :(得分:2)

这是完全有效的,以这种方式使用它没有任何问题。如果您遵循语言的记录行为,那么一切都很好。在C#中,您使用的语法是条件逻辑运算符,并且可以在MSDN上找到他们的文档化bahviour

对我来说,这与在同一语句中进行乘法和加法时不使用括号的情况相同,因为语言记录了乘法运算首先执行的操作。

答案 7 :(得分:2)

在我看来,这完全合理地使用逻辑短路 - 如果有的话,它会用语言欺骗。我最近刚刚来自VB6,它没有曾经短路,而且真的很烦恼

需要注意的一个问题是你可能需要在那个else子句中再次测试Null,因为 - 正如所写的那样 - 你在那里用Null字符串和长度少于三个字符串进行清理

答案 8 :(得分:1)

在大多数情况下,依靠短路是“正确的事”。它导致代码更少,移动部件更少。这通常意味着更容易维护。在C和C ++中尤其如此。

我会认真考虑雇用一个不熟悉(并且不知道如何使用)短路操作的人。

答案 9 :(得分:0)

我觉得没问题:)你只是确保你没有访问NULL变量。 实际上,我总是在对变量进行任何操作之前进行这样的检查(同样,在索引集合等时) - 它更安全,最好的做法,就是这样......

答案 10 :(得分:0)

这是有道理的,因为默认情况下C#会使条件短路,因此我觉得将它用于您的优势是件好事。在VB中,如果开发人员使用AND而不是ANDALSO,可能会出现一些问题。

答案 11 :(得分:0)

我认为这与以下内容没有什么不同:

INT* pNumber = GetAddressOfNumber();

if ((pNUmber != NULL) && (*pNumber > 0))
{
  // valid number, do whatever
}
else
{
  // On a null pointer, it drops to here, because (pNumber != NULL) fails
  // However, (*pNumber > 0), if used by itself, would throw and exception when dereferencing NULL
}

它正在利用该语言中的一项功能。我认为,这种习惯用法已经普遍使用,因为C开始以这种方式执行布尔表达式(或者先用它做任何语言)。)

答案 12 :(得分:0)

如果是你编译成汇编的c中的代码,不仅短路正确的行为,而且更快。在机器语言中,if语句的各个部分将一个接一个地进行评估。不短路的速度较慢。

答案 13 :(得分:0)

编写代码会给公司带来很多美元。但保持它的成本更高!

所以,我对你的观点很满意:很可能这个代码不会被那个必须阅读并在2年内纠正的人所理解。

当然,他会被要求纠正一个关键的生产错误。他会在这里和那里搜索,可能不会注意到这一点。

我们应该总是为下一个人编码,他可能不那么聪明。对我而言,这是唯一要记住的事情。

这意味着我们使用明显的语言功能并避免其他功能。

一切顺利,西尔万。

答案 14 :(得分:0)

有点偏离主题,但是如果你在vb.net中使用这样的

dim someString as string
someString = MagicFunction()
if not string.IsNullOrEmpty(someString) and someString.Length > 3 then
    ' normal string, do whatever
else
    ' do someting else
end if

这会在null(无)字符串上爆炸,但在VB.Net中,您按如下方式对其进行编码,并在C#中执行相同操作

dim someString as string
someString = MagicFunction()
if not string.IsNullOrEmpty(someString) andalso someString.Length > 3 then
    ' normal string, do whatever
else
    ' do someting else
end if

添加andalso使其行为方式相同,也读得更好。作为同时进行vb和c'开发的人,第二个vb显示登录略有不同,因此更容易向某人解释存在差异等。

Drux