N'initialisez pas inutilement
Mise à jour : novembre 2007
TypeName |
DoNotInitializeUnnecessarily |
CheckId |
CA1805 |
Catégorie |
Microsoft.Performance |
Modification avec rupture |
Modification sans rupture |
Cause
Un constructeur d'instance ou statique initialise un champ à sa valeur par défaut. Cette règle ignore les assemblés C++ managés.
Description de la règle
Le Commons Langage Runge initialise tous les champs à leurs valeurs par défaut avant d'exécuter le constructeur. Dans la plupart des cas, initialiser un champ à sa valeur par défaut dans un constructeur constitue un processus redondant qui fait baisser les performances et contribue à la hausse des coûts de maintenance. Le processus n'est pas redondant dans un seul cas : lorsque le constructeur appelle un autre constructeur de la même classe ou un constructeur de classe de base, et lorsque ce constructeur initialise le champ à une valeur non définie par défaut. Dans ce cas, rétablir la valeur par défaut du champ peut s'avérer approprié.
Comment corriger les violations
Pour corriger une violation de cette règle, supprimez l'initialisation de champ du constructeur. Remarquez que le compilateur C# intégré au .NET Framework 2.0 supprime ces initialisations inutiles lorsque l'option optimize est activée.
Vous peut également convertir l'initialisation de champ en une assertion, comme indiqué ci-dessous :
Debug.Assert(field == 0);
La règle est respectée et les programmeurs qui utilisent le code sont informés que le champ est déjà initialisé. Il s'agit d'un modèle plus familier pour les programmeurs habitués à utiliser plusieurs langages.
Quand supprimer les avertissements
Supprimez un avertissement de cette règle si le constructeur appelle un autre constructeur de la classe même ou de la classe de base qui initialise le champ à une valeur non définie par défaut. Par mesure de sécurité, il est également recommandé de supprimer un avertissement de cette règle, voire de désactiver complètement la règle, si les performances et la maintenance du code ne constituent pas des priorités.
Exemple
L'exemple suivant présente un type qui contient plusieurs violations de la règle.
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;
}
}
}