声明定义 Function 过程的名称、参数和代码。
[ <attrlist> ] [{ Overloads | Overrides | Overridable |
NotOverridable | MustOverride | Shadows | Shared }]
[{ Public | Protected | Friend | Protected Friend | Private }]
Function name[(arglist)] [ As type ] [ Implements interface.definedname ]
[ statements ]
[ Exit Function ]
[ statements ]
End Function
各部分说明
-
attrlist
-
可选项。应用于此过程的属性列表。多个属性以逗号分隔。
-
Overloads
-
可选项。指示该
Function 过程在基类中重载用同一名称定义的一个或多个过程。此声明中的参数列表必须不同于每个重载过程的参数列表。列表必须在参数个数、参数数据类型或者两方面均有所不同。这使编译器能够区分要使用哪个版本。
当在同一个类中定义多个重载过程时,不必非要使用 Overloads 关键字。然而,如果在某个声明中使用 Overloads,则必须在所有的声明中使用它。
不能在同一个过程声明中同时指定 Overloads 和 Shadows。
-
Overrides
-
可选项。指示该
Function 过程重写基类中的同名过程。参数的个数和数据类型以及返回值的数据类型都必须完全与基类过程中它们各自的个数和数据类型匹配。
-
Overridable
-
可选项。指示该
Function 过程可被派生类中的同名过程重写。
Overridable 是自身可重写基类过程的过程的默认设置。
-
NotOverridable
-
可选项。指示该
Function 过程无法在派生类中被重写。
NotOverridable 是自身不能重写基类过程的过程的默认设置。
-
MustOverride
-
可选项。指示该
Function 过程在此类中未实现,必须在派生类中实现以使该类可创建。
-
Shadows
-
可选项。指示该
Function 过程隐藏基类中的同名编程元素或重载元素集。可以用其他任何类型的元素来隐藏任何类型的被声明元素。如果用其他过程隐藏某个过程,则参数和返回类型不必非要与基类过程中的匹配。被隐藏的元素在隐藏它的派生类内不可用,除非隐藏元素不可访问,例如,如果它为
Private。
不能在同一个过程声明中同时指定 Overloads 和 Shadows。
-
Shared
-
可选项。指示该
Function 过程是共享的过程。这意味着它不与类或者结构的特定实例相关联。可以通过用类名或结构名或者用类或结构的特定实例的变量名限定共享过程来调用它。
-
Public
-
可选项。用
Public 关键字声明的过程具有公共访问权限。对于公共过程的可访问性没有任何限制。
-
Protected
-
可选项。用
Protected 关键字声明的过程具有受保护的访问权限。仅可以从其自己的类或派生类中访问它们。只能对类成员指定受保护的访问。它不是友元访问的超集。
-
Friend
-
可选项。用
Friend 关键字声明的过程具有友元访问权限。可从它们的声明上下文内和同一程序中的任何位置访问它们。
-
Protected
Friend
-
可选项。用
Protected Friend 关键字声明的过程同时具有受保护的访问权限和友元访问权限。它们可由同一程序中的代码和派生类中的代码使用。只能对类成员指定 Protected friend 访问权限。
-
Private
-
可选项。用
Private 关键字声明的过程具有私有访问权限。只可从它们的声明上下文(包括从过程等任何嵌套类型的成员)中来访问它们。
-
name
-
必选项。
Function 过程名。必须是有效的 Visual Basic 标识符。
-
arglist
-
可选项。表示调用
Function 过程时要传递给该过程的参数的变量或表达式列表。多个参数以逗号分隔。如果提供参数列表,则必须将它括在括号内。
-
type
-
除非
Option Strict 是
On,否则是可选项。
Function 过程返回值的数据类型。可以是
Boolean、
Byte、
Char、
Date、
Decimal、
Double、
Integer、
Long、
Object、
Short、
Single 或
String;或者是枚举、结构、类或接口的名称。
-
Implements
-
可选项。表示此
Function 过程实现由接口定义的
Function 过程。
-
interface
-
如果提供了
Implements 则需要。接口由包含此
Function 过程的类或结构实现。类或结构必须在紧跟于
Class 或
Structure 语句后的
Implements 语句中指定
interface。
-
definedname
-
如果提供了
Implements 则需要。定义
Function 过程的
interface 中的名称。此
Function 过程的名称(在
name 中)不必与
definedname 相同。
-
statements
-
可选项。
Function 过程中要执行的语句块。
-
End
Function
-
结束此
Function 过程的定义。
arglist 部分中的每个参数都具有以下语法和组成部分:
[ <attrlist> ] [ Optional ] [{ ByVal | ByRef }] [ ParamArray ]
argname[( )] [ As argtype ] [ = defaultvalue ]
arglist 部分
-
attrlist
-
可选项。应用于该参数的属性列表。多个属性以逗号分隔。
-
Optional
-
可选项。指示当调用该过程时,此参数不是必选项。如果使用该关键字,则
arglist 中所有后面的参数也必须是可选项,并且必须使用
Optional 关键字来声明。每个可选参数声明都必须提供
defaultvalue 子句。如果使用
ParamArray,则
Optional 不能用于任何参数。
-
ByVal
-
可选项。指示该过程不能替换或者重新分配调用代码中的基础变量元素。然而,如果该参数是引用类型,则过程可以修改基础对象的内容或成员。
ByVal 是 Visual Basic 中的默认值。
-
ByRef
-
可选项。指示该过程可以用与调用代码本身所用的相同方式修改这些调用代码中的基础变量。
-
ParamArray
-
可选项。仅用作
arglist 中的最后一个参数,以指示最后的参数是可选的指定类型元素数组。
ParamArray 关键字使您可以向过程传递任意数量的参数。
ParamArray 参数始终使用
ByVal 进行传递。
-
argname
-
必选项。表示该参数的变量的名称。必须是有效的 Visual Basic 标识符。
-
argtype
-
除非
Option Strict 是
On,否则是可选项。传递给过程的参数的数据类型。可以是
Boolean、
Byte、
Char、
Date、
Decimal、
Double、
Integer、
Long、
Object、
Short、
Single 或
String;或者是枚举、结构、类或接口的名称。
-
defaultvalue
-
对于
Optional 参数是必选项。任何计算为参数数据类型的常数或常数表达式。如果类型是
Object,或是类、接口、数组或结构,默认值只能是
Nothing。
attrlist 部分中的每个属性具有以下语法和组成部分:
attrname [({ attrargs | attrinit })]
attrlist 部分
-
attrname
-
必选项。特性名。必须是有效的 Visual Basic 标识符。
-
attrargs
-
可选项。该特性的定位参数列表。多个参数以逗号分隔。
-
attrinit
-
可选项。该特性的字段或属性初始值设定项列表。多个初始值设定项以逗号分隔。
备注
所有可执行代码都必须在过程内。可以在模块、类、接口或结构中(但不能在其他过程中)定义 Function 过程。
默认情况下,Function 过程是 Public。若要指定不同的可访问性,请在声明中包含 Protected、Friend、Protected Friend 或 Private。
当 Function 过程返回调用程序时,继续执行调用它的语句后的语句。
使用 Exit Function 语句可以从 Function 过程立即退出。在过程内的任何位置都可以出现任意数目的 Exit Function 语句。
要从函数返回某个值,可以将该值赋给函数名,或者将其包含在 Return 语句中。下面的示例将该返回值赋给函数名 MyFunction
,然后使用 Exit Function 语句返回:
Function MyFunction(
ByVal J As Integer) As
Double
' ...
MyFunction = 3.87
' ...
Exit Function
' ...
End Function
如果使用 Exit Function,却不给 name 赋值,则该函数返回适合 argtype 的默认值。对于 Byte、Char、Decimal、Double、Integer、Long、Short 和 Single,该默认值为 0;对于 Object、String 和所有数组是 Nothing;对于 Boolean 是 False;而对于 Date 则是 #1/1/0001 12:00 AM#。
Return 语句同时赋予返回值并退出函数,如下例所示:
Function MyFunction(
ByVal J As Integer) As
Double
' ...
Return 3.87
' ...
End Function
在过程内的任何位置可以出现任意数目的 Return 语句。还可以混合 Exit Function 和 Return 语句。
当希望使用该函数返回的值时,可以在表达式的右边使用 Function 过程。使用 Function 过程的方法与使用任何库函数如 Sqrt、Cos 或 ChrW 的方法相同。
通过使用函数名(后跟圆括号内的参数列表),可以在表达式中调用 Function 过程。只有在不提供任何参数时,才可以省略括号。还可以使用 Call 语句来调用函数,该情况忽略返回值。
注意 Visual Basic 有时会重新排列算术表达式以提高内部效率。由于这个原因,当该函数更改同一表达式中的变量值时,避免在算术表达式中使用
Function 过程。
示例
该示例使用 Function 语句声明形成 Function 过程体的名称、参数和代码。ParamArray 关键字使函数能够接受可变数量的参数。
Public Function
CalcSum(
ByVal ParamArray Args() As
Double)
As
Double
Dim I As Integer
CalcSum = 0
If Args.Length <= 0 Then Exit Function
' No arguments passed.
For I = 0 To UBound(Args, 1)
CalcSum += Args(I)
Next I
End Function
' Returns latest value of CalcSum.
可以按如下方式调用该函数:
Dim ReturnedValue As Double
ReturnedValue = CalcSum(4, 3, 2, 1)
' The function's local variables are assigned the following values:
' Args(0) = 4, Args(1) = 3, and so on.