関数結果が、参照によって返されることを明示します。
構文:
記述:
関数結果が、値によってではなく、参照によって返される原因になります。
Byref を返している関数は、値を返すために、コピーを作る代わりに、変数のアドレスを返します。
これは、関数を呼び出すものが、関数結果が指す変数を修正することを許します。
Byref が指定されないならば、デフォルトは、値によって関数結果を返すことになっています。
Byref 結果の関数は、関数から局所変数を返してはいけません。これらの関数は、関数から帰ると同時に滅ぼされるからです。そして、関数へのどんなポインターや参照も、無効にします。
安全なコードを書くことを助けるために、Function = x (または name = x) 代入と、Return x 命令文で、局所変数が使われるとき、コンパイラはエラー・メッセージを示します。
注:
分析曖昧さを解決するために、'=' シンボルを用いた代入式の左側に、関数が1つの単独の引数を呼ぶとき、関数(参照によって返される)の結果は、括弧に入れなければなりません。
代入のために、'=' の代わりに、'=>' を使うことができます。
これは、(括弧なしの)曖昧さを解析することを避けるために許している、イニシャライザに関してと同じです。
引数リストは、 たとえ空でも、常に括弧で囲まなければなりません。
演算子(メンバー、あるいはグローバル)は、また、関数として使用された時、同じ構文を使って、参照によって結果を返す能力があります。
例:
Function min( ByRef I As Integer , ByRef J As Integer ) ByRef As Integer
'' 最小の整数が、参照によって返されます。コピーは作成されません。
If I < J Then
Return I
Else
Return J
End If
End Function
Dim As Integer A = 13, B = 7
Print A, B
Print min( A , B )
min( A , B ) = 0
Print A, B
Function f( ) ByRef As Const ZString
'' この文字列リテラルは、(メモリの中で静的に割り付けられたので)参照によって返されます。コピーは作成されません。
Function = "abcd"
End Function
Print f( )
Dim Shared As String s
Function f1( ) ByRef As String
'' この可変長文字列は、参照によって返されます。コピーは作成されません。
Function = s
End Function
Function f2( ByRef _s As String ) ByRef As String
'' この可変長文字列は参照(入力と出力)によって返されます。コピーは作成されません。
Function = _s
End Function
s = "abcd"
Print s
f1( ) = f1( ) & "efgh"
Print s
'' 左端の括弧は、ここでは必須です。
( f2( s ) ) = f2( s ) & "ijkl"
Print s
'' 左端の括弧はここでは必要ありません。
f2( s ) => f2( s ) & "mnop"
Print s
Function power2( ByRef _I As Integer ) ByRef As Integer
_I *= _I
'' この整数は参照によって返されます。コピーは作成されません。
Function = _I
End Function
Dim As Integer I = 2
power2( power2( power2( I ) ) ) '' 関数 リターン-byref を重ねることは、右と等価です。 ((I*I)*(I*I))*((I*I)*(I*I)) = I^8
Print I
QBからの違い:
参照: