Microsoft 기본 디자인 지침 규칙 코드 분석 규칙 집합

Microsoft 기본 디자인 지침 규칙이라는 규칙 집합을 사용하면 코드를 보다 쉽게 이해하고 사용할 수 있게 만드는 데 초점을 맞출 수 있습니다. 프로젝트에 라이브러리 코드가 있거나 유지 관리하기 쉬운 코드를 만들기 위해 모범 사례를 적용하려는 경우 이 규칙 집합을 포함해야 합니다.

기본 디자인 지침 규칙에는 Microsoft 최소 권장 규칙이라는 규칙 집합의 규칙이 모두 포함됩니다. 최소 규칙의 목록을 보려면 Microsoft 최소 권장 규칙 코드 분석 규칙 집합을 참조하십시오.

다음 표에서는 Microsoft 기본 디자인 지침 규칙 집합의 모든 규칙에 대해 설명합니다.

규칙

설명

CA1000: 정적 멤버를 제네릭 형식으로 선언하지 마십시오.

제네릭 형식의 정적 멤버를 호출할 때는 형식에 형식 인수를 지정해야 합니다. 유추를 지원하지 않는 제네릭 인스턴스 멤버를 호출할 때는 멤버에 형식 인수를 지정해야 합니다. 이 두 가지 경우에 형식 인수를 지정하기 위한 구문은 서로 다르며 혼동되기 쉽습니다.

CA1002: 제네릭 목록을 노출하지 마십시오.

System.Collections.Generic.List<(Of <(T>)>)는 상속이 아니라 성능을 위해 디자인된 제네릭 컬렉션입니다. 따라서 List에는 가상 멤버가 포함되지 않습니다. 상속을 위해 디자인된 제네릭 컬렉션이 대신 노출되어야 합니다.

CA1003: 제네릭 이벤트 처리기 인스턴스를 사용하십시오.

void를 반환하며 해당 시그니처에 두 개의 매개 변수(첫 번째는 개체, 두 번째는 EventArgs에 할당될 수 있는 형식)를 포함하는 대리자가 형식에 포함되어 있고, 포함 어셈블리가 .NET Framework 2.0을 대상으로 합니다.

CA1004: 제네릭 메서드는 형식 매개 변수를 제공해야 합니다.

제네릭 메서드의 형식 인수가 형식 인수를 명시적으로 지정하는 대신 메서드로 전달된 인수의 형식에 따라 결정되는 방식을 유추라고 합니다. 유추를 사용하려면 제네릭 메서드의 매개 변수 시그니처에 메서드에 대한 형식 매개 변수와 같은 형식의 매개 변수가 포함되어야 합니다. 이 경우 형식 인수는 지정할 필요가 없습니다. 모든 형식 매개 변수에 대해 유추를 사용하는 경우 제네릭과 제네릭이 아닌 인스턴스 메서드를 호출하는 구문은 동일합니다. 따라서 제네릭 메서드를 사용하기가 간편해집니다.

CA1005: 제네릭 형식에 매개 변수를 너무 많이 사용하지 마십시오.

제네릭 형식에 포함된 형식 매개 변수가 많을수록 각 형식 매개 변수가 무엇을 나타내는지를 파악하거나 기억하기가 더 어렵습니다. 보통은 List<T>에서처럼 하나의 형식 매개 변수를 사용하고 일부 경우에는 Dictionary<TKey, TValue>에서처럼 두 개의 형식 매개 변수를 사용합니다. 그러나 형식 매개 변수가 세 개 이상이면 대부분의 사용자가 사용하기에 너무 어렵습니다.

CA1006: 멤버 시그니처에 제네릭 형식을 중첩하지 마십시오.

중첩된 형식 인수는 제네릭 형식의 인수입니다. 시그너처에 중첩된 형식 인수가 포함되어 있는 멤버를 호출하려면 제네릭 형식 하나를 인스턴스화하고 이 형식을 두 번째 제네릭 형식의 생성자에 전달해야 합니다. 이 경우 복잡한 프로시저와 구문이 필요하므로 이 방법을 피해야 합니다.

CA1007: 적합한 제네릭을 사용하십시오.

외부에서 볼 수 있는 메서드에 System.Object 형식의 참조 매개 변수가 포함되어 있습니다. 제네릭 메서드를 사용하면 제약 조건에 따라 형식을 참조 매개 변수 형식으로 먼저 캐스팅하지 않고도 모든 형식을 메서드에 전달할 수 있습니다.

