Compartir a través de


CA2023: llaves no válidas en la plantilla de mensaje

Propiedad Importancia
Identificador de la regla CA2023
Título Llaves no válidas en la plantilla de mensaje
Categoría Reliability
La corrección es disruptiva o no disruptiva Non-breaking
Habilitado de forma predeterminada en .NET 10 Como advertencia

Causa

Las llaves presentes en la plantilla de mensaje no son válidas. Asegúrese de que las llaves de la plantilla de mensaje sean llaves de apertura y cierre válidas o que se escapen.

Descripción de la regla

Las plantillas de mensaje de registro usan llaves { y } para indicar marcadores de posición con nombre para los valores. El uso de llaves no válido en las plantillas de mensaje puede dar lugar a excepciones en tiempo de ejecución o a un comportamiento de registro inesperado. Esta regla detecta lo siguiente:

  • Llaves de apertura o cierre no coincidentes.
  • Llaves anidadas que no se escapan correctamente.
  • Otros patrones de llaves malformadas.

Cómo corregir infracciones

Para corregir una infracción de esta regla haga lo siguiente:

  • Asegúrese de que todas las llaves { de apertura tengan una llave }de cierre correspondiente.
  • Llaves literales de escape al duplicarlas: {{ para { y }} para }.
  • Corrija los patrones de llave anidados o incorrectos.

Example

El siguiente fragmento de código muestra infracciones de 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

El siguiente fragmento de código corrige las infracciones:

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

Cuándo suprimir las advertencias

No suprima una advertencia de esta regla. Las llaves no válidas en las plantillas de mensaje pueden provocar excepciones en tiempo de ejecución o una salida de registro incorrecta.

Supresión de una advertencia

Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.

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

Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad a none en el archivo de configuración.

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

Para obtener más información, consulte Cómo suprimir advertencias de análisis de código.

Consulte también