Share via


CA1844: 'Stream'을 서브클래싱할 때 비동기 메서드의 메모리 기반 재정의 제공

속성
규칙 ID CA1844
타이틀 'Stream'을 서브클래싱할 때 비동기 메서드의 메모리 기반 재정의 제공
범주 성능
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 8에서 기본적으로 사용 제안 사항

원인

Stream에서 파생된 형식은 ReadAsync(Byte[], Int32, Int32, CancellationToken)을 재정의하지만 ReadAsync(Memory<Byte>, CancellationToken)를 재정의하지는 않습니다. 또는 재정의에서 Stream 파생되었지만 재정WriteAsync(ReadOnlyMemory<Byte>, CancellationToken)의하지 않는 형식입니다WriteAsync(Byte[], Int32, Int32, CancellationToken).

규칙 설명

메모리 기반 ReadAsyncWriteAsync 메서드가 다음과 같은 여러 가지 방법으로 성능을 향상시키기 위해 추가되었습니다.

  • 각각 TaskTask<int> 대신 ValueTaskValueTask<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

자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.

참고 항목