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;
}
}
}