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