Share via


CA1861: Undvik konstanta matriser som argument

Property Värde
Regel-ID CA1861
Title Undvik konstanta matriser som argument
Kategori Prestanda
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Som förslag

Orsak

En konstant matris med literalvärden skickas till en metod via anrop eller anrop av tilläggsmetod.

Regelbeskrivning

Konstanta matriser som skickas som argument återanvänds inte när de anropas upprepade gånger, vilket innebär att en ny matris skapas varje gång. Om den skickade matrisen inte är muterad inom den anropade metoden kan du överväga att extrahera den till ett static readonly fält för att förbättra prestandan.

Kommentar

Om den anropade metoden muterar den skickade matrisen eller om du inte är säker på om metoden skulle mutera matrisen ska du inte extrahera matrisen till ett static readonly fält. Att göra det kan vara en icke-bakåtkompatibel förändring. I det här fallet är det bättre att ignorera varningen i stället.

Så här åtgärdar du överträdelser

Extrahera konstanta matriser till static readonly fält om den skickade matrisen inte är muterad inom den anropade metoden.

I följande exempel visas ett brott mot regeln:

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

I följande exempel visas hur överträdelsen av den här regeln åtgärdas genom att extrahera argumentet till ett static readonly fält.

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

Nu löses värdet för matrisen vid kompileringstillfället i stället för vid körning, vilket gör koden mer högpresterande.

När du ska ignorera varningar

Undertryck en överträdelse av den här regeln om:

  • Anropet körs bara en gång.
  • Matrisen kan vara muterad inom den anropade metoden, eller så är du inte säker på om den skulle muteras.
  • Du bryr dig inte om prestandapåverkan av att skapa en konstant matris för varje anrop.

Ignorera en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

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

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

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

Mer information finns i Så här utelämnar du kodanalysvarningar.