语法:VB.NET 子程序中的“Exit Sub”或“Return”

Posted

技术标签:

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

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

也就是说,

Private Sub exitNow()
    Exit Sub
End Sub

Private Sub exitNow()
    Return
End Sub

【问题讨论】:

【参考方案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】:

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

【讨论】:

我认为这两种方法在递归中都非常有用。 这不是问题的答案。

以上是关于语法:VB.NET 子程序中的“Exit Sub”或“Return”的主要内容,如果未能解决你的问题,请参考以下文章

更新语句中的 VB.NET 语法错误

vb.net中如何用事件和委托,会C#中的事件和委托,但不知VB.net中的语法,望给个简单的例子熟悉语法。

在 sql 语法中出现错误,vb.net 中的 mysql update 语句

使用 VB.NET 应用程序手动创建 MySQL 触发器(语法错误)

错误处理程序 - Exit Sub 与 End Sub

“INSERT INTO 中的语法错误”ms-access vb.net [重复]