Compartir a través de


No inicializar innecesariamente

Actualización: noviembre 2007

Nombre de tipo

DoNotInitializeUnnecessarily

Identificador de comprobación

CA1805

Categoría

Microsoft.Performance

Cambio problemático

No problemático

Motivo

Un constructor o instancia estática inicializa un campo a su valor predeterminado. Esta regla omite Ensamblados de C++ administrados.

Descripción de la regla

El Common Language Runtime inicializa todos los campos a sus valores predeterminados antes de ejecutar el constructor. En la mayoría de los casos, inicializar un campo a su valor predeterminado en un constructor es redundante, lo que disminuye el rendimiento y agrega costos de mantenimiento. Un caso en el que no es redundante se produce cuando el constructor llama a otro constructor de la misma clase o a un constructor de clase base, y este inicializa el campo a un valor que no es el predeterminado. En este caso, volver a establecer el valor del campo en su valor predeterminado puede ser adecuado.

Cómo corregir infracciones

Para corregir una infracción de esta regla, quite la inicialización del campo desde el constructor. Observe que el compilador de C# incluido con .NET Framework 2.0 quita estas inicializaciones innecesarias cuando se habilita la opción optimize.

También puede convertir la inicialización del campo en una aserción, tal como se muestra a continuación:

Debug.Assert(field == 0); 

De este modo, se cumple la regla y se indica a los programadores que trabajan con el código que el campo ya está inicializado. De esta forma, se presentará un modelo más familiar a los programadores que suelen trabajar con varios lenguajes.

Cuándo suprimir advertencias

Suprima una advertencia de esta regla si el constructor llama a otro constructor en la misma clase o clase base que inicializa el campo en un valor no predeterminado. También es seguro suprimir una advertencia de esta regla o deshabilitar completamente la regla si el rendimiento y el mantenimiento de código no son prioritarios.

Ejemplo

El ejemplo siguiente muestra un tipo que contiene varias infracciones de esta regla.

Imports System

Namespace PerformanceLibrary

   Class InitializeUnnecessarily

      Dim b1 As Boolean
      Dim b2 As Boolean
      Dim i As Integer
      Dim d As Double
      Dim s As String

      Sub New()

         b1 = True

         ' The following field assignments are violations of this rule.
         b2 = False
         i = 0
         d = 0
         s = Nothing

      End Sub

      Sub New(s As String)

         Me.New()

         ' Exclude the warning for the following statement.
         b1 = False

         Me.s = s

      End Sub

   End Class

End Namespace
using System;

namespace PerformanceLibrary
{
   class InitializeUnnecessarily
   {
      bool b1;
      bool b2;
      int i;
      double d;
      string s;

      InitializeUnnecessarily()
      {
         b1 = true;

         // The following field assignments are violations of this rule.
         b2 = false;
         i = 0;
         d = 0;
         s = null;
      }

      InitializeUnnecessarily(string s) : this()
      {
         // Exclude the warning for the following statement.
         b1 = false;

         this.s = s;
      }
   }
}

Vea también

Otros recursos

Tabla de valores predeterminados (Referencia de C#)