方法 : 省略可能なパラメータが使用されているかどうかを確認する

更新 : 2007 年 11 月

プロシージャが省略可能なパラメータを定義する場合、呼び出し元のコードがそれらに対応する引数を渡しているかどうかを確認する必要がある場合があります。

パラメータの値が既定値に等しい場合は、次のいずれかの状況です。

  • 呼び出し元のコードがプロシージャの呼び出しで引数を省略した

  • 呼び出し元のコードがパラメータの既定値に等しい値を引数として渡した

プロシージャ コードは、この 2 つの状況を区別できません。これが問題にならない場合も多くありますが、この2 つのケースでプロシージャが別々のアクションを実行する場合も考えられます。この対処法としては、あり得ない値を既定値として設定する方法が考えられますが、呼び出し元のコードが絶対にこの値を渡さないという保証はありません。

呼び出し元のプログラムが省略可能な引数を渡しているということを確実にする必要がある場合は、プロシージャのオーバーロードされたバージョンを定義するのが最も安全です。「方法 : プロシージャの複数のバージョンを定義する」と「プロシージャのオーバーロードに関する注意事項」を参照してください。

省略可能なパラメータに引数が渡されたかどうかを確認するには

  1. パラメータの既定値に、あり得ない値を定義する

  2. 省略可能なパラメータが String などの参照型の場合は、Nothing を既定値として使用できます。ただし、Nothing が引数の値として使用されることが予想される場合を除きます。

  3. プロシージャ コード内で、パラメータを既定値と比較して適切なアクションを実行します。

省略可能なパラメータのあるものとないものでプロシージャをオーバーロードする

省略可能なパラメータを持つプロシージャを定義するには、オーバーロードを使用する方法もあります。省略可能なパラメータが 1 つある場合は、パラメータがあるバージョンとないバージョンの、2 つのオーバーロードされたバージョンのプロシージャを定義できます。この方法は、省略可能なパラメータの数が増えるにつれて複雑になります。しかし、それぞれの省略可能な引数が呼び出しプログラムによって指定されているかどうかを確実に把握できるという利点があります。

引数の有無を確認するためにプロシージャの別バージョンを定義する

  1. 引数リスト内のパラメータを含むバージョンのプロシージャを定義します。パラメータは Optional として宣言しません。

  2. もう 1 つのバージョンはパラメータなしで定義します。宣言の他の部分は 1 つ目のバージョンと同一にします。

  3. プロシージャの各バージョンに、呼び出しの種類に適したコードを配置します。

使用例

次のプロシージャでは、省略可能なパラメータ office を定義し、既定値 QJZ をテストし、呼び出しでこのパラメータが省略されているかどうかを確認します。

Sub notify(ByVal company As String, Optional ByVal office As String = "QJZ")
    If office = "QJZ" Then
        Debug.WriteLine("office not supplied -- using Headquarters")
        office = "Headquarters"
    End If
    ' Insert code to notify headquarters or specified office.
End Sub

呼び出し元のコードが引数リスト内で office に値を渡していない場合、Visual Basic は既定値 "QJZ" を返します。

省略可能なパラメータが String などの参照型の場合は、Nothing (Visual Basic) を既定値として使用できます。ただし、Nothing (Visual Basic) が引数の値として使用されることが予想される場合を除きます。

オーバーロードを使用して、省略可能なパラメータが渡されているかどうかを確認する例については、「方法 : 省略可能なパラメータを受け取るプロシージャをオーバーロードする」を参照してください。

参照

処理手順

方法 : 省略可能なパラメータをプロシージャに定義する

方法 : 省略可能なパラメータを受け取るプロシージャを呼び出す

概念

プロシージャのパラメータと引数

引数の値渡しおよび参照渡し

位置と名前による引数渡し

省略可能なパラメータ

パラメータ配列

プロシージャのオーバーロード

参照

Optional (Visual Basic)

ParamArray