共用方式為


呼叫端資訊 (Visual Basic)

使用 Caller Info 屬性,您就可以取得有關方法之呼叫端的資訊。 您可以取得原始程式碼的檔案路徑、原始程式碼中的行號,以及呼叫端的成員名稱。 這項資訊有助於追蹤、偵錯及建立診斷工具。

若要取得這項資訊,可使用套用至選擇性參數的屬性,每個屬性都有預設值。 下表列出 System.Runtime.CompilerServices 命名空間中定義的 Caller Info 屬性:

屬性 描述 類型
CallerFilePathAttribute 包含呼叫端的原始程式檔完整路徑。 這是編譯時間的檔案路徑。 String
CallerLineNumberAttribute 原始程式檔中呼叫方法所在的行號。 Integer
CallerMemberNameAttribute 呼叫端的方法或屬性名稱。 請參閱本主題稍後的成員名稱 String
CallerArgumentExpressionAttribute 呼叫者用於引數的運算式。 請參閱本主題後續的呼叫者運算式 String

範例

下列範例將示範如何使用 Caller Info 屬性。 每次呼叫 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  

備註

您必須為每個選擇性參數指定明確的預設值。 您無法將 Caller Info 屬性套用至未指定為選擇性的參數。

Caller Info 屬性不會讓參數成為選擇性, 而是會影響省略引數時傳入的預設值。

在編譯時期,Caller Info 的值會做為常值發出至中繼語言 (IL)。 結果不受模糊化所影響,與 StackTrace 屬性中例外狀況的結果不同。

您可以明確提供選擇性引數來控制呼叫端資訊,或是隱藏呼叫端資訊。

成員名稱

您可以使用 CallerMemberName 屬性避免指定成員名稱做為所呼叫方法的 String 引數。 利用這個技巧就可以避免發生 [重新命名重構] 未變更 String 值這個問題。 這項優點對於下列工作特別有用:

  • 使用追蹤和診斷常式。

  • 當繫結資料時,實作 INotifyPropertyChanged 介面。 這個介面可讓物件的屬性告知繫結的控制項屬性已變更,所以控制項可以顯示更新的資訊。 沒有 CallerMemberName 屬性 (Attribute),您就必須指定屬性 (Property) 名稱做為常值。

下圖顯示當您使用 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

另請參閱