CA1859 : Utiliser des types concrets lorsque cela est possible pour améliorer les performances

Propriété Value
Identificateur de la règle CA1859
Titre Utiliser des types concrets lorsque cela est possible pour améliorer les performances
Catégorie Performances
Le correctif est cassant ou non cassant Sans rupture
Version introduite .NET 8
Activé par défaut dans .NET 8 Comme suggestion

Cause

Le code utilise des types d’interface ou des types abstraits, ce qui entraîne des appels d’interface ou des appels virtuels inutiles.

Description de la règle

Cette règle recommande de mettre à niveau le type des variables locales, des champs, des propriétés, des paramètres de méthode et des types de retour de méthode à partir de types d’interface ou abstraits vers des types concrets lorsque cela est possible. L’utilisation de types concrets permet d’obtenir du code généré de meilleure qualité en réduisant la surcharge de dispatch virtuel ou d’interface et en activant l’inlining.

Cette règle ne signale les violations que lorsqu’il existe des appels virtuels ou d’interface qui peuvent être évités en utilisant un type concret.

Comment corriger les violations

Mettez à niveau les types comme recommandé par la règle. En général, la modification du type n’a aucun effet sur le comportement du code, mais cela améliore ses performances.

Exemple

L’extrait de code suivant montre une violation de 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();
    }
}

L’extrait de code suivant corrige la 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();
    }
}

Quand supprimer les avertissements

Vous pouvez supprimer un avertissement en toute sécurité si les performances ne constituent pas un problème.

Supprimer un avertissement

Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.

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

Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none dans le fichier de configuration.

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

Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.