CA1828: AnyAsync를 사용할 수 있는 경우 CountAsync/LongCountAsync를 사용하지 마세요.

속성
규칙 ID CA1828
타이틀 AnyAsync를 사용할 수 있는 경우 CountAsync/LongCountAsync를 사용하지 마세요.
범주 성능
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 8에서 기본적으로 사용 제안 사항

원인

CountAsync 메서드가 더 효율적인 위치에 또는 LongCountAsync 메서드가 AnyAsync 사용되었습니다.

규칙 설명

이 규칙은 컬렉션에 하나 이상의 요소가 있는지 확인하는 데 사용되는 CountAsyncLongCountAsync LINQ 메서드 호출에 플래그를 지정합니다. 이러한 메서드 호출에서 개수를 계산하려면 전체 컬렉션을 열거해야 합니다. AnyAsync 메서드를 사용하면 컬렉션을 열거하지 않기 때문에 동일한 확인 작업을 더 빠르게 수행할 수 있습니다.

위반 문제를 해결하는 방법

위반 문제를 해결하려면 CountAsync 또는 LongCountAsync 메서드 호출을 AnyAsync 메서드로 바꿉니다. 예를 들어 다음 두 코드 조각은 규칙의 위반과 위반을 해결하는 방법을 보여 줍니다.

using System.Linq;
using System.Threading.Tasks;
using static Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions;

class C
{
    public async Task<string> M1Async(IQueryable<string> list)
        => await list.CountAsync() != 0 ? "Not empty" : "Empty";

    public async Task<string> M2Async(IQueryable<string> list)
        => await list.LongCountAsync() > 0 ? "Not empty" : "Empty";
}
using System.Linq;
using System.Threading.Tasks;
using static Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions;

class C
{
    public async Task<string> M1Async(IQueryable<string> list)
        => await list.AnyAsync() ? "Not empty" : "Empty";

    public async Task<string> M2Async(IQueryable<string> list)
        => await list.AnyAsync() ? "Not empty" : "Empty";
}

Visual Studio에서는 이 규칙에 대한 코드 수정 사항을 사용할 수 있습니다. 이를 사용하려면 위반에 커서를 놓고 Ctrl+ 키를 누릅니다.(마침표). 옵션 목록이 표시되면 AnyAsync()를 사용할 수 있는 경우 CountAsync() 또는 LongCountAsync() 사용 안 함을 선택합니다.

Code fix for CA1828 - Do not use CountAsync() or LongCountAsync() when AnyAsync() can be used

경고를 표시하지 않는 경우

개수를 계산하기 위한 불필요한 컬렉션 열거가 성능에 미치는 영향을 고려하지 않아도 되는 경우 이 규칙의 위반을 표시하지 않아도 됩니다.

경고 표시 안 함

단일 위반만 표시하지 않으려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 사용하지 않도록 설정한 후 다시 사용하도록 설정합니다.

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

파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않도록 설정하려면 구성 파일에서 심각도를 none으로 설정합니다.

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

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

참고 항목