Partager via


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

Voir aussi

Autres ressources

Tableau des valeurs par défaut (Référence C#)