Share via


CA2009: ImmutableCollection 값에서 ToImmutableCollection을 호출하지 마세요.

속성
규칙 ID CA2009
타이틀 ImmutableCollection 값의 ToImmutableCollection을 호출하지 마세요.
범주 신뢰성
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 8에서 기본적으로 사용 제안 사항

원인

ToImmutable 메서드가 System.Collections.Immutable 네임스페이스의 변경이 불가능한 컬렉션에서 불필요하게 호출되었습니다.

규칙 설명

System.Collections.Immutable 네임스페이스에는 변경이 불가능한 컬렉션을 정의하는 형식이 포함되어 있습니다. 이 규칙은 다음과 같은 변경이 불가능한 컬렉션 형식을 분석합니다.

이러한 형식은 기존 IEnumerable<T> 컬렉션에서 변경이 불가능한 새 컬렉션을 만드는 확장 메서드를 정의합니다.

이러한 확장 메서드는 변경 가능한 컬렉션을 변경이 불가능한 컬렉션으로 변환하도록 설계되었습니다. 그러나 호출자가 이러한 메서드에 대한 입력으로 변경이 불가능한 컬렉션을 실수로 전달할 수 있습니다. 이는 성능 및/또는 기능 문제를 나타낼 수 있습니다.

  • 성능 문제: 변경할 수 없는 컬렉션에 대한 불필요한 boxing, unboxing 및/또는 런타임 형식 검사입니다.
  • 잠재적 기능 문제: 실제로 변경이 불가능한 컬렉션이 있는 경우 호출자가 변경 가능한 컬렉션에서 작동하는 것으로 가정했습니다.

위반 문제를 해결하는 방법

위반 문제를 해결하려면 변경이 불가능한 컬렉션에서 중복되는 ToImmutable 호출을 제거합니다. 예를 들어 다음 두 코드 조각은 규칙의 위반 및 해결 방법을 보여 줍니다.

using System;
using System.Collections.Generic;
using System.Collections.Immutable;

public class C
{
    public void M(IEnumerable<int> collection, ImmutableArray<int> immutableArray)
    {
        // This is fine.
        M2(collection.ToImmutableArray());

        // This leads to CA2009.
        M2(immutableArray.ToImmutableArray());
    }

    private void M2(ImmutableArray<int> immutableArray)
    {
        Console.WriteLine(immutableArray.Length);
    }
}
using System;
using System.Collections.Generic;
using System.Collections.Immutable;

public class C
{
    public void M(IEnumerable<int> collection, ImmutableArray<int> immutableArray)
    {
        // This is fine.
        M2(collection.ToImmutableArray());

        // This is now fine.
        M2(immutableArray);
    }

    private void M2(ImmutableArray<int> immutableArray)
    {
        Console.WriteLine(immutableArray.Length);
    }
}

Visual Studio에서는 이 규칙에 대한 코드 수정 사항을 사용할 수 있습니다. 이를 사용하려면 위반에 커서를 놓고 Ctrl+ 키를 누릅니다.(마침표). 옵션 목록이 표시되면 중복 호출 제거를 선택합니다.

Code fix for CA2009 - Do not call ToImmutableCollection on an ImmutableCollection value

경고를 표시하지 않는 경우

변경이 불가능한 컬렉션의 불필요한 할당이 성능에 미치는 영향을 고려해야 한다면 이 규칙의 위반을 표시해야 합니다.

경고 표시 안 함

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

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

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

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

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

참고 항목