CA1008: 열거형에는 0 값이 있어야 합니다.

초기화되지 않은 열거형의 기본값은 다른 값 형식과 마찬가지로 0입니다. 플래그 특성을 사용하지 않는 열거형에서는 기본값이 열거형의 유효한 값이 되도록 값이 0인 멤버를 정의해야 합니다. FlagsAttribute 특성이 적용된 열거형에서 0 값을 가진 멤버를 정의하는 경우에는 열거형에 값이 설정되지 않았음을 나타낼 수 있도록 해당 멤버 이름이 "None"이어야 합니다.

CA1010: 컬렉션은 제네릭 인터페이스를 구현해야 합니다.

컬렉션의 유용성을 높이려면 제네릭 컬렉션 인터페이스 중 하나를 구현합니다. 그러면 컬렉션을 사용하여 제네릭 컬렉션 형식을 채울 수 있습니다.

CA1011: 기본 형식을 매개 변수로 전달해 보십시오.

기본 형식이 메서드 선언의 매개 변수로 지정된 경우 기본 형식에서 파생된 모든 형식을 해당 인수로 메서드에 전달할 수 있습니다. 파생된 매개 변수 형식에서 제공하는 추가 기능이 필요하지 않은 경우 기본 형식을 사용하면 메서드를 보다 광범위하게 사용할 수 있습니다.

CA1012: 추상 형식에는 생성자를 사용하면 안 됩니다.

추상 형식에 대한 생성자는 파생된 형식에서만 호출할 수 있습니다. public 생성자에서 형식의 인스턴스를 만들고 사용자는 추상 형식의 인스턴스를 만들 수 없기 때문에 public 생성자가 있는 추상 형식은 잘못 디자인된 것입니다.

CA1013: 더하기 및 빼기를 오버로드할 때 같음 연산자를 오버로드하십시오.

public 또는 protected 형식이 같음 연산자를 구현하지 않고 더하기 또는 빼기 연산자를 구현합니다.

CA1014: CLSCompliantAttribute로 어셈블리 표시

CLS(공용 언어 사양)는 어셈블리가 여러 프로그래밍 언어에 사용될 경우 준수해야 하는 명명 제한, 데이터 형식 및 규칙을 정의합니다. 모든 어셈블리에는 CLSCompliantAttribute를 통해 CLS 규격을 명시적으로 나타내는 것이 좋습니다. 어셈블리에 이 특성이 없으면 해당 어셈블리는 규격을 따르지 않습니다.

CA1017: ComVisibleAttribute로 어셈블리 표시

ComVisibleAttribute는 COM 클라이언트에서 관리 코드에 액세스하는 방식을 결정합니다. 어셈블리에서 COM에 노출할지 여부를 명시적으로 나타내는 것이 좋은 디자인입니다. 전체 어셈블리에 대해 COM 노출 여부를 설정한 다음 개별 형식 및 형식 멤버에 대해 이를 재정의할 수 있습니다. 이 특성이 없으면 COM 클라이언트에서 어셈블리의 내용을 볼 수 있습니다.

CA1018: 특성을 AttributeUsageAttribute로 표시하십시오.

사용자 지정 특성을 정의할 때는 해당 특성을 AttributeUsageAttribute로 표시하여 사용자 지정 특성을 적용할 수 있는 소스 코드의 위치를 나타냅니다. 특성의 의미 및 용도에 따라 코드에서의 유효한 위치가 결정됩니다.

CA1019: 특성 인수의 접근자를 정의하십시오.

특성에서는 대상에 특성을 적용할 때 지정해야 하는 필수 인수를 정의할 수 있습니다. 이러한 인수는 특성 생성자에 위치 매개 변수로 제공되기 때문에 이러한 인수를 위치 인수라고도 합니다. 모든 필수 인수에 대해 특성은 실행 시간에 인수의 값을 검색할 수 있도록 해당하는 읽기 전용 속성도 제공해야 합니다. 특성에서는 명명된 인수라고 하는 선택적 인수도 정의할 수 있습니다. 이들 인수는 이름으로 특성 생성자에 제공되며 해당하는 읽기/쓰기 특성이 있어야 합니다.

CA1023: 다차원 인덱서는 사용하지 마십시오.

