CA1806: Ignorera inte metodresultat
Property | Värde |
---|---|
Regel-ID | CA1806 |
Title | Ignorera inte metodresultat |
Kategori | Prestanda |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Som förslag |
Orsak
Det finns flera möjliga orsaker till den här varningen:
Ett nytt objekt skapas men används aldrig.
En metod som skapar och returnerar en ny sträng anropas och den nya strängen används aldrig.
En COM- eller P/Invoke-metod som returnerar en
HRESULT
eller felkod som aldrig används.En språkintegrerad frågemetod (LINQ) som returnerar ett resultat som aldrig används.
Regelbeskrivning
Onödiga objekt skapas och den associerade skräpinsamlingen för det oanvända objektet försämrar prestandan.
Strängar är oföränderliga och metoder som String.ToUpper att returnera en ny instans av en sträng i stället för att ändra instansen av strängen i anropande metod.
Att ignorera HRESULT
eller en felkod kan leda till låg resursförhållanden eller oväntat beteende i feltillstånd.
LINQ-metoder är kända för att inte ha biverkningar, och resultatet bör inte ignoreras.
Så här åtgärdar du överträdelser
Om en metod skapar en ny instans av ett objekt som aldrig används skickar du instansen som ett argument till en annan metod eller tilldelar instansen till en variabel. Om objektet inte skapas tar du bort det.
-eller-
Om metoden A anropar metod B men inte använder den nya stränginstansen som metod B returnerar skickar du instansen som ett argument till en annan metod eller tilldelar instansen till en variabel. Eller ta bort anropet om det inte behövs.
-eller-
Om metod A anropar metod B men inte använder HRESULT
den eller-felkod som metoden returnerar använder du resultatet i en villkorssats, tilldelar resultatet till en variabel eller skickar det som ett argument till en annan metod.
-eller-
Om en LINQ-metod A anropar metod B men inte använder resultatet använder du resultatet i en villkorssats, tilldelar resultatet till en variabel eller skickar det som ett argument till en annan metod.
När du ska ignorera varningar
Utelämna inte en varning från den här regeln om inte åtgärden att skapa objektet har något syfte.
Ignorera en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA1806
// The code that's violating the rule is on this line.
#pragma warning restore CA1806
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none
i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA1806.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.
Konfigurera kod för analys
Använd följande alternativ för att konfigurera vilka delar av kodbasen som regeln ska köras på.
Ytterligare metoder att framtvinga
Du kan konfigurera den här regeln för att kontrollera att resultat från ytterligare anpassade API:er används. Ange en eller flera metoder som värdet för additional_use_results_methods
alternativet. Om du vill ange flera metodnamn separerar du dem med |
. De tillåtna formaten för metodnamnet är:
- Endast metodnamn (som innehåller alla metoder med det namnet, oavsett vilken typ eller namnrymd de innehåller).
- Fullständigt kvalificerat namn i dokumentations-ID-format med ett valfritt
M:
prefix.
Om du till exempel vill ange regeln CA1806 bör du också kontrollera att resultatet från en metod med namnet MyMethod1
används lägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet.
dotnet_code_quality.CA1806.additional_use_results_methods = MyMethod1
Eller använd det fullständigt kvalificerade namnet för att skilja eller se till att endast en specifik metod med det namnet ingår.
dotnet_code_quality.CA1806.additional_use_results_methods = M:MyNamespace.MyType.MyMethod1(ParamType)
Exempel 1
I följande exempel visas en klass som ignorerar resultatet av att anropa 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
Exempel 2
I följande exempel åtgärdas överträdelsen Exempel 1 genom att tilldela resultatet av String.Trim tillbaka till variabeln som den anropades för.
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
Exempel 3
I följande exempel visas en metod som inte använder ett objekt som skapas.
Kommentar
Det går inte att återskapa den här överträdelsen i Visual Basic.
public class Book
{
public Book()
{
}
public static Book CreateBook()
{
// Violates this rule
new Book();
return new Book();
}
}
Exempel 4
I följande exempel åtgärdas överträdelse av exempel 3 genom att ta bort det onödiga skapandet av ett objekt.
public class Book
{
public Book()
{
}
public static Book CreateBook()
{
return new Book();
}
}