Dela via


CA1806: Ignorera inte metodresultat

Egenskap Värde
Regel-ID CA1806
Title Ignorera inte metodresultat
Kategori Prestanda
Korrigeringen är antingen invasiv eller icke-invasiv Odelbar
Aktiverad som standard i .NET 10 Som förslag
Tillämpliga språk C# och Visual Basic

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 returnerar en HRESULT eller felkod som aldrig används.
  • En linq-metod (language-integrated query) returnerar ett resultat som aldrig används.
  • En [Pure] metod anropas och returvärdet används aldrig.

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 returnerar en ny instans av en sträng istället för att ändra den instansen av strängen i den anropande metoden.

Att ignorera HRESULT eller en felkod kan leda till låga resursnivåer eller oväntat beteende vid fel.

LINQ-metoder och metoder som kommenteras med PureAttribute ä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 det är onödigt att skapa objektet, ta 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 metod A anropar en LINQ eller ren 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.

För att specificera att regeln CA1806 även ska kontrollera att resultatet från en metod med namnet MyMethod1 används, lägg till följande nyckel-värde-par i filen .editorconfig i ditt projekt.

dotnet_code_quality.CA1806.additional_use_results_methods = MyMethod1

Eller använd det fullständigt kvalificerade namnet för att tydliggöra eller för att säkerställa 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
{
    public Book(string title)
    {
        // Violates this rule.
        title?.Trim();

        Title = title;
    }

    public string? Title { get; }
}
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

I följande exempel åtgärdas överträdelsen genom att resultatet från String.Trim tilldelas tillbaka till den variabel på vilken det anropades.

public class Book
{
    public Book(string title)
    {
        // Fixes the violation.
        Title = title?.Trim();
    }

    public string? Title { get; }
}
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 2

I följande exempel visas en metod som inte använder ett objekt som skapas.

Kommentar

Den här överträdelsen kan inte återskapas i Visual Basic.

public class Book
{
    public Book() { }

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

I följande exempel åtgärdas överträdelsen genom att ett objekt inte skapas i onödan.

public class Book
{
    public Book() { }

    public static Book CreateBook()
    {
        // Fixes the violation.
        return new Book();
    }
}