呼び出し元情報属性を使用すると、メソッドの呼び出し元に関する情報を取得できます。 ソース コードのファイル パス、ソース コードの行番号、および呼び出し元のメンバー名を取得できます。 この情報は、診断ツールのトレース、デバッグ、作成に役立ちます。
この情報を取得するには、省略可能なパラメーターに適用される属性を使用します。各パラメーターには既定値があります。 次の表に、 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
こちらも参照ください
.NET