次の方法で共有


パラメータの引き渡し方法 (Visual Basic 6.0 ユーザー向け)

更新 : 2007 年 11 月

Visual Basic 2008 では、引数をプロシージャに渡す方法に影響する変更点があります。

既定の引き渡しの方法

Visual Basic 6.0

Visual Basic 6.0 では、プロシージャのパラーメータに ByVal または ByRef を指定しない場合、既定の引き渡し方法は ByRef になります。これにより、プロシージャに渡される変数を呼び出し元のプログラムで変更できます。

変数を変更できるように公開することで、危険が生じる可能性があります。次の例では、引き渡し方法は既定で ByRef になります。elapsedSeconds の値は minutesPastHour で変更され、MsgBox で elapsedSeconds が正しく表示されません。

Function minutesPastHour(seconds As Integer) As Integer 
    Dim hours As Integer = seconds \ 3600 
    seconds = seconds Mod 3600 
    Return seconds \ 60 
End Function 
Sub showSecondsAndMinutes() 
    Dim elapsedSeconds, extraMinutes As Integer 
    elapsedSeconds = CInt(Timer()) ' Integer seconds since midnight. 
    extraMinutes = minutesPastHour(elapsedSeconds) 
    MsgBox "Total seconds: " & elapsedSeconds & _ 
        "; minutes past hour: " & extraMinutes 
End Sub 

引数を ByRef で渡すことにより、プロシージャは呼び出し元のプログラムで引数を変更できます。このため、予測できない動作が発生する可能性があります。また、プロシージャが別のプロシージャを呼び出し、同じ引数を ByRef で渡した場合は、意図せずに元の変数が変更される可能性が高くなります。

Visual Basic 2008

Visual Basic 2008 でプロシージャを宣言すると、各パラメータの既定の引き渡し方法は ByVal になります。これにより、引数が変更されるのを防ぎます。上の例の宣言は次のように書き換えることができます。

Function MinutesPastHour(ByVal Seconds As Integer) As Integer

seconds を値によって引き渡すことで、プロシージャは呼び出し元のプログラムで変数にアクセスできません。また、上で説明したような危険性も回避できます。

特に指定しなくても既定の方法は ByVal ですが、各パラメータで明示的に指定する方が明確で読みやすいコードになります。

ByRef Property 引数

Visual Basic 6.0

Visual Basic 6.0 では、プロシージャに ByRef 引数として渡されるプロパティは、プロシージャにコピー インされますが、コピー アウトはされません。つまり、ByRef で渡された場合でも、これらのプロパティ引数に対する変更は、呼び出し元プログラムの元のプロパティには反映されません。

Visual Basic 2008

Visual Basic 2008 では、ByRef で渡されたプロパティ引数は、プロシージャにコピー インおよびコピー アウトされます。次の例は、プロシージャによってプロパティが変更されるしくみを示しています。

Sub Reduce(ByRef Height As Single)
' ... ... ... ... ... ... ...  ' Code to modify Height argument. 
End Sub
Dim Sq As Square = New Square  ' Square has property Side of type Single. 
Reduce(Sq.Side)                ' Side is changed when Reduce returns. 

プロシージャがプロパティ引数を変更するときに、元のプロパティの値は、呼び出し元プログラムですぐには変更されません。元のプロパティの値は、プロシージャから制御が戻るときにコピー アウトされます。

ParamArray 引数

Visual Basic 6.0

Visual Basic 6.0 では、プロシージャの最後の引数に ParamArray キーワードを指定して、Variant 引数の配列を受け取ることができます。これらの引数の引き渡し方法は宣言できません。常に ByRef で渡されます。

Visual Basic 2008

Visual Basic 2008 では、ParamArray 引数は常に ByVal で渡されます。配列の引数は、すべて ParamArray 引数のデータ型である必要があります。

参照

概念

プロシージャ宣言 (Visual Basic 6.0 ユーザー向け)

プロシージャ呼び出しシーケンス (Visual Basic 6.0 ユーザー向け)

パラメータ配列

プログラミング要素のサポートに関する変更の概要

参照

Function ステートメント (Visual Basic)

Sub ステートメント (Visual Basic)

ByVal

ByRef

ParamArray