다음을 통해 공유


CA1812: 인스턴스화되지 않은 내부 클래스를 사용하지 마십시오.

TypeName

AvoidUninstantiatedInternalClasses

CheckId

CA1812

범주

Microsoft.Performance

변경 수준

주요 변경 아님

원인

어셈블리 수준 형식의 인스턴스가 어셈블리에서 코드에 의해 만들어지지 않습니다.

규칙 설명

이 규칙에서는 형식의 생성자 중 하나에 대한 호출을 찾으려고 시도하고 호출을 찾을 수 없으면 위반을 보고합니다.

다음 형식은 이 규칙에서 검사하지 않습니다.

  • 값 형식

  • 추상 형식

  • 열거형

  • 대리자

  • 컴파일러에서 내보낸 배열 형식

  • 인스턴스화할 수 없으며 static(Visual Basic에서는 Shared) 메서드만 정의하는 형식입니다.

분석 중인 어셈블리에 System.Runtime.CompilerServices.InternalsVisibleToAttribute를 적용할 경우, 다른 friend 어셈블리에서 필드를 사용하고 있는지 여부를 알 수 없으므로 internal로 표시된 생성자에 대해서는 이 규칙이 실행되지 않습니다.

Visual Studio 코드 분석에서 이 제한을 해결할 수 없더라도 모든 friend 어셈블리가 분석에 포함되어 있으면 내부 생성자에 대해 외부 독립 실행형 FxCop가 실행됩니다.

위반 문제를 해결하는 방법

이 규칙 위반 문제를 해결하려면 형식을 제거하거나 해당 형식을 사용하는 코드를 추가합니다. 형식에 정적 메서드만 포함된 경우 다음 중 하나를 형식에 추가하여 컴파일러에서 기본 public 인스턴스 생성자를 내보내지 않도록 합니다.

  • .NET Framework 버전 1.0 및 1.1을 대상으로 하는 형식의 private 생성자

  • .NET Framework 2.0을 대상으로 하는 형식의 static(Visual Basic에서는 Shared) 한정자입니다.

경고를 표시하지 않는 경우

이 규칙에서는 경고를 표시하지 않아도 안전합니다. 다음과 같은 경우에는 이 경고를 표시하지 않는 것이 좋습니다.

  • 클래스가 런타임에 바인딩된 리플렉션 메서드를 통해 만들어진 경우(예: CreateInstance)

  • 런타임 또는 ASP.NET에서 자동으로 클래스를 만든 경우(예: System.Configuration.IConfigurationSectionHandler 또는 System.Web.IHttpHandler를 구현하는 클래스)

  • 클래스가 새 제약 조건이 있는 제네릭 형식 매개 변수로 전달된 경우. 예를 들어 다음 예제에서는 이 규칙을 실행합니다.

    internal class MyClass
    {   
        public DoSomething()   
        {
        }
    } 
    public class MyGeneric<T> where T : new()
    {
        public T Create()
        {
            return new T();   
        }
    }
    // [...] 
    MyGeneric<MyClass> mc = new MyGeneric<MyClass>();
    mc.Create();
    

이러한 경우 이 경고를 표시하지 않는 것이 좋습니다.

관련 규칙

CA1811: 호출되지 않는 전용 코드를 사용하지 마십시오.

CA1801: 사용되지 않은 매개 변수를 검토하십시오.

CA1804: 사용되지 않는 로컬 항목을 제거하십시오.