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

可选。 迭代器参见。

name

必需。 过程名。 请参见 已声明的元素名称 (Visual Basic)

typeparamlist

可选。 泛型过程的类型参数的列表。 请参见类型列表

parameterlist

可选。 表示此过程的参数的局部变量名称的列表。 请参见 参数列表 (Visual Basic)

returntype

如果 Option Strict 为 On,则为必选项。 此过程返回的值的数据类型。

Implements

可选。 指示此过程实现一个或多个 Function 过程,每个过程在一个由此过程的包含类或结构实现的接口中定义。 请参见 Implements 语句

implementslist

如果提供了 Implements 则需要。 所实现的 Function 过程的列表。

implementedprocedure [ , implementedprocedure ... ]

每个 implementedprocedure 均有下列语法和部分:

interface.definedname

组成部分描述
interface 必需。此过程的包含类或结构所实现的接口的名称。
definedname 必需。interface 中定义该过程时使用的名称。

Handles

可选。 指示此过程是否可以处理一个或多个特定事件。 请参见 Handles 子句 (Visual Basic)

eventlist

如果提供了 Handles 则需要。 此过程处理的事件的列表。

eventspecifier [ , eventspecifier ... ]

每个 eventspecifier 均有下列语法和部分:

eventvariable.event

组成部分描述
eventvariable 必需。用引发该事件的类或结构的数据类型声明的对象变量。
event 必需。此过程处理的事件的名称。

statements

可选。 此过程中要执行的语句块。

End Function

终止此过程的定义。

备注

所有可执行代码都必须在过程内。 每个程序在选件类、结构或称为包含的选件类、结构或模块的模块内,反过来,声明。

若要将值返回给调用代码中,使用一个 Function 程序;否则,请使用一个 Sub 程序。

定义功能

只能定义 Function 程序在模块级别。 因此,函数的声明上下文必须是选件类、结构、模块或接口,并且不能是源文件、命名空间、过程或块中。 有关更多信息,请参见声明上下文和默认访问级别 (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<TResult>Task的返回类型。 具有 Task<TResult> 的一个返回类型下面提供 Async 功能的示例。

Async 函数不能声明任何 ByRef 参数。

Sub 语句 (Visual Basic) 还可以使用标记 Async 修饰符。 对于事件处理程序主要用途,值不能返回。 AsyncSub 程序不能等待,并且,AsyncSub 程序的调用方无法捕获 Sub 程序引发的异常。

有关 Async 功能的更多信息,请参见 使用 Async 和 Await 的异步编程(C# 和 Visual Basic)异步程序中的控制流(C# 和 Visual Basic)异步返回类型(C# 和 Visual Basic)

迭代器函数

迭代器 函数对集合的自定义迭代,如列表或数组。 迭代器函数使用 Yield 语句返回每个元素一个节点。 当 Yield 语句时,代码的当前位置确保。 在下一次迭代器函数时,执行从该位置进行重新启动。

使用 对于每个 for each…next 语句,则调用从客户端代码中的迭代器。

迭代器函数的返回类型可以是 IEnumerableIEnumerable<T>IEnumeratorIEnumerator<T>

有关更多信息,请参见迭代器(C# 和 Visual Basic)

示例

下面的示例使用 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

下面的示例调用在前面的示例中声明的函数。

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<TResult>的一个返回类型的下面的示例中,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

请参见

任务

如何:使用泛型类 (Visual Basic)

过程疑难解答 (Visual Basic)

参考

Sub 语句 (Visual Basic)

参数列表 (Visual Basic)

Dim 语句 (Visual Basic)

Call 语句 (Visual Basic)

Of 子句 (Visual Basic)

函数表达式 (Visual Basic)

概念

Function 过程 (Visual Basic)

参数数组 (Visual Basic)

Lambda 表达式 (Visual Basic)