次の方法で共有


CA2023: メッセージ テンプレートの中かっこが無効です

プロパティ 価値
ルール識別子 CA2023
タイトル メッセージ テンプレートの中かっこが無効です
カテゴリ Reliability
修正が破壊的であるか非破壊的であるか Non-breaking
.NET 10 で既定で有効 警告として

原因

メッセージ テンプレートに存在する中かっこが無効です。 メッセージ テンプレート内の中かっこが有効な開始/閉じ中かっこであるか、エスケープされていることを確認します。

ルールの説明

ログ メッセージ テンプレートでは、中かっこ {} を使用して、値の名前付きプレースホルダーを示します。 メッセージ テンプレートで中かっこを無効に使用すると、実行時の例外や予期しないログの動作が発生する可能性があります。 このルールでは、次の情報が検出されます。

  • 一致しない開始中かっこまたは右中かっこ。
  • 正しくエスケープされていない入れ子になった中かっこ。
  • その他の形式が正しくない中かっこパターン。

違反を修正する方法

この規則の違反を修正するには:

  • すべての左中かっこ { 対応する右中かっこ }があることを確認します。
  • リテラル中かっこを 2 倍にしてエスケープします。{{の場合は{}}の場合は}
  • 入れ子になった、または形式が正しくない中かっこパターンを修正します。

Example

次のコード スニペットは、CA2023 の違反を示しています。

using Microsoft.Extensions.Logging;

class Example
{
    private readonly ILogger _logger;

    public Example(ILogger<Example> logger)
    {
        _logger = logger;
    }

    public void LogData(string name, int value)
    {
        // Violation: unmatched opening brace.
        _logger.LogInformation("Processing {Name with value {Value}", name, value);

        // Violation: unmatched closing brace.
        _logger.LogInformation("Processing Name} with value {Value}", name, value);
    }
}
Imports Microsoft.Extensions.Logging

Class Example
    Private ReadOnly _logger As ILogger

    Public Sub New(logger As ILogger(Of Example))
        _logger = logger
    End Sub

    Public Sub LogData(name As String, value As Integer)
        ' Violation: unmatched opening brace.
        _logger.LogInformation("Processing {Name with value {Value}", name, value)

        ' Violation: unmatched closing brace.
        _logger.LogInformation("Processing Name} with value {Value}", name, value)
    End Sub
End Class

次のコード スニペットは、違反を修正します。

using Microsoft.Extensions.Logging;

class Example
{
    private readonly ILogger _logger;

    public Example(ILogger<Example> logger)
    {
        _logger = logger;
    }

    public void LogData(string name, int value)
    {
        // Fixed: proper braces.
        _logger.LogInformation("Processing {Name} with value {Value}", name, value);

        // Fixed: escaped literal braces.
        _logger.LogInformation("Processing {{Name}} with value {Value}", name, value);
    }
}
Imports Microsoft.Extensions.Logging

Class Example
    Private ReadOnly _logger As ILogger

    Public Sub New(logger As ILogger(Of Example))
        _logger = logger
    End Sub

    Public Sub LogData(name As String, value As Integer)
        ' Fixed: proper braces.
        _logger.LogInformation("Processing {Name} with value {Value}", name, value)

        ' Fixed: escaped literal braces.
        _logger.LogInformation("Processing {{Name}} with value {Value}", name, value)
    End Sub
End Class

警告を抑制するタイミング

このルールからの警告を抑制しないでください。 メッセージ テンプレートの中かっこが無効な場合、実行時の例外や正しくないログ出力が発生する可能性があります。

警告を抑制する

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

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

ファイル、フォルダー、またはプロジェクトのルールを無効にするには、その重大度をnoneに設定します。

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

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

こちらも参照ください