为什么不在VB.NET中使用'Return'语句?

时间:2012-05-01 16:59:25

标签: vb.net return

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

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,第二个版本更具可读性) )?

6 个答案:

答案 0 :(得分:5)

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

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

也许作者对VB6更熟悉没有return

可能是风格或政策问题。

无论如何,我会把它写成:

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

答案 1 :(得分:4)

将结果分配给函数名称是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
...

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

另一个误解是,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相同。

答案 2 :(得分:2)

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

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

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

  

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


  

注意:正如其他答案[12]所提到的,您可以将方法缩减为单个代码语句。如果第一部分是假的,那么使用AndAlso还应该通过尽早缩短逻辑表达式来加速评估:

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

答案 3 :(得分:0)

返回并为函数名赋值有一个重要的事情。如果你(因为任何扭曲的原因)想写那样的东西

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而不是它,则执行将停止,函数将返回正确的值。

答案 4 :(得分:0)

如果出于某种原因,它可能需要出现在赋值的右侧,并且您不希望导致递归:

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

答案 5 :(得分:0)

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

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

此外,第一个例子也可用于重新强化之前学到的经验教训 - 例如关于分配变量,使用布尔等。

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