次の方法で共有


呼び出し元情報 (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

こちらも参照ください