CA2009: ImmutableCollection 값에서 ToImmutableCollection을 호출하지 마세요.
속성 | 값 |
---|---|
규칙 ID | CA2009 |
제목 | ImmutableCollection 값의 ToImmutableCollection을 호출하지 마세요. |
범주 | 신뢰성 |
수정 사항이 주요 변경인지 여부 | 주요 변경 아님 |
.NET 9에서 기본적으로 사용 | 제안 사항 |
원인
ToImmutable
메서드가 System.Collections.Immutable 네임스페이스의 변경이 불가능한 컬렉션에서 불필요하게 호출되었습니다.
규칙 설명
System.Collections.Immutable 네임스페이스에는 변경이 불가능한 컬렉션을 정의하는 형식이 포함되어 있습니다. 이 규칙은 다음과 같은 변경이 불가능한 컬렉션 형식을 분석합니다.
- System.Collections.Immutable.ImmutableArray<T>
- System.Collections.Immutable.ImmutableList<T>
- System.Collections.Immutable.ImmutableHashSet<T>
- System.Collections.Immutable.ImmutableSortedSet<T>
- System.Collections.Immutable.ImmutableDictionary<TKey,TValue>
- System.Collections.Immutable.ImmutableSortedDictionary<TKey,TValue>
이러한 형식은 기존 IEnumerable<T> 컬렉션에서 변경이 불가능한 새 컬렉션을 만드는 확장 메서드를 정의합니다.
- ImmutableArray<T>는 ToImmutableArray를 정의합니다.
- ImmutableList<T>는 ToImmutableList를 정의합니다.
- ImmutableHashSet<T>는 ToImmutableHashSet를 정의합니다.
- ImmutableSortedSet<T>는 ToImmutableSortedSet를 정의합니다.
- ImmutableDictionary<TKey,TValue>는 ToImmutableDictionary를 정의합니다.
- ImmutableSortedDictionary<TKey,TValue>는 ToImmutableSortedDictionary를 정의합니다.
이러한 확장 메서드는 변경 가능한 컬렉션을 변경이 불가능한 컬렉션으로 변환하도록 설계되었습니다. 그러나 호출자가 이러한 메서드에 대한 입력으로 변경이 불가능한 컬렉션을 실수로 전달할 수 있습니다. 이는 성능 및/또는 기능 문제를 나타낼 수 있습니다.
- 성능 문제: 변경할 수 없는 컬렉션에 대한 불필요한 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+ 키를 누릅니다.(마침표). 옵션 목록이 표시되면 중복 호출 제거를 선택합니다.
경고를 표시하지 않는 경우
변경이 불가능한 컬렉션의 불필요한 할당이 성능에 미치는 영향을 고려해야 한다면 이 규칙의 위반을 표시해야 합니다.
경고 표시 안 함
단일 위반만 표시하지 않으려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 사용하지 않도록 설정한 후 다시 사용하도록 설정합니다.
#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
자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.
참고 항목
.NET