인덱서, 즉 인덱싱된 속성은 단일 인덱스를 사용해야 합니다. 다차원 인덱서를 사용하면 라이브러리의 유용성이 현저히 줄어들 수 있습니다.

CA1024: 적합한 속성을 사용하십시오.

public 또는 protected 메서드가 "Get"으로 시작하는 이름을 사용하고, 매개 변수를 사용하지 않으며, 배열이 아닌 값을 반환합니다. 이 메서드는 속성이 될 수 있는 좋은 예일 수 있습니다.

CA1025: 반복 인수를 매개 변수 배열로 바꾸십시오.

인수의 정확한 개수를 알 수 없는데 가변 인수가 같은 형식이거나 같은 형식으로서 전달될 수 있는 경우에는 반복되는 인수 대신 매개 변수 배열을 사용합니다.

CA1026: 기본 매개 변수를 사용하면 안 됩니다.

CLS(공용 언어 사양)에서는 기본 매개 변수를 사용하는 메서드를 허용하지만 컴파일러가 이들 매개 변수에 할당된 값을 무시할 수 있도록 허용합니다. 여러 프로그래밍 언어에서 원하는 동작을 유지하려면 기본 매개 변수를 사용하는 메서드를 기본 매개 변수를 제공하는 메서드 오버로드로 바꿔야 합니다.

CA1027: 열거형을 FlagsAttribute로 표시하십시오.

열거형은 서로 관련 있는 명명된 상수 집합을 정의하는 값 형식입니다. 명명된 상수를 의미 있게 조합할 수 있는 경우 열거형에 FlagsAttribute를 적용합니다.

CA1028: 열거형 저장소는 Int32여야 합니다.

열거형은 서로 관련 있는 명명된 상수 집합을 정의하는 값 형식입니다. 기본적으로 System.Int32 데이터 형식은 상수 값을 저장하는 데 사용됩니다. 이 내부 형식을 변경할 수 있지만 대부분의 시나리오에서는 변경이 필요하지 않거나 권장되지 않습니다.

CA1030: 적절한 경우 이벤트를 사용하십시오.

이 규칙에서는 보통 이벤트에 사용되는 이름을 갖는 메서드를 찾아냅니다. 명확하게 정의된 상태 변경에 대한 응답으로 메서드를 호출할 경우 이 메서드는 이벤트 처리기에서 호출해야 합니다. 메서드를 호출하는 개체는 메서드를 직접 호출하는 대신 이벤트를 발생시켜야 합니다.

CA1031: 일반적인 예외 형식을 catch하지 마십시오.

일반 예외는 catch하면 안 됩니다. 보다 구체적인 예외를 catch하거나, 일반적인 예외를 catch 블록의 마지막 문으로 다시 throw해야 합니다.

CA1032: 표준 예외 생성자를 구현하십시오.

이들 생성자 집합을 전부 제공하지 못하면 예외를 제대로 처리하기 어려울 수 있습니다.

CA1034: 중첩 형식은 노출하지 마십시오.

중첩 형식은 다른 형식의 범위 내에 선언된 형식입니다. 중첩 형식은 포함하는 형식의 private 구현 정보를 캡슐화하는 데 유용합니다. 이 용도로 사용할 경우 중첩 형식은 외부에 노출되면 안 됩니다.

CA1035: ICollection 구현에 강력한 형식의 멤버가 있습니다.

이 규칙에서는 사용자가 인터페이스에서 제공하는 기능을 사용할 때 인수를 Object 형식으로 캐스팅할 필요가 없도록 ICollection 구현에서 강력한 형식의 멤버를 제공할 것을 요구합니다. 이 규칙에서는 ICollection을 구현하는 형식이 이를 수행하여 Object보다 강력한 형식의 인스턴스 컬렉션을 관리한다고 가정합니다.

CA1036: 비교 가능한 형식에 메서드를 재정의하십시오.

public 또는 protected 형식이 System.IComparable 인터페이스를 구현합니다. 이 형식은 Object.Equals를 재정의하지 않으며 같음, 같지 않음, 보다 작음 또는 보다 큼에 대한 언어별 연산자를 오버로드하지 않습니다.

CA1038: 열거자는 강력한 형식이어야 합니다.

