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

我已经看过几次以下的东西……而且我讨厌它。 这基本上是“欺骗”语言吗? 或者..你会认为这是’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例外…在代码的不同位置生成的exception时遇到此问题。所以当我看到上面的代码时,除了其他所有内容之外,我的挫败感从那里开始。)

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

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

这没有什么不对,因为你只是想确定你不会得到一个nullpointerexception。

我认为这样做是合理的。

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

这段代码完全有效,但我喜欢使用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. } 

这没什么不对。

如果(条件从左到右进行评估,那么像这样堆叠它们就完全没问题了。

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

在我看来,这是对逻辑短路的完全合理使用 – 如果有的话,它会欺骗这种语言。 我最近刚刚从VB6出来,它没有发生任何短路现象,这让非常恼火。

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

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

对我而言,当你在同一个语句中进行乘法和加法时不使用括号时,它是相同的,因为语言记录了乘法运算首先执行的操作。

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

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

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

这是有道理的,因为默认情况下C#会使条件短路,所以我认为使用它对您有利。 在VB中,如果开发人员使用AND而不是ANDALSO,可能会出现一些问题。

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

 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 } 

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

如果你编译成程序集的c代码,不仅短路正确的行为,它更快 。 在机器语言中,if语句的各个部分一个接一个地被评估。 不短路是慢的。

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

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

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

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

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

一切顺利,西尔万。

有点偏离主题,但如果你像这样在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