VB.Net - Sub 子程序

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

定义 Sub 子过程

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

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

其中,

  • Modifiers − 指定过程的访问级别; 可能的值为 - Public、Private、Protected、Friend、Protected Friend 以及有关重载、覆盖、共享和隐藏的信息。

  • SubName − 表示子名称

  • ParameterList − 指定参数列表

示例

以下示例演示了一个子过程 CalculatePay,它采用两个参数 hourswages 并显示员工的总工资 −

Module mysub
   Sub CalculatePay(ByRef hours As Double, ByRef wage As Decimal)
      '局部变量声明
      Dim pay As Double
      pay = hours * wage
      Console.WriteLine("Total Pay: {0:C}", pay)
   End Sub
   Sub Main()
      '调用CalculatePay子过程
      CalculatePay(25, 10)
      CalculatePay(40, 20)
      CalculatePay(30, 27.5)
      Console.ReadLine()
   End Sub
End Module

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

Total Pay: $250.00
Total Pay: $800.00
Total Pay: $825.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()
      ' 局部变量定义 
      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)
      ' 调用函数来交换值 '
      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

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

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()
      ' 局部变量定义 
      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)
      ' 调用函数来交换值 '
      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

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

Before swap, value of a : 100
Before swap, value of b : 200
After swap, value of a : 200
After swap, value of b : 100