이 규칙에서는 사용자가 인터페이스에서 제공하는 기능을 사용할 때 반환 값을 강력한 형식으로 캐스팅할 필요가 없도록 IEnumerator 구현에서 Current 속성의 강력한 형식 버전도 제공할 것을 요구합니다.

CA1039: 목록은 강력한 형식이어야 합니다.

이 규칙에서는 사용자가 인터페이스에서 제공하는 기능을 사용할 때 인수를 System.Object 형식으로 캐스팅할 필요가 없도록 IList 구현에서 강력한 형식의 멤버를 제공할 것을 요구합니다.

CA1041: ObsoleteAttribute 메시지를 제공하십시오.

형식 또는 멤버가 ObsoleteAttribute.Message 속성이 지정되지 않은 System.ObsoleteAttribute 특성으로 표시되어 있습니다. ObsoleteAttribute로 표시된 형식 또는 멤버를 컴파일하면 해당 특성의 Message 속성이 표시되어 사용되지 않는 형식 또는 멤버에 대한 정보가 사용자에게 제공됩니다.

CA1043: 인덱서에 정수 또는 문자열 인수를 사용하십시오.

인덱서, 즉 인덱싱된 속성은 인덱스에 정수 계열 형식이나 문자열 형식을 사용해야 합니다. 이러한 형식은 대개 데이터 구조를 인덱싱하는 데 사용되며 라이브러리의 유용성을 증가시킵니다. Object 형식은 디자인 타임에 특정 정수 계열 형식이나 문자열 형식을 지정할 수 없는 경우에만 제한적으로 사용해야 합니다.

CA1044: 속성은 쓰기 전용이면 안 됩니다.

읽기 전용 속성을 사용하는 것은 가능하고 종종 필요하기도 하지만 쓰기 전용 속성의 사용은 금지되어 있습니다. 사용자에게 값을 설정하도록 허용한 다음 해당 값을 볼 수 없도록 하면 보안상 문제가 있기 때문입니다. 또한 읽기 권한이 없으면 공유 개체의 상태를 볼 수 없으므로 사용하는 데 제한을 받습니다.

CA1046: 참조 형식에 같음 연산자를 오버로드하지 마십시오.

참조 형식의 경우 같음 연산자의 기본 구현은 대부분 항상 올바릅니다. 기본적으로 두 참조는 같은 개체를 가리킬 경우에만 같습니다.

CA1047: protected 멤버를 sealed 형식으로 선언하지 마십시오.

형식에서는 상속하는 형식에서 멤버에 액세스하거나 멤버를 재정의할 수 있도록 하기 위해 protected 멤버를 선언합니다. 정의에 따라 sealed 형식은 상속할 수 없으므로 sealed 형식에 대해 protected 메서드를 호출할 수 없습니다.

CA1048: 가상 멤버를 sealed 형식으로 선언하지 마십시오.

상속 형식이 가상 메서드의 구현을 재정의할 수 있도록 하기 위해 형식은 메서드를 가상으로 선언합니다. 정의에 따라 sealed 형식은 상속할 수 없습니다. 따라서 sealed 형식에 대한 가상 메서드는 의미가 없습니다.

CA1050: 네임스페이스에 형식을 선언하십시오.

이름 충돌을 방지하고 관련된 형식을 개체 계층 구조로 구성하기 위해 형식은 네임스페이스 안에 선언됩니다.

CA1051: 표시되는 인스턴스 필드를 선언하지 마십시오.

필드의 주된 용도는 구현을 세부적으로 설명하는 것입니다. 필드는 private 또는 internal이어야 하고 속성을 통해 노출되어야 합니다.

CA1052: 정적 소유자 형식은 sealed여야 합니다.

