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

时间:2009-06-17 01:20:52

标签: vb.net syntax return subroutine

“Exit Sub”或“Return”似乎都完成同样的事情 - 退出子程序。他们的工作方式有何不同?

即,

Private Sub exitNow()
    Exit Sub
End Sub

Private Sub exitNow()
    Return
End Sub

7 个答案:

答案 0 :(得分:63)

来自doc:

  

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

所以在这种情况下他们是一样的。

答案 1 :(得分:14)

我倾向于private bool ConvertFile(string infile, string outfile) { Guid g = Guid.NewGuid(); XmlTextWriter writer0 = new XmlTextWriter(outfile, Encoding.UTF8); writer0.Formatting = Formatting.Indented; writer0.WriteStartElement("MemoQResource"); writer0.WriteAttributeString("ResourceType", "NonTrans"); writer0.WriteAttributeString("Version", "1.0"); writer0.WriteStartElement("Resource"); writer0.WriteElementString("Guid", Convert.ToString(g)); writer0.WriteElementString("FileName", filename); writer0.WriteElementString("Name", name); writer0.WriteElementString("Description", description); writer0.WriteEndElement(); writer0.WriteEndElement(); writer0.Close(); XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.IndentChars = "\t"; XmlWriter writer = XmlWriter.Create(outfile, settings); writer.WriteStartDocument(); writer.WriteStartElement("nonTrans"); writer.WriteAttributeString("Version", "1.0"); string[] words = txtBox_source.Text.Split(new string[] { Environment.NewLine }, StringSplitOptions.None); foreach (string word in words) { writer.WriteElementString("nonTransRule", word); } writer.WriteEndElement(); writer.Close(); return false; } 而不是Return。因为您偶尔会从Exit Sub更改为Sub。在这种情况下,Function可以转换为Exit Sub,但这假设先前对函数名称赋值(类似于VB 6),这很可能没有发生。 Exit Function会遇到这种情况 - 如果方法应该返回一个值,Return没有参数将在编译时失败。

答案 2 :(得分:6)

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

答案 3 :(得分:4)

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

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

答案 4 :(得分:1)

  • 首先,过程带有子项,我们应该知道我们正在处理不返回特定值且具有传递某些特定参数甚至不传递任何参数的能力的特定过程。如:
  • 打印出一些东西()。
  • 计算整数CalcFact(X)的阶乘。
  • 为特定任务执行一些过程。

  • 功能是经过编程以通过还传递一些特定参数来实现特定任务的特定过程,并且它必须返回一些可用于完成整体任务的值,例如验证用户名和用户通过。

简而言之,Sub不返回值,我们直接将其称为"Print HelloWorld()",而函数则例如:

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

答案 5 :(得分:-1)

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

答案 6 :(得分:-1)

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

Sub test()

    Dim a As Action = Sub() Exit Sub
    Dim b As Action = Sub() Return

    a()
    b()

    MsgBox("Yes they do!") 
 End Sub