CA2254:範本應該是靜態運算式
屬性 | 值 |
---|---|
規則識別碼 | CA2254 |
職稱 | 範本應該是靜態表達式 |
類別 | 使用方式 |
修正程式是中斷或非中斷 | 不中斷 |
預設在 .NET 8 中啟用 | 建議 |
原因
傳遞至記錄器 API 的訊息範本不是常數。 當傳遞的範本使用字串串連或插補時,就會發生這種情況。 相反地,範本應該是常數值,以訊息範本格式表示記錄訊息。 例如: "User {User} logged in from {Address}"
。 如需詳細資訊,請參閱 記錄訊息範本格式設定。
檔案描述
執行記錄時,最好保留記錄的結構(包括佔位元名稱),以及佔位元值。 保留這項資訊可讓您在記錄匯總和監視軟體中提供更好的可檢視性和搜尋。
首選:
var firstName = "Lorenz";
var lastName = "Otto";
// This tells the logger that there are FirstName and LastName properties
// on the log message, and correlates them with the argument values.
logger.Warning("Person {FirstName} {LastName} encountered an issue", firstName, lastName);
不慣用:
// DO NOT DO THIS
var firstName = "Lorenz";
var lastName = "Otto";
// Here, the log template itself is changing, and the association between named placeholders and their values is lost.
logger.Warning("Person " + firstName + " " + lastName + " encountered an issue");
// String interpolation also loses the association between placeholder names and their values.
logger.Warning($"Person {firstName} {lastName} encountered an issue");
記錄訊息範本在不同呼叫之間不應有異。
如何修正違規
將訊息範本更新為常數表達式。 如果您直接在範本中使用值,請重構範本以改用具名佔位元。
logger.Warning("Person {FirstName} {LastName} encountered an issue", firstName, lastName);
如需使用範例,請參閱 LoggerExtensions.LogInformation 方法。
隱藏錯誤的時機
如果您的使用案例不需要結構化記錄,則隱藏此規則的警告是安全的。 如果您的記錄訊息範本是在資源檔案中定義,則隱藏此規則也是安全的。