パラメタを、明示的に、値渡しする、宣言指定子。
構文:
用法:
記述:
宣言命令の引数リストで Byval とすると、変数の値のコピーを、手続き (sub や function) に渡します。
これは、変数
x の値が手続きに渡された場合、元の変数
x は、変更されないことを意味します。
一方、変数が
Byref で渡された場合は、元の変数
x の値は、呼ばれた手続きの過程で変更される可能性があります。
注意:
文字列引数のために、Byval は、現在、異なった意味があります:
文字列のコピーを渡す代わりに、zstring ポインタを文字列データに渡します。一方、Byref は、FreeBASIC 文字列記述子に、ポインタを渡します。
このような振舞いから、Byval String を、直接 C の手続きに渡すことができます。
この方法で渡された文字列は、Sub/Function で変えられません。文字列記述子をアップデートしないからです。
String Byval を渡す意味は、将来、変わるかもしれません。
したがって、 String Byval を渡すことは避けるべきです。
Zstring は、C 関数に、zero-terminated strings を渡す目的で、より適しています。
ByRef の反対です。
Byval キーワードは、
Byref(パラメータ) と
BYREF (関数結果) の文脈の中でも使うことができます。
これを使うと、参照の意図を明示的に無視して、ポインターをそのまま
Byref パラメーターや関数結果に渡したり代入したりするために使うことができます。
下記を参照下さい:
注意:
Byval (コピー渡し)は、数値型のように、コピーが簡単な小さなオブジェクト(4バイトまたは8バイトか、もう少し大きくても大丈夫です)に適しています。
Byval で渡すことで、
ByRef が使うポインタのオーバーヘッドを回避できます。
ByRef は、文字列や、コピーしてはいけない大きな UDT などの、巨大なオブジェクトを渡すのに適しています。
ByRef は、ポインタを渡す必要があるため(およびオブジェクトへのアクセスごとに間接参照する必要があるため)オーバーヘッドがありますが、手続きが呼び出されるたびに多数のバイトをスタックにコピーするよりも、優れています。
例:
Sub MySub
(ByVal value As Integer)
value += 1
End Sub
Dim MyVar As Integer
MyVar = 1
Print "MyVar:
";
MyVar '出力 = 1
MySub MyVar
Print "MyVar:
";
MyVar '出力 = 1, byval は、値を変えません。どこでも、そのまま渡されます。
Sleep
End
方言差:
QBからの違い:
-
QB は、非 Basic サブルーチンの宣言に、Byval だけが使えました。
参照: