CA1844: обеспечение переопределения асинхронных методов на основе памяти при создании подкласса Stream
Свойство | Значение |
---|---|
Идентификатор правила | CA1844 |
Заголовок | Предоставьте переопределения на основе памяти асинхронных методов при подклассе Stream. |
Категория | Производительность |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | Как предложение |
Причина
Тип, производный от Stream, переопределяет ReadAsync(Byte[], Int32, Int32, CancellationToken), однако не переопределяет ReadAsync(Memory<Byte>, CancellationToken). Или тип, производный от Stream переопределения, WriteAsync(Byte[], Int32, Int32, CancellationToken) но не переопределяет WriteAsync(ReadOnlyMemory<Byte>, CancellationToken).
Описание правила
Методы ReadAsync
и WriteAsync
, основанные на памяти, были добавлены для повышения производительности. Они достигают этого несколькими способами:
- возвращают
ValueTask
иValueTask<int>
вместоTask
иTask<int>
, соответственно; - позволяют передавать любой тип буфера без необходимости выполнения дополнительной копии в массиве.
Чтобы реализовать эти преимущества в производительности, типы, производные от Stream, должны предоставлять свою собственную реализацию на основе памяти. В противном случае реализация по умолчанию будет вынуждена скопировать память в массив, чтобы вызвать реализацию на основе массива, что приведет к снижению производительности. Когда вызывающий объект передает экземпляр Memory<T> или ReadOnlyMemory<T>, не поддерживаемый массивом, производительность снижается в большей степени.
Устранение нарушений
Самым простым способом устранения нарушений является перезапись реализации на основе массивов в качестве реализации на основе памяти, а затем реализация методов на основе массива в условиях методов на основе памяти.
Когда лучше отключить предупреждения
Вывод предупреждения для этого правила можно отключить, если применима любая из следующих ситуаций:
- снижение производительности не является принципиальным;
- известно, что подкласс
Stream
будет использовать только методы на основе массивов; - подкласс
Stream
имеет зависимости, которые не поддерживают буферы на основе памяти.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA1844
// The code that's violating the rule is on this line.
#pragma warning restore CA1844
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none
в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA1844.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.