【问题标题】:Why not to use a 'Return' statement in VB.NET?为什么不在 VB.NET 中使用“Return”语句?
【发布时间】:2012-05-01 16:59:24
【问题描述】:

我已经得到了一些代码来查找问题和可以改进和改变的东西(这是一个家庭作业,但这个问题与任务本身无关),部分代码是:

Function CheckIfSameCell(ByVal FirstCellPosition As CellReference, ByVal SecondCellPosition As CellReference) As Boolean
    Dim InSameCell As Boolean
    InSameCell = False
    If FirstCellPosition.NoOfCellsSouth = SecondCellPosition.NoOfCellsSouth And FirstCellPosition.NoOfCellsEast = SecondCellPosition.NoOfCellsEast Then
        InSameCell = True
    End If
    CheckIfSameCell = InSameCell
End Function

我不明白为什么要创建 InSameCell 是变量,而它只能分配给函数名称 CheckIfSameCell

或者只使用如下的 return 语句?

Function CheckIfSameCell(ByVal FirstCellPosition As CellReference, ByVal SecondCellPosition As CellReference) As Boolean
    If FirstCellPosition.NoOfCellsSouth = SecondCellPosition.NoOfCellsSouth And FirstCellPosition.NoOfCellsEast = SecondCellPosition.NoOfCellsEast Then
        Return True
    End If
    Return False
End Function

我可以理解不直接返回If语句中的表达式,以增加可读性。

我知道为函数名称分配返回值不会退出函数,而 Return 会退出,但它只是一个人的风格,还是第一个版本有什么优势(IMO,第二个更具可读性)?

【问题讨论】:

  • 我认为这只是个人选择而不是规则,而且一些程序员遵循他们从书本或网上阅读的模式。我也更喜欢第二个代码(我以这种风格编写代码),它易于阅读并使用更少的变量。
  • 您的建议是更好的正确方法,使用return 而不是使用函数名。之前的函数可能是用 VB6 编写的,然后转换为 .Net,因为 VB6 是这样编码的
  • 当切换到结构化编程时,一个规则是each function should have a single exit point。引用链接页面,“现在结构化编程早已赢得了胜利,没有人特别关心这一点了”
  • 对于仍然发现这个古董的人来说,“混乱”的唯一正当原因是有人习惯了 VB6(或从它升级的代码),不需要InSameCell ,不需要If,应该只返回值,And 也应该替换为AndAlso,并删除ByVal

标签: vb.net return


【解决方案1】:

也许曾经有更多的检查,InSameCell 的值可能会更改多次,然后才会返回。然后使用return 会改变行为。

也许作者想避免繁琐的重命名。你知道,当你想重命名一个函数,并且你在它自己的函数体内多次使用这个函数的名字时,你有很多地方可以替换,而当你引入一个变量时,你只有一个地方可以改变名字。 (我知道 IDE 会正确地为您做到这一点;但在 VB6 中并非如此,而且习惯很难改掉。)

也许作者更熟悉没有return的VB6。

也许这是风格或政策的问题。

无论如何,我会写成:

Function CheckIfSameCell(ByVal FirstCellPosition As CellReference, ByVal SecondCellPosition As CellReference) As Boolean
    Return FirstCellPosition.NoOfCellsSouth = SecondCellPosition.NoOfCellsSouth AndAlso FirstCellPosition.NoOfCellsEast = SecondCellPosition.NoOfCellsEast
End Function

【讨论】:

    【解决方案2】:

    将结果分配给函数名是 VB6 中使用的旧样式,不应再在 VB.NET 中使用。使用Return value

    我个人不喜欢这种风格的陈述

    If condition Then
        Return True
    Else
        Return False
    End If
    

    他们只是愚蠢,因为condition 已经产生了返回值!更好:

    Return condition
    

    这也是GSerg选择的解决方案。


    没人会写

    If x + y = 0 Then
        Return 0
    ElseIf x + y = 1 Then
        Return 1
    ElseIf x + y = 2 Then
        Return 2
    ElseIf x + y = 3 Then
        Return 3
    ...
    

    但是当表达式是布尔类型时,有些人会经常这样做。我认为他们没有意识到条件等同于算术表达式。它们只是布尔算术而不是数字算术。

    另一个误解是 If 语句需要像If x > 0 Then 这样的比较。如果他们有一个布尔变量b,他们会写If b = True Then。但是所有的 If 语句需要的是一个由布尔表达式给出的布尔值。这个表达式可以像查询一个变量一样简单:If b Then

    为什么会这样?因为如果bTrue,那么b = True 产生True,如果bFalse,那么b = True 产生False。所以,b = True 很像x * 1。当然,这与x 相同。

    【讨论】:

      【解决方案3】:

      我同意第二种方法更具可读性。这也恰好是我对返回方法的偏好。 我真的想不出与后者相比有什么缺点,但可以考虑到前者。如果方法变得更长并且有人忘记设置布尔标志会发生什么?一个微妙的错误将诞生。此外,还需要编写更多代码。在后一种方法中,如果缺少返回,代码将无法编译,而且代码也会更短。

      需要返回类型的局部变量的唯一情况是当例程需要在第一次确定返回值后做一些其他工作时。在您发布的示例中,情况并非如此。

      Code Complete, 2nd Edition 同意第 391 页:

      使用一个返回当它增强可读性时在某些例程中,一次 你知道答案,你想把它返回给调用例程 立即地。如果例程的定义方式不 一旦检测到错误,需要进一步清理,不返回 立即意味着您必须编写更多代码。


      注意:正如其他答案 [1,2] 所提到的,您可以将方法简化为单个代码语句。如果第一部分为假,也使用AndAlso 应该有助于通过尽早短路逻辑表达式来加速评估:

      Return FirstCellPosition.NoOfCellsSouth = SecondCellPosition.NoOfCellsSouth 
          AndAlso FirstCellPosition.NoOfCellsEast = SecondCellPosition.NoOfCellsEast
      

      【讨论】:

        【解决方案4】:

        函数名的返回和赋值有一件重要的事情。如果你(出于任何扭曲的原因)想写这样的东西

        Public Function TestFunct() as Boolean
          Dim testVar as Boolean = True
          If testVar then
           TestFunct = True
          Else
           TestFunct = False
          EndIf
          'do more stuff here 
          ...
          TestFunct = False
        End Function
        

        它总是返回 false。如果您使用 return 代替它,则执行将停止并且函数将返回正确的值。

        【讨论】:

          【解决方案5】:

          如果由于某种原因它需要出现在赋值的右侧,并且您不想引起递归,则可以使用变量:

          Dim Function F() As Boolean
              F = True
              If a = b Then 
                  F = Not F()
              End If
          End Function
          

          【讨论】:

            【解决方案6】:

            简而言之 - 是的,您的最后一个示例非常有效。

            但是,家庭作业中使用的大多数示例要么用于展示其他教学示例。作业表中的代码仅显示了以传统方式使用函数的基础知识,您的第二个示例显示了下一个学习步骤,并且是实现所需结果的最紧凑方式。

            另外,第一个例子也可以用来强化之前的经验教训——例如。关于分配变量,布尔值的使用等。

            提高编码技能的最佳方法之一是反复练习所学内容。

            【讨论】:

              猜你喜欢
              • 2021-01-28
              • 2018-06-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-05-26
              • 2017-05-22
              • 1970-01-01
              相关资源
              最近更新 更多