CA2009: ImmutableCollection 値で ToImmutableCollection を呼び出さないでください
プロパティ | 値 |
---|---|
ルール ID | CA2009 |
Title | 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 を定義します。
これらの拡張メソッドは、変更可能なコレクションを変更できないコレクションに変換するように設計されています。 ただし、呼び出し元は、これらのメソッドへの入力として、変更できないコレクションを誤って渡される可能性があります。 これは、パフォーマンスや機能の問題を表している可能性があります。
- パフォーマンスの問題: 変更できないコレクションに対する不要なボックス化、ボックス化解除、ランタイム型のチェック。
- 潜在的な機能の問題: 呼び出し元では、変更できないコレクションが実際に存在する場合は、変更可能なコレクションでの操作が想定されます。
違反の修正方法
違反を修正するには、変更できないコレクションでの冗長な ToImmutable
呼び出しを削除します。 たとえば、次の 2 つのコード スニペットは、この規則違反とその修正方法を示しています。
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