藉由使用呼叫端資訊屬性,您可以取得方法呼叫端的相關信息。 您可以取得原始碼的檔案路徑、原始程式碼中的行號,以及呼叫者的成員名稱。 這項資訊有助於追蹤、偵錯及建立診斷工具。
若要取得這項資訊,您可以使用套用至選擇性參數的屬性,每個參數都有預設值。 下表列出 System.Runtime.CompilerServices 命名空間中定義的呼叫端資訊屬性:
| 屬性 | 說明 | 類型 |
|---|---|---|
| CallerFilePath | 包含呼叫端之原始程序檔的完整路徑。 這是編譯時期的檔案路徑。 | String |
| CallerLineNumber | 在來源檔案中呼叫該方法的行號。 | Integer |
| CallerMemberName | 呼叫端的方法或屬性名稱。 請參閱本主題稍後的一節。 | String |
範例
下列範例示範如何使用這些屬性來追蹤呼叫端。
open System.Diagnostics
open System.Runtime.CompilerServices
open System.Runtime.InteropServices
type Tracer() =
member _.DoTrace(message: string,
[<CallerMemberName; Optional; DefaultParameterValue("")>] memberName: string,
[<CallerFilePath; Optional; DefaultParameterValue("")>] path: string,
[<CallerLineNumber; Optional; DefaultParameterValue(0)>] line: int) =
Trace.WriteLine(sprintf $"Message: {message}")
Trace.WriteLine(sprintf $"Member name: {memberName}")
Trace.WriteLine(sprintf $"Source file path: {path}")
Trace.WriteLine(sprintf $"Source line number: {line}")
備註
呼叫端資訊屬性只能套用至選擇性參數。 呼叫端資訊屬性會導致編譯程式針對以呼叫端資訊屬性裝飾的每個選擇性參數撰寫適當的值。
呼叫者資訊值會在編譯時期作為常值發出至中繼語言 (IL)。 不同於 例外狀況的 StackTrace 屬性結果,結果不會受到混淆的影響。
您可以明確提供選擇性自變數來控制呼叫端資訊,或隱藏呼叫端資訊。
成員名稱
您可以使用 CallerMemberName 屬性來避免將成員名稱指定為 String 所呼叫方法的自變數。 藉由使用這項技術,您可以避免重新命名重構不會變更 String 值的問題。 這項優點特別適用於下列工作:
- 使用追蹤和診斷程序。
- 在系結數據時實作 INotifyPropertyChanged 介面。 這個介面可讓 對象的 屬性通知綁定控件屬性已變更,讓控件可以顯示更新的資訊。 若沒有
CallerMemberName屬性,您必須將屬性名稱指定為字面值。
下圖顯示當您使用 CallerMemberName 屬性時所傳回的成員名稱。
| 呼叫發生在某處內 | 成員名稱結果 |
|---|---|
| 方法、屬性或事件 | 呼叫的來源方法、屬性或事件名稱。 |
| 建構函式 | 字串 “.ctor” |
| 靜態建構函式 | 字串 “.cctor” |
| 破壞者 | 字串「完成」 |
| 使用者定義的運算子或轉換 | 成員生成的名稱,例如「op_Addition」。 |
| 屬性建構函式 | 應用於該屬性的成員名稱。 如果屬性是成員內的任何專案(例如參數、傳回值或泛型類型參數),則此結果就是與該專案相關聯的成員名稱。 |
| 不包含成員(例如,套用至型別的元件層級或屬性) | 選擇性參數的預設值。 |