다음을 통해 공유


불필요한 초기화를 수행하지 마십시오.

업데이트: 2007년 11월

TypeName

DoNotInitializeUnnecessarily

CheckId

CA1805

범주

Microsoft.Performance

변경 수준

주요 변경 아님

원인

정적 또는 인스턴스 생성자가 필드를 기본값으로 초기화합니다. 이 규칙은 Managed C++ 어셈블리는 무시합니다.

규칙 설명

공용 언어 런타임에서는 생성자를 실행하기 전에 모든 필드를 기본값으로 초기화합니다. 대부분의 경우 생성자에서 필드를 기본값으로 초기화하는 작업은 중복되므로 성능이 저하되고 유지 관리 비용이 늘어납니다. 중복되지 않는 경우는 생성자가 같은 클래스의 다른 생성자나 기본 클래스 생성자를 호출하고 해당 생성자가 필드를 기본값 이외의 다른 값으로 초기화할 경우입니다. 이 경우 필드 값을 다시 기본값으로 다시 변경하는 것이 적합할 수 있습니다.

위반 문제를 해결하는 방법

이 규칙 위반 문제를 해결하려면 생성자에서 필드 초기화를 제거합니다. .NET Framework 2.0에 포함된 C# 컴파일러는 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# 참조)