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
選擇性。 可以是下列其中一項:
proceduremodifiers
選擇性。 可以是下列其中一項:
MustOverride Overrides
NotOverridable Overrides
Shared
選擇性。 請參閱 Shared。
Shadows
選擇性。 請參閱 Shadows。
Async
選擇性。 請參閱 Async。
Iterator
選擇性。 請參閱迭代器。
name
必要。 程序的名稱。 請參閱 Declared Element Names。
typeparamlist
選擇性。 類型參數的清單,適用於泛型程序。 請參閱類型清單。
parameterlist
選擇性。 表示此程序參數的區域變數名稱清單。 請參閱參數清單。
returntype
如果
Option Strict
為On
,則為必要項。 此程序所傳回值的資料類型。Implements
選擇性。 表示此程序會實作一或多個
Function
程序,每個程序都會在此程序包含類別或結構所實作的介面中定義。 請參閱 Implements 陳述式。implementslist
如果使用
Implements
,則為必要項。 實作之Function
程序的清單。implementedprocedure [ , implementedprocedure ... ]
每個
implementedprocedure
都具有下列語法和組件:interface.definedname
部分 描述 interface
必要。 此程序包含類別或結構所實作的介面名稱。 definedname
必要。 名稱,據以在 interface
中定義程序。Handles
選擇性。 表示此程序可以處理一或多個特定事件。 請參閱 Handles。
eventlist
如果使用
Handles
,則為必要項。 此程序處理的事件清單。eventspecifier [ , eventspecifier ... ]
每個
eventspecifier
都具有下列語法和組件:eventvariable.event
部分 描述 eventvariable
必要。 以引發事件之類別或結構之資料類型宣告的物件變數。 event
必要。 此程序處理的事件名稱。 statements
選擇性。 要在此程序中執行的陳述式區塊。
End Function
終止此程序的定義。
備註
所有可執行的程式碼都必須位於程序內。 接著,每個程序都會在類別、結構或模組 (稱為包含類別、結構或模組) 內宣告。
若要將值傳回給呼叫程式碼,請使用 Function
程序;否則,請使用 Sub
程序。
定義函式
您只能在模組層級定義 Function
程序。 因此,函式的宣告內容必須是類別、結構、模組或介面,不能是來源檔案、命名空間、程序或區塊。 如需詳細資訊,請參閱宣告內容和預設存取層級。
Function
程序預設為公用存取。 您可使用存取修飾詞來調整其存取層級。
Function
程序可以宣告程序所傳回值的資料類型。 您可以指定任何資料類型,或是列舉、結構、類別或介面的名稱。 如果您未指定 returntype
參數,則程序會傳回 Object
。
如果此程序使用 Implements
關鍵字,則包含類別或結構也必須在其 Class
或 Structure
陳述式後面緊接著 Implements
陳述式。 Implements
陳述式必須包含 implementslist
中指定的每個介面。 不過,介面定義 Function
的名稱 (在 definedname
中) 不需要符合此程序的名稱 (在 name
中)。
注意
您可以使用 Lambda 運算式來定義內嵌函式運算式。 如需詳細資訊,請參閱函式運算式和 Lambda 運算式。
從函式傳回
當 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 有時會重新排列算術運算式,以提高內部效率。 因此,當函式變更相同運算式中的變數值時,您不應該在算術運算式中使用 Function
程序。
Async 函式
Async 功能可讓您叫用非同步函式,而不需要使用明確回呼,或手動將您的程式碼分割成多個函式或 Lambda 運算式。
如果您使用 Async 修飾詞來標記函式,則可以在函式中使用 Await 運算子。 當控制權到達 Async
函式中的 Await
運算式時,控制權會傳回給呼叫端,並暫止函式中的進度,直到等候的工作完成。 當工作完成時,則可繼續在函式中執行。
注意
Async
程序會在遇到第一個尚未完成的等候物件或是到達 Async
程序的結尾時 (以先發生者為準),傳回給呼叫端。
Async
函式可以有傳回型別 Task<TResult> 或 Task。 以下提供具有傳回型別 Task<TResult> 的 Async
函式範例。
Async
函式無法宣告任何 ByRef 參數。
Sub 陳述式也可以使用 Async
修飾詞標記。 這主要是用於事件處理常式,無法傳回值。 無法等候 Async
Sub
程序,而且 Async
Sub
程序的呼叫端無法攔截 Sub
程序所擲回的例外狀況。
如需 Async
函式的詳細資訊,請參閱使用 Async 和 Await 進行非同步程式設計、非同步程式中的控制流程和 Async 傳回型別。
迭代器函式
「迭代器」函式會對集合 (例如清單或陣列) 執行自訂反覆運算。 迭代器函式使用 Yield 陳述式,一次傳回一個元素。 當到達 Yield 陳述式時,系統會記住程式碼中的目前位置。 下次呼叫迭代器函式時,便會從這個位置重新開始執行。
您可以使用 For Each…Next 陳述式,從用戶端程式碼呼叫迭代器。
迭代器函式的傳回型別可以是 IEnumerable、IEnumerable<T>、IEnumerator 或 IEnumerator<T>。
如需詳細資訊,請參閱 Iterator。
範例 1
下列範例使用 Function
陳述式來宣告組成 Function
程序主體的名稱、參數和程式碼。 ParamArray
修飾詞可讓函式接受可變數目的引數。
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
範例 2
下列範例會叫用上述範例中宣告的函式。
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
範例 3
在下列範例中,DelayAsync
是具有傳回型別 Task<TResult> 的 Async
Function
。 DelayAsync
具有傳回整數的 Return
陳述式。 因此,DelayAsync
的函式宣告必須具有傳回型別 Task(Of Integer)
。 因為傳回型別是 Task(Of Integer)
,所以 DoSomethingAsync
程序中 Await
運算式的評估會產生整數。 這點會在下列陳述式中示範:Dim result As Integer = Await delayTask
。
startButton_Click
程序是 Async Sub
程序的範例。 因為 DoSomethingAsync
是 Async
函式,所以必須等候 DoSomethingAsync
的呼叫,如下列陳述式所示:Await DoSomethingAsync()
。 startButton_Click
Sub
程序必須以 Async
修飾詞定義,因為其有 Await
運算式。
' 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