public 또는 protected 형식이 정적 멤버만 포함하며 sealed(C# 참조)(NotInheritable) 한정자로 선언되지 않았습니다. 상속을 고려하지 않은 형식은 sealed 한정자로 표시하여 기본 형식으로 사용되지 않도록 해야 합니다.

CA1053: 정적 소유자 형식에는 생성자를 사용하면 안 됩니다.

public 또는 중첩된 public 형식에서 정적 멤버만 선언하며 public 또는 protected 기본 생성자를 사용합니다. 호출하는 정적 멤버에 형식의 인스턴스가 필요하지 않기 때문에 생성자가 필요 없습니다. 문자열 오버로드는 안전과 보안을 위해 문자열 인수를 사용하여 URI 오버로드를 호출해야 합니다.

CA1054: URI 매개 변수는 문자열이면 안 됩니다.

메서드가 URI의 문자열 표현을 사용하면 URI 클래스의 인스턴스를 사용하는 해당 오버로드를 제공해야 합니다. 이렇게 하면 서비스가 안전한 방식으로 제공됩니다.

CA1055: URI 반환 값은 문자열이면 안 됩니다.

이 규칙에서는 메서드가 URI(Uniform Resource Identifier)를 반환한다고 가정합니다. URI의 문자열 표현은 구문 분석 및 인코딩 오류를 발생시키기 쉬우며 보안 문제를 일으킬 수 있습니다. System.Uri 클래스는 이러한 서비스를 안전한 방식으로 제공합니다.

CA1056: URI 속성은 문자열이면 안 됩니다.

이 규칙에서는 속성이 URI(Uniform Resource Identifier)를 나타낸다고 가정합니다. URI의 문자열 표현은 구문 분석 및 인코딩 오류를 발생시키기 쉬우며 보안 문제를 일으킬 수 있습니다. System.Uri 클래스는 이러한 서비스를 안전한 방식으로 제공합니다.

CA1057: 문자열 URI 오버로드는 System.Uri 오버로드를 호출합니다.

형식에서 문자열 매개 변수가 System.Uri 매개 변수로 바뀐 점만 다른 메서드 오버로드를 선언합니다. 문자열 매개 변수를 사용하는 오버로드는 URI 매개 변수를 사용하는 오버로드를 호출하지 않습니다.

CA1058: 형식은 특정 기본 형식을 확장하면 안 됩니다.

외부에서 볼 수 있는 형식이 특정 기본 형식을 확장합니다. 다음 방법 중 하나를 사용합니다.

CA1059: 멤버는 구체적인 특정 형식을 노출하면 안 됩니다.

구체적인 형식은 완전히 구현되었기 때문에 인스턴스화할 수 있는 형식을 말합니다. 멤버를 광범위하게 사용할 수 있도록 하려면 구체적인 형식을 제안된 인터페이스로 바꾸십시오.

CA1064: 예외는 public이어야 합니다.

내부 예외는 내부 범위 내에만 표시됩니다. 예외가 내부 범위 밖에 놓이게 되면 예외를 catch하는 데 기본 예외만 사용할 수 있습니다. T:System.Exception, T:System.SystemException, T:System.ApplicationException에서 내부 예외가 상속되는 경우 외부 코드에는 예외를 사용하여 수행할 수 있는 내용에 대한 충분한 정보가 없게 됩니다.

CA1500: 변수 이름은 필드 이름과 달라야 합니다.

인스턴스 메서드에서 선언 형식의 인스턴스 필드와 이름이 같은 매개 변수나 지역 변수를 선언합니다. 이로 인해 오류가 발생합니다.

CA1502: 지나치게 복잡하게 만들지 마십시오.

이 규칙은 메서드를 통과하는 선형 독립 경로의 수를 측정하며 조건부 분기의 수와 복잡성에 의해 결정됩니다.

CA1708: 식별자에는 대/소문자만 다른 이름을 사용할 수 없습니다.

공용 언어 런타임을 대상으로 하는 언어는 대/소문자를 구분하지 않으므로 네임스페이스, 형식, 멤버 및 매개 변수의 식별자가 대/소문자만 달라서는 안 됩니다.

CA1716: 식별자는 키워드와 달라야 합니다.

네임스페이스 이름 또는 형식 이름이 프로그래밍 언어의 예약된 키워드와 일치합니다. 네임스페이스 및 형식에 대한 식별자는 공용 언어 런타임을 대상으로 하는 언어에서 정의된 키워드와 일치하면 안 됩니다.

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

메서드 시그니처에 메서드 본문에서 사용되지 않는 매개 변수가 있습니다.

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

사용되지 않는 지역 변수와 불필요한 할당으로 어셈블리의 크기가 증가하고 성능이 저하될 수 있습니다.

CA1809: 불필요한 로컬 항목을 사용하지 마십시오.

값을 메모리가 아닌 프로세서 레지스터에 저장하는 방법은 성능 최적화에 많이 사용되는 방법이며 "값의 레지스터 등록"이라고도 합니다. 모든 지역 변수가 레지스터에 등록될 수 있는 가능성을 늘리려면 지역 변수의 개수를 64개로 제한합니다.

CA1810: 참조 형식 정적 필드를 인라인으로 초기화하십시오.

형식이 명시적인 정적 생성자를 선언하면 JIT(Just-in-Time) 컴파일러는 형식의 각 정적 메서드와 인스턴스 생성자에 검사를 추가하여 정적 생성자를 이전에 호출했는지 확인합니다. 정적 생성자 검사로 인해 성능이 저하될 수 있습니다.

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

어셈블리에 전용 또는 내부(어셈블리 수준) 멤버의 호출자가 없고, 공용 언어 런타임에서도 이 멤버를 호출하지 않으며, 대리자에서도 이 멤버를 호출하지 않습니다.

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

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

CA1813: 봉인되지 않은 특성을 사용하지 마십시오.

.NET Framework 클래스 라이브러리는 사용자 지정 특성을 검색하는 메서드를 제공합니다. 기본적으로 이러한 메서드는 특성 상속 계층을 검색합니다. 특성을 봉인하면 상속 계층을 검색하지 않으므로 성능이 향상될 수 있습니다.

CA1814: 다차원 배열보다 가변 배열을 사용하십시오.

가변 배열의 요소에는 배열이 사용됩니다. 요소를 구성하는 배열의 크기는 서로 다를 수 있습니다. 이 경우 일부 데이터 집합에 대한 공간을 절약할 수 있습니다.

CA1815: 값 형식에서 Equals 또는 같음 연산자를 재정의하십시오.

값 형식의 경우 Equals의 상속된 구현에서 Reflection 라이브러리를 사용하며 모든 필드의 내용을 비교합니다. Reflection에는 많은 계산이 요구되며 모든 필드의 일치 여부를 비교하는 것이 불필요할 수 있습니다. 사용자가 인스턴스를 비교 또는 정렬할 것으로 예측되거나 인스턴스를 해시 테이블 키로 사용할 것으로 예측되는 경우에는 값 형식에서 Equals를 구현해야 합니다.

CA1819: 속성은 배열을 반환해서는 안 됩니다.

속성에서 반환된 배열은 속성이 읽기 전용이더라도 쓰기 금지되지 않습니다. 배열을 무단으로 변경하지 못하도록 하려면 속성에서 배열의 복사본을 반환해야 합니다. 일반적으로 사용자는 이러한 속성을 호출할 경우 성능에 부정적인 영향을 준다는 것을 인식하지 못합니다.

CA1820: 문자열 길이를 사용하여 문자열이 비었는지 테스트하십시오.

String.Length 속성이나 String.IsNullOrEmpty 메서드를 사용하여 문자열을 비교하는 것이 Equals를 사용하는 것보다 훨씬 더 빠릅니다.

CA1821: 빈 종료자를 제거하십시오.

개체 수명을 추적할 때에는 추가로 성능 오버헤드가 발생하므로 가능한 경우 종료자를 사용하지 마십시오. 빈 종료자는 아무런 장점 없이 오버헤드만 가중시킵니다.

CA1822: 멤버를 static으로 표시하십시오.

인스턴스 데이터에 액세스하지 않거나 인스턴스 메서드를 호출하지 않는 멤버는 static(Visual Basic의 경우 Shared)으로 표시할 수 있습니다. 메서드를 static으로 표시하면 컴파일러는 이들 멤버에 대한 비가상 호출 사이트를 내보냅니다. 이 경우 성능이 중요한 코드에서 성능이 크게 향상될 수 있습니다.

CA1823: 사용되지 않는 전용 필드를 사용하지 마십시오.

어셈블리에서 액세스되지 않는 것으로 보이는 전용 필드가 발견되었습니다.

CA2201: 예약된 예외 형식을 발생시키지 마십시오.

따라서 원래 오류를 감지하고 디버깅하기 어렵게 됩니다.

CA2205: Win32 API에 있는 동일한 기능의 관리되는 항목을 사용하십시오.

플랫폼 호출 메서드가 정의되었고 이와 동일한 기능을 수행하는 메서드가 .NET Framework 클래스 라이브러리에 있습니다.

CA2208: 인수 예외를 올바르게 인스턴스화하십시오.

ArgumentException 또는 ArgumentException에서 파생된 예외 형식의 기본(매개 변수가 없는) 생성자를 호출했거나, ArgumentException 또는 ArgumentException에서 파생된 예외 형식의 매개 변수가 있는 생성자에 잘못된 문자열 인수가 전달되었습니다.

CA2211: 비상수 필드는 노출되면 안 됩니다.

상수도 아니고 읽기 전용도 아닌 static 필드는 스레드로부터 안전하지 않습니다. 이러한 필드에 대한 액세스는 신중하게 제어해야 하며 클래스 개체에 대한 액세스를 동기화하는 고급 프로그래밍 기술을 필요로 합니다.

CA2217: 열거형을 FlagsAttribute로 표시하지 마십시오.

외부에서 볼 수 있는 열거형이 FlagsAttribute로 표시되어 있고, 2의 거듭제곱 또는 열거형에 정의된 다른 값의 조합이 아닌 값이 하나 이상 들어 있습니다.

CA2219: exception 절에서 예외를 발생시키지 마십시오.

finally 또는 fault 절에서 예외가 발생하는 경우 새 예외가 활성 예외를 숨깁니다. filter 절에서 예외가 발생하는 경우 런타임이 자동으로 예외를 catch합니다. 따라서 원래 오류를 감지하고 디버깅하기 어렵게 됩니다.

CA2221: 종료자는 protected여야 합니다.

종료자에서는 패밀리 액세스 한정자를 사용해야 합니다.

CA2222: 상속된 멤버 노출 수준을 낮추지 마십시오.

상속된 멤버에 대한 액세스 한정자는 변경하면 안 됩니다. 상속된 멤버를 private으로 변경하더라도 호출자가 메서드의 기본 클래스 구현에 액세스하는 것을 막을 수 없습니다.

CA2223: 멤버는 반환 형식 이외의 것도 달라야 합니다.

공용 언어 런타임에서는 반환 값만 다르고 다른 면에서는 동일한 멤버를 구분할 수 있지만 이 기능은 공용 언어 사양에 해당되지 않으며 .NET 프로그래밍 언어의 공통 기능이 아닙니다.

CA2224: 같음 연산자를 오버로드할 때 Equals를 재정의하십시오.

public 형식이 같음 연산자를 구현하지만 Object.Equals를 재정의하지 않습니다.

CA2225: 연산자 오버로드에는 명명된 대체 항목이 있습니다.

연산자 오버로드가 감지되었으며 예상되는 이름의 대체 메서드를 찾을 수 없습니다. 명명된 대체 멤버는 해당 연산자와 동일한 기능에 액세스할 수 있도록 해주며, 오버로드된 연산자가 지원되지 않는 언어로 프로그래밍하는 개발자에게 제공됩니다.

CA2226: 연산자에는 대칭 오버로드가 있어야 합니다.

형식이 같음 연산자 또는 같지 않음 연산자를 구현하면서 그 반대 연산자를 구현하지 않습니다.

CA2227: 컬렉션 속성은 읽기 전용이어야 합니다.

쓰기 가능한 컬렉션 속성을 통해 사용자는 컬렉션을 다른 컬렉션으로 바꿀 수 있습니다. 읽기 전용 속성은 컬렉션을 바꾸지 못하도록 하지만 개별 멤버를 설정하는 것은 여전히 가능합니다.

CA2230: 가변 인수로 params를 사용하십시오.

public 또는 protected 형식에 params 키워드 대신 VarArgs 호출 규칙을 사용하는 public 또는 protected 메서드가 들어 있습니다.

CA2231: ValueType.Equals를 재정의할 때 같음 연산자를 오버로드하십시오.

값 형식이 Object.Equals를 재정의하지만 같음 연산자를 구현하지 않습니다.

CA2234: 문자열 대신 System.Uri 개체를 전달하십시오.

이름에 "uri", "URI", "urn", "URN", "url" 또는 "URL"이 포함된 문자열 매개 변수가 있는 메서드가 호출되었습니다. 메서드의 선언 형식에 System.Uri 매개 변수를 가진 해당 메서드 오버로드가 들어 있습니다.

CA2239: 선택적 필드에 deserialization 메서드를 제공하십시오.

형식에 System.Runtime.Serialization.OptionalFieldAttribute 특성으로 표시된 필드가 있으며 형식에서 deserialization 이벤트 처리 메서드를 제공하지 않습니다.