Dela via


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 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 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 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 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 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.

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