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

    選擇性。 可以是下列其中一項:

    請參閱 Access levels in Visual Basic

  • proceduremodifiers

    選擇性。 可以是下列其中一項:

  • Shared

    選擇性。 請參閱 Shared

  • Shadows

    選擇性。 請參閱 Shadows

  • Async

    選擇性。 請參閱 Async

  • Iterator

    選擇性。 請參閱迭代器

  • name

    必要。 程序的名稱。 請參閱 Declared Element Names

  • typeparamlist

    選擇性。 泛型程序的型別參數清單。 請參閱類型清單

  • parameterlist

    選擇性。 表示此程序參數的區域變數名稱清單。 請參閱參數清單

  • returntype

    如果 Option StrictOn,則為必要項。 此程序所傳回值的資料類型。

  • 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 關鍵字,則包含類別或結構也必須在其 ClassStructure 陳述式後面緊接著 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 FunctionReturn 陳述式會導致 Function 程序立即結束。 任意數目的 Exit FunctionReturn 陳述式可以出現在程序中的任何位置,且您可以混合 Exit FunctionReturn 陳述式。

如果您使用 Exit Function 而不將值指派給 name,則程序會傳回 returntype 中指定資料類型的預設值。 如果未指定 returntype,則程序會傳回 Nothing,這是 Object 的預設值。

呼叫函式

您可以在運算式中使用程序名稱,後面接著以括弧括住的引數清單,來呼叫 Function 程序。 只有在未提供任何引數時,才能省略括弧。 不過,如果您一律包含括弧,則程式碼會更容易閱讀。

呼叫 Function 程序的方式與呼叫任何程式庫函式 (例如 SqrtCosChrW) 的方式相同。

您也可以使用 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 修飾詞標記。 這主要是用於事件處理常式,無法傳回值。 無法等候 AsyncSub 程序,而且 AsyncSub 程序的呼叫端無法攔截 Sub 程序所擲回的例外狀況。

如需 Async 函式的詳細資訊,請參閱使用 Async 和 Await 進行非同步程式設計非同步程式中的控制流程Async 傳回型別

迭代器函式

「迭代器」函式會對集合 (例如清單或陣列) 執行自訂反覆運算。 迭代器函式使用 Yield 陳述式,一次傳回一個元素。 當到達 Yield 陳述式時,系統會記住程式碼中的目前位置。 下次呼叫迭代器函式時,便會從這個位置重新開始執行。

您可以使用 For Each…Next 陳述式,從用戶端程式碼呼叫迭代器。

迭代器函式的傳回型別可以是 IEnumerableIEnumerable<T>IEnumeratorIEnumerator<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>AsyncFunctionDelayAsync 具有傳回整數的 Return 陳述式。 因此,DelayAsync 的函式宣告必須具有傳回型別 Task(Of Integer)。 因為傳回型別是 Task(Of Integer),所以 DoSomethingAsync 程序中 Await 運算式的評估會產生整數。 這點會在下列陳述式中示範:Dim result As Integer = Await delayTask

startButton_Click 程序是 Async Sub 程序的範例。 因為 DoSomethingAsyncAsync 函式,所以必須等候 DoSomethingAsync 的呼叫,如下列陳述式所示:Await DoSomethingAsync()startButton_ClickSub 程序必須以 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

另請參閱