Condividi tramite


Non inizializzare inutilmente

Aggiornamento: novembre 2007

TypeName

DoNotInitializeUnnecessarily

CheckId

CA1805

Category

Microsoft.Performance

Breaking Change

Non sostanziale

Causa

Un costruttore statico o di istanza inizializza un campo sul valore predefinito. Questa regola ignora gli assembly C++ gestiti.

Descrizione della regola

In Common Language Runtime vengono inizializzati tutti i campi sui valori predefiniti prima di eseguire il costruttore. Nella maggior parte dei casi, l'inizializzazione di un campo sul valore predefinito in un costruttore è ridondante; ne conseguono un calo delle prestazioni e un aumento dei costi di manutenzione. Un caso in cui tale operazione non è ridondante si verifica quando il costruttore chiama un altro costruttore della stessa classe o un costruttore della classe base e tale costruttore inizializza il campo su un valore non predefinito. In questo caso, può essere appropriato modificare nuovamente il valore del campo sul relativo valore predefinito.

Correzione di violazioni

Per correggere una violazione di questa regola, rimuovere l'inizializzazione del campo dal costruttore. Si noti che il compilatore C# incluso con .NET Framework 2.0 rimuove queste inizializzazioni non necessarie quando l'opzione optimize è attivata.

È anche possibile convertire l'inizializzazione del campo in un'asserzione come illustrato di seguito:

Debug.Assert(field == 0); 

Tale operazione sarà conforme alla regola e indicherà chiaramente ai programmatori che lavorano con il codice che il campo è già inizializzato. Il modello che rappresenta risulterà più familiare ai programmatori che sono abituati a utilizzare più linguaggi.

Esclusione di avvisi

Escludere un avviso da questa regola se il costruttore chiama un altro costruttore nella stessa classe o nella classe base che inizializza il campo su un valore non predefinito. L'esclusione di un avviso da questa regola o la disattivazione dell'intera regola è sicura anche se le prestazioni e la manutenzione del codice non sono priorità.

Esempio

Nell'esempio riportato di seguito viene illustrato un tipo che contiene più violazioni della regola.

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

Vedere anche

Altre risorse

Tabella dei valori predefiniti (Riferimenti per C#)