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

mpe*_*son 13 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.
}
Run Code Online (Sandbox Code Playgroud)

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

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

Jar*_*Par 106

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

  • @Sylvain,同意聪明的代码更难维护.但是这段代码并没有试图变得聪明.它正在使用一种众所周知的语言功能.这也不仅仅是一个C#功能,它几乎是任何语言的特色(C++,F#,VB.Net,C#,C等......).期望其他程序员理解该代码的预期功能是完全合理的 (9认同)
  • +1 - 这是C,C++,C#,Perl,Python,Ruby,PHP中非常标准的做法...... (5认同)
  • +1 - 完全正确.我认为这是一个非常标准的做法 (4认同)
  • @Sylvain:如果你不了解你的专业工具的基础知识(以及一个短路布尔运算符_is_基础),那么你不应该接触生产代码.</ petpeeve> (3认同)

Mik*_*era 24

如果你问,如果它的确定依赖于"短路"关系运算符&&和||,然后是多数民众赞成完全罚款.

  • 它不仅很好,而且我认为大多数人会认为它是一种语言功能 (12认同)

Jam*_*ack 6

这没有什么不对,因为你只是想确定你不会得到一个nullpointer异常.

我认为这样做是合理的.

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


ben*_*wey 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.
}
Run Code Online (Sandbox Code Playgroud)

  • 但是,这会改变变量的值,这并不总是令人满意的. (5认同)