Skip to content

BYVAL


显式按值传递参数的声明修饰符

语法

Byval param as datatype

用法

[ declare ] { sub | function } proc_name ( Byval param as datatype )

说明

在 declare 语句的参数列表中使用 Byval,会将变量的副本按值传递给过程(例如子例程或函数)。

这意味着如果传递了变量 x 的值,原始变量 x 不会以任何方式被修改;但如果变量按 Byref 传递,被调用函数可以修改原始变量 x 的值。

ByRef 相反。

Byval 关键字也用于 Byref 参数函数返回值 的上下文中,在那里它可以用来显式覆盖按引用语义,以便将指针原样传递或赋值给 Byref 参数或函数返回值。参考:

注意:Byval(按副本传递)适合小对象(4 或 8 字节,稍多也可以),这些对象易于复制,如数值类型。按 Byval 传递可以避免 ByRef 使用指针的开销。

ByRef 更适合传递大型对象,如字符串或不应被复制的大型用户自定义类型。尽管 ByRef 因传递指针(并在每次访问对象时解引用)而有一些开销,但仍比每次调用过程时在栈上复制大量字节要好。

示例

start GeSHi

vb
Sub MySub(ByVal value As Integer)
    value += 1
End Sub

Dim MyVar As Integer

MyVar = 1
Print "MyVar: "; MyVar 'output = 1
MySub MyVar
Print "MyVar: "; MyVar 'output = 1, because byval won't change the values passed into it globally.
Sleep
End

end GeSHi

方言差异

  • -lang fb 方言中,Byval 是除 String 和用户自定义 Type(默认按 Byref 传递)之外所有内置类型的默认参数传递约定。ZstringWstring 内置类型也默认按 Byref 传递,但禁止按 Byval 传递。数组始终按 Byref 传递,且禁止使用 ByrefByval 修饰符。
  • -lang qb-lang fblite 方言中,Byref 是默认的参数传递约定。

与 QB 的差异

  • QB 只在非 Basic 子例程的声明中使用 Byval

另请参阅

返回 目录

基于 FreeBASIC 官方文档翻译 如有侵权请联系我们删除
FreeBASIC 是开源项目,与微软公司无隶属关系