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();
}
}