Function 陳述式 (Visual Basic)
宣告用於定義 Function 程序的名稱、參數和程式碼。
[ <attributelist> ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ] [ Async | Iterator ]
Function name [ (Of typeparamlist) ] [ (parameterlist) ] [ As returntype ] [ Implements implementslist | Handles eventlist ]
[ statements ]
[ Exit Function ]
[ statements ]
End Function
組件
詞彙 |
定義 |
||||||
attributelist |
選擇項。 請參閱屬性清單。 |
||||||
accessmodifier |
選擇項。 可以是下列其中一項: 請參閱 Visual Basic 中的存取層級。 |
||||||
proceduremodifiers |
選擇項。 可以是下列其中一項:
|
||||||
Shared |
選擇項。 請參閱 Shared。 |
||||||
Shadows |
選擇項。 請參閱 Shadows。 |
||||||
Async |
選擇項。 如需 非同步。 |
||||||
Iterator |
選擇項。 請參閱 Iterator。 |
||||||
name |
必要項。 程序名稱。 請參閱 宣告項目名稱 (Visual Basic)。 |
||||||
typeparamlist |
選擇項。 泛型程序的型別參數清單。 請參閱型別清單。 |
||||||
parameterlist |
選擇項。 表示這個程序之參數的區域變數名稱清單。 請參閱 參數清單 (Visual Basic)。 |
||||||
returntype |
如果 Option Strict 為 On,則為必要項。 這個程序所傳回值的資料型別。 |
||||||
Implements |
選擇項。 指出這個程序實作一個或多個 Function 程序,而每一個程序都是定義在這個程序內含之類別或結構所實作的介面中。 請參閱 Implements 陳述式。 |
||||||
implementslist |
如果提供 Implements,則為必要項。 實作的 Function 程序清單。 implementedprocedure [ , implementedprocedure ... ] 每個 implementedprocedure 都具有下列語法和組成部分: interface.definedname
|
||||||
Handles |
選擇項。 指出此程序可以處理一個或多個特定的事件。 請參閱 Handles 子句 (Visual Basic)。 |
||||||
eventlist |
如果提供 Handles,則為必要項。 此程序處理的事件清單。 eventspecifier [ , eventspecifier ... ] 每個 eventspecifier 都具有下列語法和組成部分: eventvariable.event
|
||||||
statements |
選擇項。 要在這個程序內執行的陳述式區塊。 |
||||||
End Function |
結束這個程序的定義。 |
備註
所有可執行程式碼必須位在程序內。 每個程序在類別、結構或稱為包含的類別、結構或模組的模組內,然後,宣告。
若要將值傳回給呼叫程式碼中,使用 Function 程序;如果不是,請使用 Sub 程序。
定義函式
您可以只定義 Function 程序在模組層級使用。 因此,函式的宣告內容必須是類別、結構、模組或介面,且不能是原始程式檔、命名空間 (Namespace)、程序或區塊。 如需詳細資訊,請參閱宣告內容和預設存取層級 (Visual Basic)。
Function 程序預設為公用存取。 您可以使用存取修飾詞調整存取層級。
Function 程序可以宣告值的資料型別該程序。 您可以指定任何資料型別或列舉型別、結構、類別或介面的名稱。 如果您不指定 returntype 參數,則程序會傳回 Object。
如果這 Implements 程序使用關鍵字,則內含之類別或結構也必須緊接在它的 Class 或 Structure 陳述式的 Implements 陳述式。 Implements 陳述式必須在 implementslist指定的每個介面。 然而,介面會定義 Function 名稱 (在 definedname) 不需要符合程序名稱 (在 name)。
注意事項 |
---|
您可以使用 Lambda 運算式定義內嵌函式運算式。如需詳細資訊,請參閱函式運算式 (Visual Basic)與Lambda 運算式 (Visual Basic)。 |
從傳回的函式
當 Function 程序回到呼叫程式碼時,程式碼會繼續執行陳述式之後呼叫程序的陳述式。
:若要從函式傳回值,可以將值指派給函式名稱,或將值包含在 Return 陳述式中。
如下列範例所示, Return 陳述式會同時指派傳回值並結束函式。
Function myFunction(ByVal j As Integer) As Double
Return 3.87 * j
End Function
下列範例會將傳回值指派給函式名稱 myFunction,然後使用 Exit Function 陳述式傳回:
Function myFunction(ByVal j As Integer) As Double
myFunction = 3.87 * j
Exit Function
End Function
Exit Function 和 Return 陳述式會造成立即退出 Function 程序。 任意數目的 Exit Function 和 Return 陳述式可以出現在程序中的任何地方,並且 Exit Function 和 Return 陳述式可以混合使用。
如果您使用 Exit Function ,而不需要將值指派給 name,則程序會傳回在 returntype指定資料型別的預設值。 如果 returntype 未指定,則程序會傳回 Nothing,是 Object的預設值。
呼叫函式
在運算式中,可以使用程序名稱 (後接括在括號中的引數清單) 來呼叫 Function 程序。 只有當您沒有提供任何引數,您可以省略括號。 然而,如果您一律使用括號括起來,則程式碼會較容易閱讀。
您 Function 程序的相同方式您呼叫任何程式庫函式 (例如 Sqrt、 Cos或 ChrW。
使用 Call 關鍵字,您也可以呼叫函式。 在這種情況下,會忽略傳回值。 在大部分情況下不建議對 Call 關鍵字的用途。 如需詳細資訊,請參閱Call 陳述式 (Visual Basic)。
:Visual Basic 有時會重新排列算術運算式以提高內部效能。 因此,您在算術運算式不應該使用 Function 程序,當函式變更變數的值在同一個運算式。
非同步函式
非同步 功能可讓您非同步叫用函式,而不使用明確回呼或手動分割您的跨多個函式或 Lambda 運算式的程式碼。
如果您將標記為已與 非同步 修飾詞的函式,您可以使用函式在 等候 運算子。 當控制 Async 到達函式時的一個 Await 表示,控制項傳回至呼叫端,因此,在函式的進度暫止,直到等候的工作完成。 當工作完成時,會在函式可復原。
注意事項 |
---|
Async 程序傳回給呼叫端時,可能會遇到不完整先等候的物件時也有 Async 程序的結尾,視何者先發生。 |
Async 函式可能有 Task 或 Task的傳回型別。 有 Task 的傳回型別下面提供 Async 函式的範例。
Async 函式不能宣告任何 ByRef 參數。
Sub 陳述式 (Visual Basic) 也可以標記為 Async 修飾詞。 這個事件處理常式的主要使用,值無法回復。 AsyncSub 程序無法等候,因此, AsyncSub 程序的呼叫端無法攔截程序 Sub 擲回的例外狀況。
如需 Async 函式的詳細資訊,請參閱 使用 Async 和 Await 設計非同步程式 (C# 和 Visual Basic)、 非同步程式中的控制流程 (C# 和 Visual Basic)和 非同步方法的傳回類型 (C# and Visual Basic)。
Iterator 函式
Iterator 函式對集合的自訂反覆運算,例如清單或陣列。 Iterator 函式使用 yield 陳述式傳回每個項目一次一個。 當 yield 陳述式到達,目前位置在程式碼中的事項。 Iterator,下次呼叫函式,執行與該位置重新開始。
若要使用 For Each…Next 陳述式,您會從用戶端程式碼的 Iterator。
Iterator 函式的傳回型別可以是 IEnumerable、 IEnumerable、 IEnumerator或 IEnumerator。
如需詳細資訊,請參閱Iterator (C# 和 Visual Basic)。
範例
下列範例會使用 Function 陳述式,以宣告形成 Function 程序主體的名稱、參數和程式碼。 ParamArray 修飾詞可以讓函式接受 (Accept) 引數的變數數字。
Public Function calcSum(ByVal ParamArray args() As Double) As Double
calcSum = 0
If args.Length <= 0 Then Exit Function
For i As Integer = 0 To UBound(args, 1)
calcSum += args(i)
Next i
End Function
下列範例會叫用 (Invoke) 先前範例中所宣告的函式。
Module Module1
Sub Main()
' In the following function call, calcSum's local variables
' are assigned the following values: args(0) = 4, args(1) = 3,
' and so on. The displayed sum is 10.
Dim returnedValue As Double = calcSum(4, 3, 2, 1)
Console.WriteLine("Sum: " & returnedValue)
' Parameter args accepts zero or more arguments. The sum
' displayed by the following statements is 0.
returnedValue = calcSum()
Console.WriteLine("Sum: " & returnedValue)
End Sub
Public Function calcSum(ByVal ParamArray args() As Double) As Double
calcSum = 0
If args.Length <= 0 Then Exit Function
For i As Integer = 0 To UBound(args, 1)
calcSum += args(i)
Next i
End Function
End Module
在有 Task之傳回型別的下列範例中, DelayAsync 是 AsyncFunction 。 DelayAsync 有傳回整數的 Return 陳述式。 因此 DelayAsync 需要函式宣告具有 Task(Of Integer)的傳回型別。 因為傳回型別是 Task(Of Integer), Await 運算式的評估產生 DoSomethingAsync 的整數。 這在此陳述式所示: Dim result As Integer = Await delayTask。
startButton_Click 程序是 Async Sub 程序的範例。 由於 DoSomethingAsync 是 Async 函式,必須等候呼叫的效能資料,對 DoSomethingAsync ,如下列陳述式所示: Await DoSomethingAsync()。 因為它有一個 Await 表示,必須定義 startButton_ClickSub 程序與 Async 修飾詞。
' Imports System.Diagnostics
' Imports System.Threading.Tasks
' This Click event is marked with the Async modifier.
Private Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.Click
Await DoSomethingAsync()
End Sub
Private Async Function DoSomethingAsync() As Task
Dim delayTask As Task(Of Integer) = DelayAsync()
Dim result As Integer = Await delayTask
' The previous two statements may be combined into
' the following statement.
' Dim result As Integer = Await DelayAsync()
Debug.WriteLine("Result: " & result)
End Function
Private Async Function DelayAsync() As Task(Of Integer)
Await Task.Delay(100)
Return 5
End Function
' Output:
' Result: 5