方法声明
过程
[ FAST ] [ STATIC ] { PUBLIC | PRIVATE } { PROCEDURE | SUB }
Identifier
(
[ [ BYREF ] Parameter AS Datatype [ , … ] ] [ , ]
[ OPTIONAL [ BYREF ] Optional Parameter AS Datatype [ , … ] ] [ , ] [ ... ]
)
...
END
声明一个过程,也就是一个没有任何返回值的方法。
END 关键字用来表示过程的结尾。
函数
[ FAST ] [ STATIC ] { PUBLIC | PRIVATE } { FUNCTION | PROCEDURE | SUB }
Identifier
(
[ [ BYREF ] Parameter AS Datatype [ , … ] ] [ , ]
[ OPTIONAL [ BYREF ] Optional Parameter AS Datatype [ , … ] ] [ , ] [ ... ]
)
AS Datatype
...
END
声明一个函数,也就是一个有返回值的方法。
END关键字用来表示函数的结尾。
必须指定返回值的数据类型。
这些声明必须写作单独的一行。像语法描述中那样写,是为了方便阅读。
RETURN 关键字用于结束函数,并且传递返回值给调用程序。
示例
Public Sub Main()
Print Calc(0);; Calc(0.5);; Calc(1)
End
Function Calc(fX As Float) As Float
Return Sin(fX) * Exp(- fX)
End
0 0.290786288213 0.309559875653
方法的使用
方法可以使用在其声明所在的类中任意位置。
-
如果指定
PUBLIC
关键字,也可以在其它类中通过引用这个类的对象来使用。
-
如果指定
STATIC
关键字,方法仅能访问该类的静态变量。
方法的参数
方法的所有参数使用“,”分隔开。
-
如果指定
OPTIONAL
关键字,其后的所有参数是可选参数。可以在参数声明后面使用等号为其指定缺省值。
-
如果参数列表以
...
结束,那么方法可以接收附加参数。每一个附加参数用Param类传递给方法。
示例
STATIC PUBLIC PROCEDURE Main()
...
PUBLIC FUNCTION Calc(fA AS Float, fB AS Float) AS Float
...
PRIVATE SUB DoIt(sCommand AS String, OPTIONAL bSaveIt AS Boolean = TRUE)
...
STATIC PRIVATE FUNCTION MyPrintf(sFormat AS String, ...) AS Integer
使用"..."传递额外参数
自从 3.6
我们可以使用
...
通过
Function1()
向
Function2()
传递已知数量的参数关键字
或者,它可以用作
可变表达式
,使用
Param类传递任意数量的任何数据类型。
...
关键字用于将所有额外的参数传输给接受它们的函数。
示例 1
将已知数量的参数传递给另一个函数。
Sub Main()
PassSomeArgs("warning", "format description" , "info")
End
Sub PassSomeArgs(sType As String, ...)
' Do something with sType and pass all the other args to the next function.
Print "Got message type " & sType
PrintMessage(sType, ...)
End
Sub PrintMessage(sType as String, sFormat as String, sInfo as String)
' Do some stuff with the known number of arguments passed.
End
示例2
使用 Param 类传递任意数据类型的任意数量的参数(可变)
Sub Main()
ProcessVariadic("warning", "format description" , "info", -1)
End
Sub ProcessVariadic(...)
' Here we use the Param class to access and print all arguments supplied via "..." (you must take care of variable types if they are unknown)
Print "There are " & Param.Count & " arguments"
Dim iType As Integer
For Each vVar As Variant In Param.All
iType = TypeOf(vVar)
If iType = gb.String then
Print "Arg is a String: " & vVar
Else If iType = gb.Integer then
Print "Arg is Integer: " & Str(vVar)
Endif
Next
End
通过引用传递参数
指定
BYREF
关键字时,参数必须是可以被赋值的表达式,被调用的函数或过程可以修改的内容。
示例
SUB ConvPixelToCentimeter(BYREF Value as Float, Dpi AS Integer)
Value = Value / Dpi * 2.54
END
PUBLIC SUB Main()
DIM Size AS Float
Size = 256
ConvPixelToCentimeter(BYREF Size, 96)
PRINT Size
END
即使在声明函数时使用了BYREF关键字,如果在调用函数时不使用BYREF关键字,参数仍将是值传递。
换句话说:被调用的函数
允许 参数通过引用传递,然而由调用程序
决定 参数传递方式。
实时编译
自从 3.2
如果使用了
FAST
关键字,那么
及时编译器会优化该方法。
参见