呼叫端資訊 (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”
破壞者 字串「完成」
使用者定義的運算子或轉換 成員生成的名稱,例如「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

另請參閱