分享方式:


CA1861:避免常數陣列作為引數

屬性
規則識別碼 CA1861
標題 避免常數陣列作為引數
類別 效能
修正程式是中斷或非中斷 不中斷
預設在 .NET 8 中啟用 建議

原因

常值常值陣列會透過一般調用或擴充方法調用傳遞至方法。

檔案描述

當重複呼叫時,不會重複使用傳遞為引數的常數陣列,這表示每次都會建立新的陣列。 如果所傳遞的陣列未在呼叫的方法內變動,請考慮將它擷取至 static readonly 欄位以改善效能。

注意

如果呼叫的方法會變動傳遞的陣列,或者如果您不確定方法是否會變動陣列,請勿將陣列擷取至 static readonly 欄位。 這樣做可能是一項重大變更。 在此情況下,最好改為隱藏警告。

如何修正違規

如果傳遞的陣列未在呼叫的方法內變動,請將常數陣列擷取至 static readonly 欄位。

下列範例顯示違反規則:

// A method argument
string message = string.Join(" ", new[] { "Hello", "world!" });
' A method argument
Dim message As String = String.Join(" ", {"Hello", "world!"})

下列範例示範如何藉由將 引數擷取至 static readonly 欄位,來修正此規則的違規情形。

private static readonly string[] array = new[] { "Hello" , "world!" };

private string GetMessage()
{
    return string.Join(" ", array);
}
Private Shared ReadOnly array As String() = {"Hello", "world!"}

Private Function GetMessage() As String
    Return String.Join(" ", array)
End Function

現在,陣列的值會在編譯階段解析,而不是在執行時間解析,讓程式碼更具效能。

隱藏警告的時機

如果下列情況,請隱藏此規則的違規:

  • 調用只會執行一次。
  • 陣列可能會在叫用的方法內變動,或者您不確定陣列是否會變動。
  • 您並不擔心為每個調用建立常數陣列的效能影響。

隱藏警告

如果您只想要隱藏單一違規,請將預處理器指示詞新增至原始程式檔以停用,然後重新啟用規則。

#pragma warning disable CA1861
// The code that's violating the rule is on this line.
#pragma warning restore CA1861

若要停用檔案、資料夾或專案的規則,請在組態檔 中將其嚴重性設定為 。 none

[*.{cs,vb}]
dotnet_diagnostic.CA1861.severity = none

如需詳細資訊,請參閱 如何隱藏程式碼分析警告