Udostępnij przez


CA1806: Nie ignoruj wyników metod

Właściwości Wartość
Identyfikator reguły CA1806
Tytuł Nie ignoruj wyników metod
Kategoria Wydajność
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 8 Jako sugestia

Przyczyna

Istnieje kilka możliwych przyczyn tego ostrzeżenia:

  • Nowy obiekt jest tworzony, ale nigdy nie jest używany.

  • Metoda, która tworzy i zwraca nowy ciąg, jest wywoływana, a nowy ciąg nigdy nie jest używany.

  • Metoda COM lub P/Invoke zwracająca HRESULT kod błędu lub, który nigdy nie jest używany.

  • Metoda zapytania zintegrowanego z językiem (LINQ), która zwraca wynik, który nigdy nie jest używany.

Opis reguły

Niepotrzebne tworzenie obiektów i skojarzone odzyskiwanie pamięci nieużywanego obiektu obniża wydajność.

Ciągi są niezmienne i metody, takie jak String.ToUpper zwracanie nowego wystąpienia ciągu zamiast modyfikowania wystąpienia ciągu w metodzie wywołującej.

Ignorowanie HRESULT lub kod błędu może prowadzić do niskiego poziomu zasobów lub nieoczekiwanego zachowania w warunkach błędu.

Metody LINQ są znane, że nie mają skutków ubocznych, a wynik nie powinien być ignorowany.

Jak naprawić naruszenia

Jeśli metoda tworzy nowe wystąpienie obiektu, które nigdy nie jest używane, przekaż wystąpienie jako argument do innej metody lub przypisz wystąpienie do zmiennej. Jeśli tworzenie obiektu jest niepotrzebne, usuń go.

— lub —

Jeśli metoda A wywołuje metodę B, ale nie używa nowego wystąpienia ciągu zwracanego przez metodę B, przekaż wystąpienie jako argument do innej metody lub przypisz wystąpienie do zmiennej. Możesz też usunąć wywołanie, jeśli jest niepotrzebne.

— lub —

Jeśli metoda A wywołuje metodę B, ale nie używa HRESULT kodu błędu lub zwracanego przez metodę, użyj wyniku instrukcji warunkowej, przypisz wynik do zmiennej lub przekaż go jako argument do innej metody.

— lub —

Jeśli metoda LINQ A wywołuje metodę B, ale nie używa wyniku, użyj wyniku w instrukcji warunkowej, przypisz wynik do zmiennej lub przekaż ją jako argument do innej metody.

Kiedy pomijać ostrzeżenia

Nie pomijaj ostrzeżenia z tej reguły, chyba że czynność tworzenia obiektu służy do określonego celu.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

#pragma warning disable CA1806
// The code that's violating the rule is on this line.
#pragma warning restore CA1806

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

[*.{cs,vb}]
dotnet_diagnostic.CA1806.severity = none

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Konfigurowanie kodu do analizowania

Użyj następującej opcji, aby skonfigurować, które części bazy kodu mają być uruchamiane w tej regule.

Dodatkowe metody wymuszania

Możesz skonfigurować tę regułę, aby sprawdzić, czy są używane wyniki z dodatkowych niestandardowych interfejsów API. Określ co najmniej jedną metodę jako wartośćadditional_use_results_methods opcji. Aby określić wiele nazw metod, należy rozdzielić je ciągiem |. Dozwolone formaty nazwy metody to:

  • Tylko nazwa metody (która będzie zawierać wszystkie metody o tej nazwie, niezależnie od ich typu lub przestrzeni nazw).
  • W pełni kwalifikowana nazwa w formacie identyfikatora dokumentacji z opcjonalnym M: prefiksem.

Aby na przykład określić, że reguła CA1806 powinna również sprawdzić, czy wynik z metody o nazwie MyMethod1 jest używany, dodaj następującą parę klucz-wartość do pliku editorconfig w projekcie.

dotnet_code_quality.CA1806.additional_use_results_methods = MyMethod1

Możesz też użyć w pełni kwalifikowanej nazwy, aby uściślić lub upewnić się, że dołączono tylko określoną metodę o tej nazwie.

dotnet_code_quality.CA1806.additional_use_results_methods = M:MyNamespace.MyType.MyMethod1(ParamType)

Przykład 1

W poniższym przykładzie pokazano klasę, która ignoruje wynik wywołania metody 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

Przykład 2

Poniższy przykład naprawia naruszenie przykładu 1 , przypisując wynik powrotu String.Trim do zmiennej, na którą został wywołany.

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

Przykład 3

W poniższym przykładzie przedstawiono metodę, która nie używa tworzonego obiektu.

Uwaga

Tego naruszenia nie można odtworzyć w Visual Basic.

public class Book
{
    public Book()
    {
    }

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

Przykład 4

Poniższy przykład naprawia naruszenie przykładu 3 przez usunięcie niepotrzebnego tworzenia obiektu.

public class Book
{
    public Book()
    {
    }

    public static Book CreateBook()
    {
        return new Book();
    }
}