| 屬性 | 值 |
|---|---|
| 規則識別碼 | CA1806 |
| 職稱 | 不要忽略方法的結果 |
| 類別 | 效能 |
| 修正程式是中斷或非中斷 | 不中斷 |
| 在 .NET 10 中預設啟用 | 建議 |
原因
此警告有數個可能的原因:
- 系統會建立新的物件,但從未使用過。
- 會呼叫建立並傳回新字串的方法,而且永遠不會使用新的字串。
- COM 或 P/Invoke 方法會傳回一個從未使用的
HRESULT或錯誤碼。 - 語言整合查詢 (LINQ) 方法會傳回從未使用的結果。
- 呼叫
[Pure]方法,其傳回值從未被使用。
檔案描述
不必要的物件建立和未使用之對象的相關聯垃圾收集會降低效能。
字串是不可變的,例如 String.ToUpper 傳回字串的新實例,而不是修改呼叫方法中的字串實例。
HRESULT忽略或錯誤碼可能會導致低資源狀況或錯誤狀況中的非預期行為。
已知 LINQ 方法和使用 PureAttribute 標註的方法沒有副作用,因此不應忽視其結果。
如何修正違規
如果方法建立從未使用過之物件的新實例,請將 實例當做自變數傳遞至另一個方法,或將實例指派給變數。 如果不需要建立物件,請將其移除。
-或-
如果方法 A 會呼叫方法 B,但未使用方法 B 傳回的新字串實例,請將 實例當做自變數傳遞至另一個方法,或將實例指派給變數。 或者,如果不需要,請移除呼叫。
-或-
如果方法 A 會呼叫方法 B,但未使用 方法傳回的 HRESULT 或 錯誤碼,請在條件語句中使用結果、將結果指派給變數,或將它當做自變數傳遞給另一個方法。
-或-
如果方法 A 呼叫 LINQ 或純方法 B,但未使用結果,請在條件語句中使用結果、將結果指派給變數,或將它作為引數傳遞給另一個方法。
隱藏警告的時機
除非建立對象的行為有某種用途,否則請勿隱藏此規則的警告。
隱藏警告
如果您只想要隱藏單一違規,請將預處理器指示詞新增至原始程式檔以停用,然後重新啟用規則。
#pragma warning disable CA1806
// The code that's violating the rule is on this line.
#pragma warning restore CA1806
[*.{cs,vb}]
dotnet_diagnostic.CA1806.severity = none
如需詳細資訊,請參閱 如何隱藏程式代碼分析警告。
設定程式代碼以分析
使用下列選項來設定程式代碼基底要執行此規則的部分。
要強制執行的其他方法
您可以設定此規則來檢查是否使用其他自訂 API 的結果。 將一或多個方法指定為 選項的值additional_use_results_methods。 若要指定多個方法名稱,請使用 |分隔它們。 方法名稱的允許格式如下:
- 僅限方法名稱(不論其包含類型或命名空間為何,都會包含該名稱的所有方法)。
- 檔標識碼格式的完整名稱,具有選擇性
M:前置詞。
例如,若要指定規則 CA1806 也應該檢查是否使用名為 MyMethod1 的方法的結果,請將下列機碼/值組新增至專案中的 .editorconfig 檔案。
dotnet_code_quality.CA1806.additional_use_results_methods = MyMethod1
或者,使用完整名稱來釐清或確保只包含具有該名稱的特定方法。
dotnet_code_quality.CA1806.additional_use_results_methods = M:MyNamespace.MyType.MyMethod1(ParamType)
範例 1
下列範例顯示忽略呼叫 String.Trim結果的類別。
public class Book
{
public Book(string title)
{
// Violates this rule.
title?.Trim();
Title = title;
}
public string? Title { get; }
}
Public Class Book
Public Sub New(ByVal title As String)
If title IsNot Nothing Then
' Violates this rule
title.Trim()
End If
Me.Title = title
End Sub
Public ReadOnly Property Title() As String
End Class
下列範例透過將 String.Trim 的結果重新指派給其呼叫的變數,以修正違規。
public class Book
{
public Book(string title)
{
// Fixes the violation.
Title = title?.Trim();
}
public string? Title { get; }
}
Public Class Book
Public Sub New(ByVal title As String)
If title IsNot Nothing Then
title = title.Trim()
End If
Me.Title = title
End Sub
Public ReadOnly Property Title() As String
End Class
範例 2
此範例展示了一種方法,該方法不會使用自身建立的物件。
注意
此違規無法在 Visual Basic 中重現。
public class Book
{
public Book() { }
public static Book CreateBook()
{
// Violates this rule.
new Book();
return new Book();
}
}
下列範例透過移除不必要建立的物件來修正違規。
public class Book
{
public Book() { }
public static Book CreateBook()
{
// Fixes the violation.
return new Book();
}
}