CA1806 : N'ignorez pas les résultats des méthodes

Propriété Value
Identificateur de la règle CA1806
Titre N'ignorez pas les résultats des méthodes
Catégorie Performances
Le correctif est cassant ou non cassant Sans rupture
Activé par défaut dans .NET 8 Comme suggestion

Cause

Il existe plusieurs raisons possibles à cet avertissement :

  • Un nouvel objet est créé, mais jamais utilisé

  • Une méthode qui crée et retourne une nouvelle chaîne est appelée, et la nouvelle chaîne n’est jamais utilisée

  • Une méthode COM ou P/Invoke qui retourne un HRESULT ou un code d’erreur qui n’est jamais utilisé

  • Une méthode LINQ (Language Integrated Query) qui retourne un résultat qui n’est jamais utilisé

Description de la règle

La création d’objets inutiles et le nettoyage de la mémoire associé à l’objet inutilisé dégradent les performances.

Les chaînes sont immuables et les méthodes telles que String.ToUpper retournent une nouvelle instance d’une chaîne au lieu de modifier l’instance de la chaîne dans la méthode appelante.

Ignorer HRESULT ou un code d’erreur peut entraîner des conditions de faible ressource ou un comportement inattendu dans des conditions d’erreur.

Les méthodes LINQ sont connues pour ne pas avoir d’effets secondaires, et le résultat ne doit pas être ignoré.

Comment corriger les violations

Si une méthode crée une nouvelle instance d’un objet qui n’est jamais utilisée, passez l’instance en tant qu’argument à une autre méthode ou affectez l’instance à une variable. Si la création de l’objet n’est pas nécessaire, supprimez-le.

-ou-

Si la méthode A appelle la méthode B mais n’utilise pas la nouvelle instance de chaîne retournée par cette méthode B, passez l’instance en tant qu’argument à une autre méthode ou affectez l’instance à une variable. Ou supprimez l’appel s’il n’est pas nécessaire.

-ou-

Si la méthode A appelle la méthode B mais n’utilise pas le HRESULT ou le code d’erreur retourné par la méthode, utilisez le résultat dans une instruction conditionnelle, affectez le résultat à une variable ou passez-le en tant qu’argument à une autre méthode.

-ou-

Si une méthode LINQ A appelle la méthode B mais n’utilise pas le résultat, utilisez le résultat dans une instruction conditionnelle, affectez le résultat à une variable ou passez-le en tant qu’argument à une autre méthode.

Quand supprimer les avertissements

Ne supprimez pas un avertissement de cette règle, sauf si l’acte de création de l’objet a un but quelconque.

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

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.CA1806.severity = none

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

Configurer le code à analyser

Utilisez l’option suivante pour configurer les parties de votre codebase sur lesquelles exécuter cette règle.

Méthodes supplémentaires à appliquer

Vous pouvez configurer cette règle afin de vérifier que les résultats d’API personnalisées supplémentaires sont utilisés. Spécifiez une ou plusieurs méthodes comme valeur de l’option additional_use_results_methods. Pour spécifier plusieurs noms de méthode, séparez-les avec |. Les formats autorisés pour le nom de la méthode sont les suivants :

  • Nom de la méthode uniquement (qui inclut toutes les méthodes portant ce nom, quel que soit leur type ou espace de noms)
  • Nom complet au format d’ID de documentation, avec un préfixe M: facultatif

Par exemple, pour spécifier que la règle CA1806 doit également vérifier que le résultat d’une méthode nommée MyMethod1 est utilisé, ajoutez la paire clé-valeur suivante à un fichier .editorconfig dans votre projet.

dotnet_code_quality.CA1806.additional_use_results_methods = MyMethod1

Vous pouvez également utiliser le nom complet pour lever l’ambiguïté ou vous assurer que seule une méthode spécifique portant ce nom est incluse.

dotnet_code_quality.CA1806.additional_use_results_methods = M:MyNamespace.MyType.MyMethod1(ParamType)

Exemple 1

L’exemple suivant montre une classe qui ignore le résultat de l’appel à String.Trim.

public class Book
{
    private readonly string? _Title;

    public Book(string title)
    {
        if (title != null)
        {
            // Violates this rule
            title.Trim();
        }

        _Title = title;
    }

    public string? Title
    {
        get { return _Title; }
    }
}
Public Class Book
    Public Sub New(ByVal title As String)

        If title IsNot Nothing Then
            ' Violates this rule                
            title.Trim()
        End If

        Me.Title = title

    End Sub

    Public ReadOnly Property Title() As String

End Class

Exemple 2

L’exemple suivant corrige la violation de l’exemple 1 en réaffectant le résultat de String.Trim à la variable sur laquelle il a été appelé.

public class Book
{
    private readonly string? _Title;

    public Book(string title)
    {
        if (title != null)
        {
            title = title.Trim();
        }

        _Title = title;
    }

    public string? Title
    {
        get { return _Title; }
    }
}
Public Class Book
    Public Sub New(ByVal title As String)

        If title IsNot Nothing Then
            title = title.Trim()
        End If

        Me.Title = title

    End Sub

    Public ReadOnly Property Title() As String

End Class

Exemple 3

L’exemple suivant montre une méthode qui n’utilise pas un objet qu’elle crée.

Notes

Cette violation ne peut pas être reproduite en Visual Basic.

public class Book
{
    public Book()
    {
    }

    public static Book CreateBook()
    {
        // Violates this rule
        new Book();
        return new Book();
    }
}

Exemple 4

L’exemple suivant corrige la violation de l’exemple 3 en supprimant la création inutile d’un objet.

public class Book
{
    public Book()
    {
    }

    public static Book CreateBook()
    {
        return new Book();
    }
}