VB.Net子程式(Sub)


在前面的章節中提到:子程式是不返回任何值的程式。到目前為止,在前面所有的例子中一直使用子過程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