CA1844: Podaj zastąpienia oparte na pamięci metod asynchronicznych podczas podklasowania "Stream"

Właściwości Wartość
Identyfikator reguły CA1844
Tytuł Udostępnianie przesłonięć opartych na pamięci metod asynchronicznych podczas podklasowania "Stream"
Kategoria Wydajność
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 8 Jako sugestia

Przyczyna

Typ pochodzący z Stream przesłonięć ReadAsync(Byte[], Int32, Int32, CancellationToken) , ale nie zastępuje ReadAsync(Memory<Byte>, CancellationToken)elementu . Lub typ pochodzący z Stream przesłonięć WriteAsync(Byte[], Int32, Int32, CancellationToken) , ale nie zastępuje WriteAsync(ReadOnlyMemory<Byte>, CancellationToken).

Opis reguły

Metody i oparte na ReadAsyncWriteAsync pamięci zostały dodane w celu zwiększenia wydajności, co można osiągnąć na wiele sposobów:

  • Zwracają ValueTask odpowiednio wartości i ValueTask<int> zamiast Task i Task<int>.
  • Umożliwiają one przekazywanie dowolnego typu buforu bez konieczności wykonywania dodatkowej kopii do tablicy.

Aby zrealizować te korzyści z wydajności, typy pochodzące z Stream programu muszą zapewnić własną implementację opartą na pamięci. W przeciwnym razie domyślna implementacja zostanie zmuszona do skopiowania pamięci do tablicy w celu wywołania implementacji opartej na tablicy, co spowoduje zmniejszenie wydajności. Gdy obiekt wywołujący przechodzi w wystąpieniu Memory<T> lub ReadOnlyMemory<T> , które nie jest obsługiwane przez tablicę, wydajność będzie miała większy wpływ.

Jak naprawić naruszenia

Najprostszym sposobem naprawienia naruszeń jest przepisanie implementacji opartej na tablicy jako implementacji opartej na pamięci, a następnie zaimplementowanie metod opartych na tablicy pod względem metod opartych na pamięci.

Kiedy pomijać ostrzeżenia

Można bezpiecznie pominąć ostrzeżenie z tej reguły, jeśli ma zastosowanie którakolwiek z następujących sytuacji:

  • Osiągnięcie wydajności nie jest problemem.
  • Wiesz, że podklasa Stream będzie używać tylko metod opartych na tablicy.
  • Podklasa Stream ma zależności, które nie obsługują buforów opartych na pamięci.

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 CA1844
// The code that's violating the rule is on this line.
#pragma warning restore CA1844

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

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

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

Zobacz też