当前位置: 首页 > 教程 > VB.Net >

VB.Net子程序(Sub)

精华
小牛编辑
148浏览
2023-03-14

在前面的章节中提到:子程序是不返回任何值的程序。到目前为止,在前面所有的例子中一直使用子过程Main。 在这些教程中,我们一直在编写控制台应用程序。当这些应用程序启动时,控制权转移到Main Sub过程,然后运行构成程序主体的任何其他语句。

定义子程序

Sub语句用于声明子过程的名称,参数和过程主体。 Sub语句的语法是:

[Modifiers] Sub SubName [(ParameterList)] 
    [Statements]
End Sub

其中,

  • Modifiers:指定过程的访问级别; 可能的值有:Public, Private, Protected, Friend, Protected Friend以及有关重载,覆盖,共享和投影的信息。
  • SubName : 表示Sub的名称
  • ParameterList : 指定参数的列表

示例

下面的示例演示了一个Sub过程:CalculatePay,它带有两个参数:hourswages ,并计算显示一个员工的总工资。

Module mysub
   Sub CalculatePay(ByRef hours As Double, ByRef wage As Decimal)
      'local variable declaration'
      Dim pay As Double
      pay = hours * wage
      Console.WriteLine("Total Pay: {0:C}", pay)
   End Sub
   Sub Main()
      'calling the CalculatePay Sub Procedure'
      CalculatePay(25, 100)
      CalculatePay(40, 200)
      CalculatePay(30, 275)
      Console.ReadLine()
   End Sub
End Module

当上面的代码被编译并执行时,会产生以下结果:

F:\worksp\vb.net\sub>vbc mysub.vb
Microsoft (R) Visual Basic Compiler version 14.0.1038
for Visual Basic 2012
Copyright (c) Microsoft Corporation.  All rights reserved.
......
F:\worksp\vb.net\sub>mysub.exe
Total Pay: ¥2,500.00
Total Pay: ¥8,000.00
Total Pay: ¥8,250.00

按值传递参数

这是将参数传递给方法的默认机制。在这种机制中,当一个方法被调用时,会为每个值参数创建一个新的存储位置。实际参数的值被复制到其中。 所以,对方法中的参数所做的更改对参数没有影响。

在VB.Net中,使用ByVal关键字声明引用参数。 以下示例演示了这个概念:

Module paramByval
   Sub swap(ByVal x As Integer, ByVal y As Integer)
      Dim temp As Integer
      temp = x ' save the value of x '
      x = y    ' put y into x '
      y = temp 'put temp into y '
   End Sub
   Sub Main()
      ' local variable definition '
      Dim a As Integer = 100
      Dim b As Integer = 200
      Console.WriteLine("Before swap, value of a : {0}", a)
      Console.WriteLine("Before swap, value of b : {0}", b)
      ' calling a function to swap the values '
      swap(a, b)
      Console.WriteLine("After swap, value of a : {0}", a)
      Console.WriteLine("After swap, value of b : {0}", b)
      Console.ReadLine()
   End Sub
End Module

执行上面示例代码,得到以下结果 -

F:\worksp\vb.net\sub>vbc paramByval.vb
Microsoft (R) Visual Basic Compiler version 14.0.1038
for Visual Basic 2012
Copyright (c) Microsoft Corporation.  All rights reserved.
......
F:\worksp\vb.net\sub>paramByval.exe
Before swap, value of a : 100
Before swap, value of b : 200
After swap, value of a : 100
After swap, value of b : 200

它表明,虽然在函数内部进行了更改,但参数的值没有变化。

按引用传递参数

引用参数是对变量的内存位置的引用。当通过引用传递参数时,与值参数不同,不会为这些参数创建新的存储位置。引用参数表示与提供给方法的实际参数相同的存储位置。

在VB.Net中,使用ByRef关键字声明引用参数。 以下示例演示了这一点:

Module paramByref
   Sub swap(ByRef x As Integer, ByRef y As Integer)
      Dim temp As Integer
      temp = x ' save the value of x '
      x = y    ' put y into x '
      y = temp 'put temp into y' 
   End Sub
   Sub Main()
      ' local variable definition '
      Dim a As Integer = 100
      Dim b As Integer = 200
      Console.WriteLine("Before swap, value of a : {0}", a)
      Console.WriteLine("Before swap, value of b : {0}", b)
      ' calling a function to swap the values '
      swap(a, b)
      Console.WriteLine("After swap, value of a : {0}", a)
      Console.WriteLine("After swap, value of b : {0}", b)
      Console.ReadLine()
   End Sub
End Module

执行上面示例代码,得到以下结果 -

F:\worksp\vb.net\sub>vbc paramByref.vb
Microsoft (R) Visual Basic Compiler version 14.0.1038
for Visual Basic 2012
Copyright (c) Microsoft Corporation.  All rights reserved.
......
F:\worksp\vb.net\sub>paramByref.exe
Before swap, value of a : 100
Before swap, value of b : 200
After swap, value of a : 200
After swap, value of b : 100