CA1863: 'CompositeFormat' を使用する
プロパティ | 値 |
---|---|
ルール ID | CA1863 |
Title | CompositeFormat を使用します |
カテゴリ | パフォーマンス |
修正が中断ありか中断なしか | なし |
.NET 8 では既定で有効 | いいえ |
原因
コードで、CompositeFormat インスタンスにキャッシュされていない static
書式指定文字列を使用して String.Format(String, Object[]) または StringBuilder.AppendFormat(String, Object[]) を呼び出しています。
規則の説明
実行時に書式指定文字列を解析するとコストがかかります。 この規則は、元の書式指定文字列を渡すのではなく、CompositeFormat インスタンスをキャッシュして書式設定操作の引数として使用できるコード内の場所を検索します。 CompositeFormat インスタンスは、複合書式指定文字列が作成されたときにそれを解析します。つまり、文字列書式指定の "ホット パス" がはるかに高速に実行されます。
違反の修正方法
CompositeFormat.Parse(String) を呼び出して CompositeFormat のインスタンスを作成し、それを元の書式指定文字列の代わりに String.Format(IFormatProvider, CompositeFormat, Object[]) または StringBuilder.AppendFormat(IFormatProvider, CompositeFormat, Object[]) に渡します。
例
次の例に、2 つの規則違反を示します。
class C
{
private static readonly string StaticField = "Format one value: {0}";
static void Main()
{
_ = string.Format(StaticField, 42);
StringBuilder sb = new();
sb.AppendFormat(StaticField, 42);
}
}
次の例は、両方の違反を修正するコードを示しています。
class C
{
private static readonly CompositeFormat StaticField = CompositeFormat.Parse("Format one value: {0}");
static void Main()
{
_ = string.Format(null, StaticField, 42);
StringBuilder sb = new();
sb.AppendFormat(null, StaticField, 42);
}
}
どのようなときに警告を抑制するか
パフォーマンスが問題にならない場合は、この規則による診断を抑制しても問題ありません。
警告を抑制する
単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。
#pragma warning disable CA1863
// The code that's violating the rule is on this line.
#pragma warning restore CA1863
ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none
に設定します。
[*.{cs,vb}]
dotnet_diagnostic.CA1863.severity = none
詳細については、「コード分析の警告を抑制する方法」を参照してください。
.NET