方法声明

过程

[ 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
6.773333333333

即使在声明函数时使用了BYREF关键字,如果在调用函数时不使用BYREF关键字,参数仍将是值传递。

换句话说:被调用的函数 允许 参数通过引用传递,然而由调用程序 决定 参数传递方式。

实时编译

自从 3.2

如果使用了 FAST 关键字,那么及时编译器会优化该方法。

参见