Не делайте лишних инициализаций
Обновлен: Ноябрь 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;
}
}
}