CA1861: Avoid constant arrays as arguments

Property Value
Rule ID CA1861
Title Avoid constant arrays as arguments
Category Performance
Fix is breaking or non-breaking Non-breaking
Enabled by default in .NET 8 As suggestion

Cause

A constant array of literal values is passed to a method via regular invocation or extension method invocation.

Rule description

Constant arrays passed as arguments are not reused when called repeatedly, which implies a new array is created each time. If the passed array is not mutated within the called method, consider extracting it to a static readonly field to improve performance.

Note

If the called method mutates the passed array or if you're not sure if the method would mutate the array, don't extract the array to a static readonly field. Doing so could be a breaking change. In this case, it's better to suppress the warning instead.

How to fix violations

Extract constant arrays to static readonly fields if the passed array is not mutated within the called method.

The following example shows a violation of the rule:

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

The following example show how the violation of this rule is fixed by extracting the argument to a static readonly field.

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

Now, the value of the array is resolved at compile time rather than at run time, making code more performant.

When to suppress warnings

Suppress a violation of this rule if:

  • The invocation only runs once.
  • The array could be mutated within the invoked method, or you aren't sure if it would mutated.
  • You're not concerned about the performance impact of creating a constant array for each invocation.

Suppress a warning

If you just want to suppress a single violation, add preprocessor directives to your source file to disable and then re-enable the rule.

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

To disable the rule for a file, folder, or project, set its severity to none in the configuration file.

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

For more information, see How to suppress code analysis warnings.