CA1859: Use concrete types when possible for improved performance

Property Value
Rule ID CA1859
Title Use concrete types when possible for improved performance
Category Performance
Fix is breaking or non-breaking Non-breaking
Introduced version .NET 8
Enabled by default in .NET 9 As suggestion

Cause

Code uses interface types or abstract types, leading to unnecessary interface calls or virtual calls.

Rule description

This rule recommends upgrading the type of specific local variables, fields, properties, method parameters, and method return types from interface or abstract types to concrete types when possible. Using concrete types leads to higher quality generated code by minimizing virtual or interface dispatch overhead and enabling inlining.

This rule only reports violations when there are virtual calls or interface calls that can actually be avoided by using a concrete type.

How to fix violations

Upgrade the types as recommended by the rule. In general, changing the type has no effect on the behavior of the code, but it improves its performance.

Example

The following code snippet shows a violation of CA1859:

abstract class A
{
    public virtual void M() { }
}

sealed class B : A
{ }

internal class C
{
    private readonly A _a = new B();

    public void Trigger()
    {
        // This performs a virtual call because
        // _a is defined as an abstract class.
        _a.M();
    }
}

The following code snippet fixes the violation:

abstract class A
{
    public virtual void M() { }
}

sealed class B : A
{ }

internal class C
{
    private readonly B _b = new B();

    public void Trigger()
    {
        _b.M();
    }
}

When to suppress warnings

It's safe to suppress a warning if performance isn't a concern.

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 CA1859
// The code that's violating the rule is on this line.
#pragma warning restore CA1859

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

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

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