藉由使用呼叫端資訊屬性,您可以取得方法呼叫端的相關信息。 您可以取得原始碼的檔案路徑、原始程式碼中的行號,以及呼叫者的成員名稱。 這項資訊有助於追蹤、偵錯及建立診斷工具。
若要取得這項資訊,您可以使用套用至選擇性參數的屬性,每個參數都有預設值。 下表列出命名空間中 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” |
破壞者 | 字串「完成」 |
使用者定義的運算子或轉換 | 成員生成的名稱,例如「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