Sdílet prostřednictvím


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

Siehe auch

Weitere Ressourcen

Tabelle für Standardwerte (C#-Referenz)