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