Visual Basic/過程和函式
函式是執行特定任務並返回結果的命名程式程式碼塊。該任務可以像新增兩個數字一樣簡單,也可以像發射宇宙飛船一樣複雜。子程式就像函式,只是它不返回值。
一個函式定義示例
Public Function Sum(ByRef Number1 As Double, ByRef Number2 As Double) As Double
'Return the result by writing it to a variable having the same name as the function
Sum = Number1 + Number2
End Function
一個子程式定義示例
Public Sub Tell(ByVal MyString1 as String, ByVal MyString2 as String)
MsgBox MyString1 & MyString2
End Sub
注意以下幾點
- 函式的引數被宣告為 ByRef,這要求編譯器確保只使用指定型別的引數,在本例中為 Double。
- 函式透過將返回值賦給函式名來返回值,就好像函式是一個變數一樣。這與許多其他語言中使用 return 關鍵字形成對比。
您可以使用或呼叫前面幾節中定義的兩個過程,如下所示
'On the next line, argument order matters
Tell "Hello there.", ""
'On the next line, names of arguments are used and argument order does not matter.
Tell MyString1:="Hello there,", MyString2:=" again."
'Tell ("Hello there.","") -- syntax error
MySum = Sum(123.456, 234)
MySum2 = Sum(Number2:=8, Number1:=6)
'MySum3 = Sum Number2:=8, Number1:=6 -- syntax error
注意以下幾點
- 傳遞給 函式 的引數(引數列表)必須用圓括號括起來,而傳遞給子程式的引數則不需要。
每個函式和子程式都有以下部分,其中一些是可選的
- 可見性
- Public、Friend 或 Private
- 過程型別
- Sub、Function、Property Let、Property Get、Property Set
- 名稱
- 一個自由選擇的名稱,以字母開頭,只包含字母、數字和下劃線。
- 引數列表
- 過程讀入或寫入的資料項列表。
- 返回值型別
- 對於 Function 或 Property Get,返回的資料型別,例如 Double 或 String。
- 主體
- 執行所有工作的語句。
只有 Name 和 Procedure Type 是必須的。當然,沒有主體的過程什麼也不做。
這對大多數人來說似乎是過程宣告中一個非常不重要的部分,但實際上它是一個非常有用的功能。有了它,你可以顯示一些過程只供模組內部使用 (Private),一些只供本元件使用 (Friend) 或供全世界使用 (Public)。你應該將過程標記為 Private,除非它們將從模組外部呼叫。這將鼓勵你,以及任何編輯你的程式的人,將相關的過程放在同一個模組中,這顯然使維護更容易。
將過程標記為 Private 也意味著你可以在另一個模組中擁有另一個具有完全相同名稱的過程。
使用 Exit Function 或 Exit Sub 在中間終止過程,如下所示
Sub LengthyComputation(fat, n)
If n = 0 Or n = 1 Then
fat = 1
' Now terminate
Exit Sub
End If
' Now compute fat ...
End Sub
所有過程要麼是返回結果作為函式值的函式,要麼是因其副作用而被呼叫的子程式。要返回值,你可以使用兩者,但對於子程式,你需要透過引數來完成。
Private Function FunctionHalf(ByRef y as Double) as Double
FunctionHalf = y / 2
End Function
Private Sub SubroutineHalf(ByRef y As Double, ByRef Result As Double)
Result = y / 2
End Sub
這兩個過程本質上執行相同的操作,即把一個數字除以二。Function 版本透過將新值 賦值 給函式名來實現,而 Sub 版本則將其賦值給其中一個 引數 的名稱。這會影響你使用它們的方式。
函式版本可以在表示式中使用,如下所示
Debug.Print FunctionHalf(10) 'Prints 5
要使用子程式返回值,你需要將該值儲存在一個變數中,如下所示
Dim nHalf as Double
SubroutineHalf 10, nHalf
Debug.Print nHalf
一般來說,當結果是單個事物(數字、字串、物件)時,你使用 Function,當你需要返回多個不同事物或根本不需要返回任何事物時,你使用 Sub。
屬性 也是一種過程形式。Property Get 是一個函式;Property Let 和 Property Set 是子程式。有關 Properties 的更多討論,請參閱 面向物件程式設計 章節。
您可以指定可選引數和預設值
Function MySum(i1, i2, Optional i3)
If IsMissing(i3) Then
MySum = i1 + i2
Else
MySum = i1 + i2 + i3
End If
End Function
Function MyConcatenate(String1, String2, Optional Separator = " ")
'Default value for Separator specified
MyConcatenate = String1 & Separator & String2
End Function
Sub Test()
Debug.Print MySum(1, 2) * MySum(1, 2, 3)
Debug.Print MyConcatenate("Hello", "World")
Debug.Print MyConcatenate("Hello", "World", ", ")
End Sub
一旦一個引數被宣告為可選的,它右側的所有引數都必須被宣告為可選的。
連結
- 使用可選引數,Office 2000,msdn.microsoft.com
| 前一頁: 資料型別 | 目錄 | 下一頁: Windows_對話方塊 |