Поделиться через


CA2023: недопустимые фигурные скобки в шаблоне сообщения

Недвижимость Ценность
Идентификатор правила CA2023
Заголовок Недопустимые фигурные скобки в шаблоне сообщения
Категория Надёжность
Исправление является разрушающим или неразрушающим Non-breaking
Включен по умолчанию в .NET 10 Как предупреждение

Причина

Фигурные скобки, представленные в шаблоне сообщения, недопустимы. Убедитесь, что все фигурные скобки в шаблоне сообщения являются допустимыми открывающим и закрывающим фигурными скобками или экранируются.

Описание правила

Шаблоны сообщений ведения журнала используют фигурные скобки { и } обозначать именованные заполнители для значений. Недопустимое использование фигурных скобок в шаблонах сообщений может привести к исключению среды выполнения или непредвиденному ведению журнала. Это правило обнаруживает:

  • Несовпаденные фигурные скобки или закрывающие фигурные скобки.
  • Вложенные фигурные скобки, которые неправильно экранируются.
  • Другие неправильно сформированные шаблоны фигурных скобок.

Устранение нарушений

Чтобы устранить нарушение этого правила:

  • Убедитесь, что все открывающие фигурные скобки { имеют соответствующую закрывающую скобку }.
  • Escape литеральные скобки, удвоив их: {{ для { и }} для }.
  • Исправьте все вложенные или неправильно сформированные шаблоны фигурных скобок.

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

Дополнительные сведения см. в разделе "Подавление предупреждений анализа кода".

См. также