共用方式為


呼叫端資訊 (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

另請參閱