代码之家  ›  专栏  ›  技术社区  ›  mpeterson

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

  •  13
  • mpeterson  · 技术社区  · 15 年前

    (我们可以争论字符串从函数中产生时是否应该为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.
    }
    

    编辑:

    (以防有人需要任何背景。我是在代码的不同位置对空字符串和.Length>x异常生成的异常进行故障排除时发现这一点的。因此,当我看到上面的代码以及其他所有内容时,我的挫败感就从这里开始了。)

    15 回复  |  直到 15 年前
        1
  •  106
  •   JaredPar    15 年前

    您正在利用一种称为短路的语言功能。这并不是在欺骗语言,而是在实际中使用了一种功能,而这种功能正是设计用来使用它的。

        2
  •  24
  •   Mike Kucera    15 年前

    如果您询问是否可以依赖“短路”关系运算符 && ||

        3
  •  6
  •   James Black    15 年前

    这并没有什么问题,因为您只想确保不会出现nullpointer异常。

    我认为这样做是合理的。

    通过扩展,您可以使它更干净,但基本概念仍然有效。

        4
  •  5
  •   bendewey    15 年前

    这段代码完全有效,但我喜欢使用Null Coalesce操作符来避免Null类型检查。

    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.
    }
    
        5
  •  4
  •   Eoin Campbell    15 年前

    这没什么问题。

    如果(条件)是从左到右求值的,那么像这样堆叠它们是非常好的。

        6
  •  2
  •   matt b    15 年前

    在我看来,这是有效的代码(尽管声明变量并在下一行赋值非常烦人),但您应该意识到,在字符串长度为<3.

        7
  •  2
  •   RolandTumble    15 年前

    在我看来,这似乎是逻辑短路的一种完全合理的使用——如果有什么区别的话,那就是作弊 具有 语言。我只是最近才从VB6来的,它没有 曾经 短路,这真让人恼火 .

    需要注意的一个问题是,您可能需要在else子句中再次测试Null,因为——正如所写的那样——您将在那里同时使用Null字符串和长度小于三个字符串。

        8
  •  2
  •   Pervez Choudhury    15 年前

    这是完全正确的,以这种方式使用它没有什么错。如果您遵循语言的记录行为,那么一切都很好。在C#中,您使用的语法是条件逻辑运算符,可以在 MSDN

        9
  •  1
  •   user21714    15 年前

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

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

        10
  •  0
  •   AlaaShaker    15 年前

    我觉得没问题:)您只是确保不访问空变量。

        11
  •  0
  •   Mike Cole    15 年前

        12
  •  0
  •   RobH    15 年前

    我不认为这和这样的事情有什么不同:

    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开始以这种方式执行布尔表达式(或任何最先执行布尔表达式的语言)以来,这种习惯用法就一直被广泛使用

        13
  •  0
  •   si618    15 年前

    如果编译成汇编的是c语言代码,那么短路不仅是正确的行为,而且是错误的 更快 . 在机器语言中,if语句的各个部分都是一个接一个地求值的。不短路是比较慢的。

        14
  •  0
  •   Sylvain Rodrigue    15 年前

    编写代码对一家公司来说花费了很多美元。但维护成本更高!

    当然,他将被要求纠正一个关键的生产缺陷。他会到处搜索,可能不会注意到这一点。

    这意味着我们使用明显的语言特征,避免使用其他特征。

    祝你一切顺利,西尔文。

        15
  •  0
  •   Drux Drux    15 年前

    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
    

    在VB.Net中,bang的作用与在VB.Net中的(bang)的作用相同#

    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
    

    添加ANDALS使其表现出相同的方式,而且它读起来更好。作为一个同时进行vb和c开发的人,第二个vb显示登录名略有不同,因此更容易向他人解释存在差异等。

    德鲁克斯