【问题标题】:Syntax: "Exit Sub" or "Return" in VB.NET subroutines语法:VB.NET 子程序中的“Exit Sub”或“Return”
【发布时间】:2010-11-03 12:42:39
【问题描述】:

“退出子程序”或“返回”似乎都完成了同样的事情——退出子程序。它们在幕后的工作方式有什么不同吗?

也就是说,

Private Sub exitNow()
    Exit Sub
End Sub

Private Sub exitNow()
    Return
End Sub

【问题讨论】:

    标签: vb.net syntax return subroutine


    【解决方案1】:

    来自文档:

    在 Sub 或 Set 过程中,Return 语句等同于 Exit Sub 或 Exit Property 语句,不得提供表达式。

    所以在这种情况下它们是相同的。

    Return (<value>) 用于函数和 property.get 中。显然在这种情况下略有不同)。

    【讨论】:

      【解决方案2】:

      比起Exit Sub,我更喜欢Return。因为有时您会从Sub 更改为Function。在这种情况下,Exit Sub 可以转换为Exit Function,但这假设函数名称之前有一个分配(类似于 VB 6),这很可能没有发生。 Return 会捕捉到这种情况 - 如果方法应该返回一个值,没有参数的 Return 将在编译时失败。

      【讨论】:

      • 很好的洞察力。谢谢迈克!
      【解决方案3】:

      如果您检查 2 条语句的 IL 输出,它们是相同的。但是,由于 'return' 是为了将某些东西推回给调用者,所以严格来说,'Exit Sub' 更适合在 Sub 中使用。

      【讨论】:

      • 其实return有两层意思。对于函数,这意味着将某些内容返回给调用者,而在函数和 subs 中,这意味着将执行返回到调用位置。在大多数带有“return”关键字的语言中都是这种情况。 “Exit Sub”仅用于向后兼容 pre-.NET VB。
      • 我不同意“'Exit Sub'更适合在Sub中使用。Exit Sub没有错,但是它特定于视觉基础; return 用于退出受C 启发的所有语言的子程序:C#javaC++Objective-C
      • @ToolmakerSteve 我同意“'Exit Sub' 更适合在 Sub 中使用,因为我们使用的是 VB.Net 语言,而且这种语言比其他语言更加用户友好,所以 Exist sub 是最好的选择return 因为您可以检查其他关键字,例如 IF END IF 等。希望您理解我的意思。
      【解决方案4】:

      在这种情况下它们是相同的。

      但是,从代码可读性的角度来看,“Exit Sub”会更清晰,因为“Return”表示某些值正在用作输出(子例程不是这种情况)。

      【讨论】:

      • 这应该是评论,而不是答案。
      • 我不同意 "'"Exit Sub" 会更清楚.." Exit Sub 没有任何问题,但是它是特定于 Visual Basic 的; return 用于退出受C 启发的所有语言的子程序:C#javaC++Objective-C。投了反对票,因为这与两年前的 chikani's answer 说的一样,所以没有增加讨论。
      【解决方案5】:
      • 首先,Procedures 带有 sub,我们应该知道我们正在处理不返回特定值的特定程序,具有传递某些特定参数甚至不传递任何参数的能力。如:
      • 打印一些东西()。
      • 计算整数CalcFact(X)的阶乘。
      • 为特定任务执行一些流程。

      • 函数是一个特定的过程,通过传递一些特定的参数来实现特定的任务,它必须返回一些可以用来完成整个任务的值,例如验证用户名和用户通过。

      总之 Sub 不返回值,我们直接调用它 "Print HelloWorld()" ,而函数这样做:

      • ValidUsersNameAndPass("Johne","jOhNe13042019") ' 这可以返回一个布尔值。
      • ValidUsersNameAndPass("Johne","jOhNe13042019"); // 这可能会返回一个布尔值。

      【讨论】:

        【解决方案6】:

        我想确认它们在 lambda 表达式中的行为也是一样的,它们确实如此:

        Sub test()
        
            Dim a As Action = Sub() Exit Sub
            Dim b As Action = Sub() Return
        
            a()
            b()
        
            MsgBox("Yes they do!") 
         End Sub
        

        【讨论】:

        • 这是什么?这似乎是个笑话
        • @CengizAraz 因为这看起来不像可以编译的真实代码? msdn.microsoft.com/en-us/library/bb531253.aspx
        • @Patrick 在 VS 2015 中推断的类型是匿名委托,但我不确定与 Action 是否有任何区别。
        • 这段代码没有增加讨论。你认为它表明了什么?
        【解决方案7】:

        虽然有像保护子句这样的例外,但在大多数情况下,我会考虑方法太长的迹象。

        【讨论】:

        • 我认为这两种方法在递归中都非常有用。
        • 这不是问题的答案。
        猜你喜欢
        • 2010-11-25
        • 2010-10-02
        • 2014-05-01
        • 1970-01-01
        • 2011-04-13
        • 2021-12-03
        • 2010-09-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多