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: 호출되지 않는 전용 코드를 사용하지 마십시오.