次の方法で共有


CA2009: ImmutableCollection 値で ToImmutableCollection を呼び出さないでください

プロパティ
ルール ID CA2009
Title ImmutableCollection 値で ToImmutableCollection を呼び出さないでください
[カテゴリ] 信頼性
修正が破壊的か非破壊的か なし
.NET 10 で既定で有効 一つの提案として
該当する言語 C# と Visual Basic

原因

ToImmutable メソッドが System.Collections.Immutable 名前空間から変更できないコレクションで不必要に呼び出されました。

規則の説明

System.Collections.Immutable 名前空間には、変更できないコレクションを定義する型が含まれています。 この規則は、次の変更できないコレクション型を分析します。

これらの型は、既存の IEnumerable<T> コレクションから新しい変更できないコレクションを作成する拡張メソッドを定義します。

これらの拡張メソッドは、変更可能なコレクションを変更できないコレクションに変換するように設計されています。 ただし、呼び出し元は、これらのメソッドへの入力として、変更できないコレクションを誤って渡される可能性があります。 これは、パフォーマンスや機能の問題を表している可能性があります。

  • パフォーマンスの問題: 変更できないコレクションに対する不要なボックス化、アンボックス化、および実行時型チェック。
  • 潜在的な機能の問題: 呼び出し元が実際には変更不可能なコレクションであるにもかかわらず、それが変更可能なコレクションだと想定していた。

違反の修正方法

違反を修正するには、変更できないコレクションでの冗長な 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+. (ピリオド) を押します。 表示されるオプションの一覧から [冗長な呼び出しを削除する] を選択します。

CA2009 - ImmutableCollection の値で ToImmutableCollection を呼び出さないためのコード修正

どのようなときに警告を抑制するか

変更できないコレクションの不要な割り当てによるパフォーマンスへの影響が懸念されない限り、この規則違反を抑制しないでください。

警告を抑制する

単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。

#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

詳細については、「コード分析の警告を抑制する方法」を参照してください。

関連項目