Function 语句 (Visual Basic)
声明定义 Function 过程的名称、参数和代码。
[ <attributelist> ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ]
Function name [ (Of typeparamlist) ] [ (parameterlist) ] [ As returntype ] [ Implements implementslist | Handles eventlist ]
[ statements ]
[ Exit Function ]
[ statements ]
End Function
部件
术语 |
定义 |
attributelist |
可选。 请参见特性列表。 |
accessmodifier |
可选。 可以是如下内容之一: |
proceduremodifiers |
可选。 可以是如下内容之一:
|
Shared |
可选。 请参见 Shared。 |
Shadows |
可选。 请参见 Shadows。 |
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 过程。 使用 Function 过程的方法与使用任何库函数(如 Sqrt、Cos 或 ChrW)的方法相同。
通过使用函数名(后跟圆括号内的参数列表),可以在表达式中调用 Function 过程。 只有在不提供任何参数时,才可以省略括号。 但是,如果始终包含括号,则代码的可读性更高。
还可以使用 Call 语句来调用函数,该情况忽略返回值。
提示
可使用 lambda 表达式在行中定义函数表达式。 有关更多信息,请参见函数表达式 (Visual Basic)和Lambda 表达式 (Visual Basic)。
规则
**返回类型。**Function 语句可以声明它返回的值的数据类型。 可以指定任何数据类型或枚举、结构、类或接口的名称。
如果不指定 returntype,则过程返回 Object。
**实现。**如果此过程使用 Implements 关键字,则包含类或结构还必须在其 Class 或 Structure 语句后面紧接 Implements 语句。 Implements 语句必须包含在 implementslist 中指定的每个接口。 但是,接口在定义 Function 时所用的名称(在 definedname 中)不必与此过程的名称(在 name 中)相同。
行为
**从过程中返回。**当 Function 过程返回到调用代码时,将继续执行调用它的语句后的语句。
使用 Exit Function 和 Return 语句可以立即从 Function 过程中退出。 过程中的任何地方可以出现任意数量的 Exit Function 和 Return 语句,而且可以混用 Exit Function 和 Return 语句。
**返回值。**要从函数返回某个值,可以将该值赋给函数名,或者将其包含在 Return 语句中。 下面的示例将返回值赋给函数名 myFunction,然后使用 Exit Function 语句返回。
Function myFunction(ByVal j As Integer) As Double myFunction = 3.87 * j Exit Function End Function
如果使用 Exit Function 但未将值赋给 name,则过程会返回在 returntype 中指定的数据类型的默认值。 如果未指定 returntype,则过程返回 Nothing,这是 Object 的默认值。
Return 语句将同时赋予返回值和退出函数。 下面的示例显示如何执行此项操作。
Function myFunction(ByVal j As Integer) As Double Return 3.87 * j End Function
疑难解答
- **执行的顺序。**Visual Basic 有时会重新排列算术表达式以提高内部效率。 由于这个原因,当该函数更改同一表达式中的变量值时,避免在算术表达式中使用 Function 过程。
示例
下面的示例使用 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