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