Поделиться через


Не делайте лишних инициализаций

Обновлен: Ноябрь 2007

TypeName

DoNotInitializeUnnecessarily

CheckId

CA1805

Категория

Microsoft.Performance

Критическое изменение

Не критическое

Причина

Статический конструктор или конструктор экземпляров инициализирует поле, присваивая ему значение по умолчанию. Данное правило пропускает управляемые сборки C++.

Описание правила

Перед запуском конструктора среда CLR инициализирует все поля их значениями по умолчанию. В большинстве случаев инициализация поля его значением по умолчанию в конструкторе является избыточным, что снижает производительность и увеличивает расходы на поддержку. Подобная операция может не являться избыточной только в том случае, если конструктор вызывает другой конструктор того же класса или конструктор базового класса и последний конструктор инициализирует поле значением, не заданным по умолчанию. В этом случае повторное присвоение полю значения по умолчанию может быть оправданным.

Предотвращение нарушений

Чтобы устранить нарушение данного правила, удалите инициализацию поля из конструктора. Обратите внимание, что компилятор C#, который поставляется вместе с .NET Framework 2.0, удаляет все ненужные инициализации при компиляции с параметром optimize.

Можно также преобразовать инициализацию поля в подтверждение, как показано ниже:

Debug.Assert(field == 0); 

Это не нарушает правило, но, тем не менее, ясно показывает программистам, работающим с данным кодом, что поле уже инициализировано. Этот способ представляет более знакомую модель для программистов, которые привыкли работать с несколькими языками.

Отключение предупреждений

Предупреждения о нарушении этого правила можно отключить в том случае, если конструктор вызывает другой конструктор того же класса или конструктор базового класса, инициализирующий поле значением, не установленным по умолчанию. Кроме того, если производительность и удобство поддержки не входят в число основных приоритетов для кода, временное или окончательное отключение такого рода предупреждений будет совершенно безопасно.

Пример

В следующем примере показан тип, содержащий несколько нарушений данного правила.

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

См. также

Другие ресурсы

Таблица значений по умолчанию (Справочник по C#)