BYVAL
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=KeyPgByval
- 最后更新: 2018-08-12
显式按值传递参数的声明修饰符
语法
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
Endend GeSHi
方言差异
- 在 -lang fb 方言中,
Byval是除String和用户自定义Type(默认按Byref传递)之外所有内置类型的默认参数传递约定。Zstring和Wstring内置类型也默认按Byref传递,但禁止按Byval传递。数组始终按Byref传递,且禁止使用Byref或Byval修饰符。 - 在 -lang qb 和 -lang fblite 方言中,
Byref是默认的参数传递约定。
与 QB 的差异
- QB 只在非 Basic 子例程的声明中使用
Byval
另请参阅
- 向过程传递参数
DeclareByRef
返回 目录