Keine unnötige Initialisierung
Aktualisiert: November 2007
TypeName |
DoNotInitializeUnnecessarily |
CheckId |
CA1805 |
Kategorie |
Microsoft.Performance |
Unterbrechende Änderung |
Nicht unterbrechend |
Ursache
Ein statischer Konstruktor oder ein Instanzenkonstruktor initialisiert ein Feld mit dessen Standardwert. Verwaltete C++-Assemblys werden bei der Überprüfung dieser Regel ignoriert.
Regelbeschreibung
Die Common Language Runtime initialisiert alle Felder mit ihren Standardwerten, bevor der Konstruktor ausgeführt wird. In den meisten Fällen ist die Initialisierung eines Feld mit seinem Standardwert in einem Konstruktor redundant. Dies würde nur zu Leistungseinbußen führen und den Wartungsaufwand erhöhen. Ein Fall, in dem dies nicht redundant ist, ergibt sich, wenn der Konstruktor einen anderen Konstruktor derselben Klasse oder einen Basisklassenkonstruktor aufruft und dieser Konstruktor das Feld mit einem anderen Wert als dem Standardwert initialisiert. In diesem Fall kann es sinnvoll sein, den Wert des Felds wieder in seinen Standardwert zu ändern.
Behandlung von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, entfernen Sie die Feldinitialisierung aus dem Konstruktor. Beachten Sie, dass der C#-Compiler (gehört zum Lieferumfang von .NET Framework 2.0) diese unnötigen Initialisierungen entfernt, wenn die Option optimize aktiviert ist.
Sie können die Feldinitialisierung auch in eine Assertion konvertieren, wie unten dargestellt:
Debug.Assert(field == 0);
Dadurch wird einerseits die Regel eingehalten und dem Programmierer, der mit dem Code arbeitet, andererseits deutlich gemacht, dass das Feld bereits initialisiert ist. Dieses Modell ist Programmierern, die es gewöhnt sind, in mehreren Sprachen zu arbeiten, wesentlich vertrauter.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie eine Warnung dieser Regel, wenn der Konstruktor einen anderen Konstruktor derselben Klasse oder der Basisklasse aufruft, die das Feld mit einem anderen Wert als dem Standardwert initialisiert. Eine Warnung dieser Regel kann ebenso gefahrlos unterdrückt werden, bzw. die Regel kann vollständig deaktiviert werden, wenn das Leistungsverhalten und die Codepflege nicht von Belang sind.
Beispiel
Im folgenden Beispiel wird ein Typ veranschaulicht, der mehrfach gegen eine Regel verstößt.
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;
}
}
}