Comparteix a través de


CA1508: Evitar código de condición no alcanzado

Propiedad Value
Identificador de la regla CA1508
Título Evitar código de condición no alcanzado
Categoría Capacidad de mantenimiento
La corrección es problemática o no problemática No problemática
Habilitado de forma predeterminada en .NET 9 No

Causa

Un método tiene código condicional que siempre se evalúa como true o false en tiempo de ejecución. Esto genera código no alcanzado en la rama false de la condición.

De forma predeterminada, esta regla analiza todo el código base, pero esto es configurable.

Descripción de la regla

Los métodos pueden tener código condicional, como instrucciones if, expresiones binarias (==, !=, <, >), comprobaciones NULL, etc. Por ejemplo, observe el siguiente código:

public void M(int i, int j)
{
    if (i != 0)
    {
        return;
    }

    if (j != 0)
    {
        return;
    }

    // Below condition will always evaluate to 'false' as 'i' and 'j' are both '0' here.
    if (i != j)
    {
        // Code in this 'if' branch is dead code.
        // It can either be removed or refactored.
        ...
    }
}

Los compiladores de C# y VB analizan las comprobaciones condicionales que implican valores constantes en tiempo de compilación que siempre se evalúan como true o false. Este analizador examina el flujo de datos de variables no constantes para determinar comprobaciones condicionales redundantes que impliquen valores no constantes. En el código anterior, el analizador determina que i y j son 0 para todas las rutas de acceso al código que llegan a la comprobación i != j. Por lo tanto, esta comprobación siempre se evaluará como false en tiempo de ejecución. El código dentro de la instrucción if es código no alcanzado y se puede quitar o refactorizar. Del mismo modo, el analizador realiza un seguimiento de los valores NULL de las variables y notifica las comprobaciones de valores NULL redundantes.

Nota

Este analizador realiza un costoso análisis del flujo de entrada de valores no constantes. Además, puede aumentar el tiempo de compilación global en determinadas bases de código.

Cuándo suprimir las advertencias

Es seguro suprimir una infracción de esta regla si no le preocupa el mantenimiento del código. También es preciso suprimir las infracciones que se identifican como falsos positivos. Estos pueden producirse cuando hay código simultáneo que se puede ejecutar desde varios subprocesos.

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 CA1508
// The code that's violating the rule is on this line.
#pragma warning restore CA1508

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

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

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

Configuración del código para analizar

Use las opciones siguientes para configurar en qué partes del código base se va a ejecutar esta regla.

Puede configurar estas opciones solo para esta regla, para todas las reglas a las que se aplican o para todas las reglas de esta categoría (Mantenimiento) a las que se aplican. Para más información, vea Opciones de configuración de reglas de calidad de código.

Exclusión de símbolos específicos

Puede excluir símbolos específicos, como tipos y métodos, del análisis. Por ejemplo, para especificar que la regla no se debe ejecutar en ningún código dentro de los tipos con el nombre MyType, agregue el siguiente par clave-valor a un archivo .editorconfig en el proyecto:

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType

Formatos de nombre de símbolo permitidos en el valor de opción (separados por |):

  • Solo nombre de símbolo (incluye todos los símbolos con el nombre, con independencia del tipo contenedor o el espacio de nombres).
  • Nombres completos en el formato de id. de documentación del símbolo. Cada nombre de símbolo necesita un prefijo de tipo símbolo, como M: para los métodos, T: para los tipos y N: para los espacios de nombres.
  • .ctor para los constructores y .cctor para los constructores estáticos.

Ejemplos:

Valor de la opción Resumen
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType Coincide con todos los símbolos denominados MyType.
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 Coincide con todos los símbolos denominados MyType1 o MyType2.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) Coincide con un método MyMethod concreto con la signatura completa especificada.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) Coincide con los métodos MyMethod1 y MyMethod2 concretos con las signaturas completas especificadas.

Exclusión de tipos específicos y sus tipos derivados

Puede excluir tipos específicos y sus tipos derivados del análisis. Por ejemplo, para especificar que la regla no se debe ejecutar en ningún método dentro de los tipos con el nombre MyType y sus tipos derivados, agregue el siguiente par clave-valor a un archivo .editorconfig en el proyecto:

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType

Formatos de nombre de símbolo permitidos en el valor de opción (separados por |):

  • Solo nombre de tipo (incluye todos los tipos con el nombre, con independencia del tipo contenedor o el espacio de nombres).
  • Nombres completos en el formato de identificador de documentación del símbolo, con un prefijo T: opcional.

Ejemplos:

Valor de la opción Resumen
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType Coincide con todos los tipos denominados MyType y todos sus tipos derivados.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 Coincide con todos los tipos denominados MyType1 o MyType2, y todos sus tipos derivados.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType Coincide con un tipo MyType específico con el nombre completo dado y todos sus tipos derivados.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 Coincide con los tipos MyType1 y MyType2 específicos con los correspondientes nombres completos y todos sus tipos derivados.

Consulte también