呼び出し元情報 (Visual Basic)

呼び出し元情報属性を使用すると、メソッドの呼び出し元に関する情報を取得できます。 ソース コードのファイル パス、ソース コードの行番号、および呼び出し元のメンバー名を取得できます。 この情報は、診断ツールのトレース、デバッグ、作成に役立ちます。

この情報を取得するには、省略可能なパラメーターに適用される属性を使用します。各パラメーターには既定値があります。 次の表に、 System.Runtime.CompilerServices 名前空間で定義されている呼び出し元情報属性を示します。

特性 説明 タイプ
CallerFilePathAttribute 呼び出し元を含むソース ファイルの完全なパス。 これはコンパイル時のファイル パスです。 String
CallerLineNumberAttribute メソッドが呼び出されるソース ファイルの行番号。 Integer
CallerMemberNameAttribute 呼び出し元のメソッドまたはプロパティ名。 このトピックで後述する メンバー名 を参照してください。 String
CallerArgumentExpressionAttribute 呼び出し元が引数として使用する式。 このトピックの「 呼び出し元の式 」を参照してください。 String

例

次の例は、呼び出し元情報属性を使用する方法を示しています。 TraceMessage メソッドを呼び出すたびに、呼び出し元の情報は省略可能なパラメーターの引数として置き換えます。

Private Sub DoProcessing()
    TraceMessage("Something happened.")
End Sub

Public Sub TraceMessage(message As String,
        <System.Runtime.CompilerServices.CallerMemberName> Optional memberName As String = Nothing,
        <System.Runtime.CompilerServices.CallerFilePath> Optional sourcefilePath As String = Nothing,
        <System.Runtime.CompilerServices.CallerLineNumber()> Optional sourceLineNumber As Integer = 0)

    System.Diagnostics.Trace.WriteLine("message: " & message)
    System.Diagnostics.Trace.WriteLine("member name: " & memberName)
    System.Diagnostics.Trace.WriteLine("source file path: " & sourcefilePath)
    System.Diagnostics.Trace.WriteLine("source line number: " & sourceLineNumber)
End Sub

' Sample output:
'   message: Something happened.
'   member name: DoProcessing
'   source file path: C:\Users\username\Documents\Visual Studio 2012\Projects\CallerInfoVB\CallerInfoVB\Form1.vb
'   source line number: 15

注釈

省略可能な各パラメーターに明示的な既定値を指定する必要があります。 呼び出し元情報属性は、省略可能として指定されていないパラメーターには適用できません。

呼び出し元情報属性では、パラメーターは省略可能ではありません。 代わりに、引数を省略したときに渡される既定値に影響します。

呼び出し元情報の値は、コンパイル時に中間言語 (IL) にリテラルとして出力されます。 例外の StackTrace プロパティの結果とは異なり、結果は難読化の影響を受けません。

呼び出し元情報を制御したり、呼び出し元情報を非表示にしたりするために、省略可能な引数を明示的に指定できます。

メンバー名

CallerMemberName属性を使用して、呼び出されたメソッドのString引数としてメンバー名を指定しないようにすることができます。 この手法を使用すると、 リファクタリングの名前変更 によって String 値が変更されないという問題を回避できます。 この利点は、次のタスクに特に役立ちます。

  • トレースおよび診断ルーチンの使用。

  • データのバインド時に INotifyPropertyChanged インターフェイスを実装する。 このインターフェイスを使用すると、オブジェクトのプロパティは、コントロールが更新された情報を表示できるように、プロパティが変更されたことをバインドされたコントロールに通知できます。 CallerMemberName属性を指定しない場合は、プロパティ名をリテラルとして指定する必要があります。

次のグラフは、 CallerMemberName 属性を使用するときに返されるメンバー名を示しています。

呼び出しは、次のものの中で発生します。 メンバー名の結果
メソッド、プロパティ、またはイベント 呼び出し元のメソッド、プロパティ、またはイベントの名前。
コンストラクタ 文字列「.ctor」
静的コンストラクター 文字列「.cctor」
デストラクターです。 文字列「Finalize」
ユーザー定義演算子または変換 メンバーの生成された名前 (例: "op_Addition")。
属性コンストラクター 属性が適用されるメンバーの名前。 属性がメンバー内の要素 (パラメーター、戻り値、ジェネリック型パラメーターなど) の場合、この結果はその要素に関連付けられているメンバーの名前になります。
メンバーを含まない (アセンブリ レベルや型に適用される属性など) 省略可能なパラメーターの既定値。

呼び出し元の式

引数に使用する式をキャプチャする場合は、 System.Runtime.CompilerServices.CallerArgumentExpressionAttribute を使用します。 診断ライブラリでは、引数として渡される 式 の詳細を指定できます。 パラメーター名に加えて、診断をトリガーした式を指定することで、開発者は診断をトリガーした条件の詳細を確認できます。 その追加情報により、修正が容易になります。 次のメソッドでは、 CallerArgumentExpressionAttribute を使用して、 Trueする必要がある条件を表示します。

Public Shared Sub ValidateArgument(ByVal parameterName As String,
ByVal condition As Boolean,
<CallerArgumentExpression("condition")> ByVal Optional message As String? = Nothing)
    If Not condition Then
        Throw New ArgumentException($"Argument failed validation: <{message}>", parameterName)
    End If
End Sub

こちらも参照ください