코드를 만들 때 팀과 공동 작업하는 경우 경고가 적용되지 않음을 나타내는 것이 유용한 경우가 많습니다. 코드 분석 위반을 표시하지 않는 것은 팀 구성원에게 코드를 검토했음을 나타내며 경고를 표시하지 않을 수 있습니다. 다음 섹션에서는 Visual Studio IDE를 사용하여 코드 분석 위반을 억제하는 다양한 방법을 설명합니다.
EditorConfig 파일을 사용하여 위반을 억제합니다.
솔루션 또는 프로젝트에 대한 EditorConfig 파일에서 구성하려는 각 규칙에 대한 항목을 추가하고 심각도를 none
.로 설정합니다. 예: dotnet_diagnostic.CA1822.severity = none
. 자세한 내용은 EditorConfig 파일에서 규칙 심각도 수동 구성을 참조하세요. EditorConfig 파일을 추가하려면 프로젝트에 EditorConfig 파일 추가를 참조하세요.
소스 코드에서 위반 사항 숨기기
전처리기 지시문을 사용하여 소스 코드의 특정 코드 줄에 대한 위반을 억제할 수 있습니다.
- C#: #pragma 경고
- Visual Basic: 경고 사용 안 함
또는 SuppressMessageAttribute 특성을 사용하여 C# 및 Visual Basic 코드에서 경고를 표시하지 않을 수 있습니다.
코드 편집기를 사용하여 위반 사항을 억제하기
코드 편집기를 사용하여 위반을 억제하려면 다음 단계를 따르세요.
위반이 있는 코드 줄에 커서를 놓고 Ctrl+마침표(.) 또는 Alt+Enter 를 눌러 빠른 작업 메뉴를 엽니다.
문제 억제 또는 구성><규칙 번호 억제>를 선택한 다음 원본에서 또는 원본(속성)에서 선택합니다.
원본에서 선택하는 경우 코드에 추가된 전처리기 지시문의 미리 보기가 표시됩니다.
원본(특성)에서 선택하는 경우 코드에 추가된 SuppressMessageAttribute 특성의 미리 보기가 표시됩니다.
오류 목록을 사용하여 위반 숨기기
오류 목록 창을 사용하여 위반을 숨기려면 다음 단계를 따라하십시오.
오류 목록 창에서 표시하지 않을 규칙을 선택합니다.
그런 다음 마우스 오른쪽 버튼을 클릭하고 억제>원본에서를 선택합니다.
변경 내용 미리 보기 대화 상자가 열리고 소스 코드에 추가된 C# #pragma 경고 지시문 또는 Visual Basic #Disable 경고 지시문의 미리 보기가 표시됩니다.
적용을 선택하여 코드 파일에 변경 내용을 저장합니다.
오류 목록에서 빌드 진단 제외
오류 목록 창에 표시 안 함 메뉴 옵션이 표시되지 않으면 라이브 분석이 아닌 빌드에서 위반이 발생할 수 있습니다. 오류 목록 창에는 라이브 코드 분석 및 빌드 모두에서 진단 또는 규칙 위반이 표시됩니다. 예를 들어 위반 문제를 해결하기 위해 코드를 편집했지만 다시 빌드하지 않은 경우 빌드 진단이 부실할 수 있으므로 오류 목록에서 이러한 진단을 항상 표시하지 않을 수는 없습니다.
라이브 분석 또는 IntelliSense의 진단은 항상 현재 원본과 up-to날짜이며 오류 목록에서 항상 표시하지 않을 수 있습니다. 선택 영역에서 빌드 진단을 제외하려면 다음 단계를 수행합니다.
오류 목록 원본 필터 드롭다운 목록에서 선택을 Build + IntelliSense에서 IntelliSense Only로 변경합니다.
표시하지 않으려는 진단을 선택하고 앞에서 설명한 대로 계속 진행합니다.
전역 억제 파일을 사용하여 위반 억제
전역 억제 파일은 SuppressMessageAttribute 특성을 사용하여 코드 위반을 억제합니다.
코드 편집기에서 전역 억제 파일 사용
코드를 사용하여 전역 억제 파일로 위반을 억제하려면 다음 단계를 따르십시오.
코드 편집기에서 위반이 있는 코드 줄에 커서를 놓고 Ctrl+Period(.) 또는 Alt+Enter 를 눌러 빠른 작업 메뉴를 엽니다.
규칙 번호 억제 <을> 선택한 다음 억제 파일에서 선택합니다.
Visual Studio는 새 글로벌 억제 파일이 포함된 탭을 코드 편집기에서 만듭니다.
오류 목록에서 전역 오류 억제 파일 사용
오류 목록 창을 사용하여 전역 억제 파일로 위반을 억제하려면 다음 단계를 따르세요.
오류 목록 창에서 표시하지 않을 규칙을 선택합니다.
마우스 오른쪽 단추를 클릭한 다음,표시 안 함 파일에서 표시 안> 을 선택합니다.
변경 내용 미리 보기 대화 상자가 열리고 전역 억제 파일에 추가된 SuppressMessageAttribute 특성의 미리 보기가 표시됩니다.
적용을 선택하여 글로벌 억제 파일을 저장하십시오.
모든 현재 위반 억제
현재 위반 사항을 모두 무시하는 것을 때때로 베이스라이닝이라고 합니다. 솔루션 또는 프로젝트에서 모든 현재 위반을 억제하려면, 다음 단계를 따르십시오.
Visual Studio 메뉴 모음에서 분석>을 선택하고 빌드 및 활성 문제 억제를 실행합니다.
전체 솔루션의 위반을 억제하려면 For solution을 선택하고, 프로젝트에 대한 위반만 억제하려면 For <프로젝트 이름>을 선택합니다.
프로젝트 설정을 사용하여 위반 억제
솔루션 탐색기 프로젝트 설정을 사용하여 위반을 방지하려면 다음 단계를 수행합니다.
솔루션 탐색기에서 프로젝트를 선택합니다.
마우스 오른쪽 단추를 클릭한 다음 속성을 선택합니다(또는 Alt + Enter를 누릅니다).
속성 창에서 왼쪽에서 코드 분석을 선택하고, 생성된 코드에서 결과 표시 안 함 옵션을 해제합니다.
규칙 집합을 사용하여 위반을 억제함
규칙 집합 편집기에서 해당 이름 옆에 있는 확인란의 선택을 취소하거나 작업을없음으로 설정합니다.
원본 내 비활성화 및 SuppressMessageAttribute 속성
ISS(원본 내 억제)는 SuppressMessageAttribute 속성을 사용하여 경고를 억제합니다. 경고를 생성한 SuppressMessageAttribute
코드 세그먼트 근처의 소스 파일에 특성을 추가할 수 있습니다.
코드 편집기에서 특성을 수동으로 입력하거나 다음과 같이 특성을 자동으로 추가할 수 있습니다.
코드 편집기에서 위반이 있는 코드 줄에 커서를 놓고 Ctrl+Period(.) 또는 Alt+Enter 를 눌러 빠른 작업 메뉴를 엽니다.
빠른 작업 메뉴에서 >규칙 번호<를 표시 안 함 또는 문제 구성을> 선택합니다.
다음 단계 중 하나를 수행합니다.
원본(특성)에서 선택합니다.
Visual Studio는 코드에
SuppressMessageAttribute
특성을 추가합니다.억제 파일에서 선택합니다.
Visual Studio는 코드 편집기에서
SuppressMessageAttribute
특성이 포함된 새 전역 억제 파일 탭을 만듭니다.
이 특성은 SuppressMessageAttribute
관리 코드 어셈블리의 메타데이터에 포함된 조건부 특성입니다. 이 특성은 컴파일 기호가 CODE_ANALYSIS
컴파일 시간에 정의된 경우에만 포함됩니다.
C++ 및 CLI 코드에서만 매크로 CA_SUPPRESS_MESSAGE
를 사용하거나 CA_GLOBAL_SUPPRESS_MESSAGE
헤더 파일에서 특성을 추가합니다.
프로젝트를 최신 버전의 Visual Studio로 마이그레이션하는 경우 많은 수의 코드 분석 경고가 표시될 수 있습니다. 경고를 수정할 준비가 되지 않은 경우, 분석>빌드 및 활성 문제 억제를 선택하여 모든 경고를 억제할 수 있습니다.
비고
릴리스 빌드에서 소스 억제 메타데이터가 실수로 포함되지 않도록 소스 억제를 사용하지 마세요.
SuppressMessageAttribute 특성 형식
특성의 SuppressMessageAttribute
형식은 다음과 같습니다.
[Scope:SuppressMessage("Rule Category", "Rule Id", Justification = "Justification", MessageId = "MessageId", Scope = "Scope", Target = "Target")]
특성의 속성은 다음과 같습니다.
Category
: 규칙의 범주입니다. 코드 분석 규칙 범주에 대한 자세한 내용은 코드 품질 규칙을 참조하세요.CheckId:
규칙의 식별자입니다. 지원에는 규칙 식별자에 대한 짧고 긴 이름이 모두 포함됩니다. 짧은 이름은CAXXXX
이고, 긴 이름은CAXXXX:FriendlyTypeName
입니다.Justification
: 메시지를 표시하지 않는 이유를 문서화하는 데 사용되는 텍스트입니다.MessageId
: 각 메시지에 대한 문제의 고유 식별자입니다.Scope
: 경고가 표시되지 않는 대상입니다. 대상이 지정되지 않은 경우 시스템은 해당 대상을 특성의 대상으로 설정합니다. 지원되는 범위는 다음과 같습니다.module
: 이 범위는 어셈블리에 대한 경고를 억제합니다. 전체 프로젝트를 대상으로 하는 전역 억압입니다.resource
: (레거시 FxCop 에만 해당) 이 범위는 모듈(어셈블리)의 일부인 리소스 파일에 기록된 진단 정보의 경고를 표시하지 않습니다. 이 범위는 원본 파일만 분석하는 Roslyn 분석기 진단용 C#/VB 컴파일러에서 읽거나 적용되지 않습니다.type
: 이 범위는 형식에 대한 경고를 억제합니다.member
: 이 범위는 멤버에 대한 경고를 억제합니다.namespace
: 이 범위는 네임스페이스 자체에 대한 경고를 표시하지 않습니다. 네임스페이스 내의 형식에 대한 경고를 표시하지 않습니다.namespaceanddescendants
: (컴파일러 버전 3.x 이상 및 Visual Studio 2019 이상이 필요함) 이 범위는 네임스페이스와 모든 하위 기호의 경고를 표시하지 않습니다. 레거시 분석은 값을 무시합니다namespaceanddescendants
.
Target
: 경고가 표시되지 않는 대상을 지정하는 식별자입니다. 정규화된 구성 요소 이름을 포함해야 합니다.
Visual Studio에서 경고가 표시되면 전역 표시 억제 파일에 억제를 추가하여 SuppressMessageAttribute
의 예제를 볼 수 있습니다. 표시 안 함 특성 및 필수 속성이 미리 보기 창에 표시됩니다.
SuppressMessageAttribute 사용
코드 분석 경고는 SuppressMessageAttribute 특성이 적용된 수준에서 억제됩니다. 예를 들어 어셈블리, 모듈, 형식, 멤버 또는 매개 변수 수준에서 특성을 적용할 수 있습니다. 이 특성을 적용하는 목적은 위반이 발생하는 코드에 표시 안 함 정보를 긴밀하게 결합하는 것입니다.
일반 형태의 표시 안 함에는 규칙 이름에 대한 선택적 사람이 읽을 수 있는 표현을 포함하는 규칙 범주 및 규칙 식별자가 포함됩니다. 다음은 그 예입니다.
[SuppressMessage("Microsoft.Design", "CA1039:ListsAreStrongTyped")]
원본 내 표시 안 함 메타데이터를 최소화하는 엄격한 성능 이유가 있는 경우 규칙 이름을 생략할 수 있습니다. 규칙 범주와 규칙 ID는 충분히 고유한 규칙 식별자를 형성합니다. 다음은 그 예입니다.
[SuppressMessage("Microsoft.Design", "CA1039")]
유지 관리 기능을 위해 규칙 이름을 생략하는 것은 권장되지 않습니다.
메서드 본문 내에서 선택적 위반 억제
제거 특성은 메서드에 적용할 수 있지만 메서드 본문 내에 포함할 수는 없습니다. 메서드에 SuppressMessageAttribute 속성을 추가하면 특정 규칙의 모든 위반이 억제됩니다.
경우에 따라 위반의 특정 인스턴스를 표시하지 않을 수 있습니다. 이후 코드가 코드 분석 규칙에서 자동으로 제외되지 않는 예제를 생각해 보세요. 특정 코드 분석 규칙은 MessageId
속성의 SuppressMessageAttribute
특성을 사용하여 위반의 특정 인스턴스를 억제할 수 있도록 허용합니다. 일반적으로 특정 기호(지역 변수 또는 매개 변수)에 대한 위반에 대한 레거시 규칙은 속성을 준수합니다 MessageId
.
CA1500:VariableNamesShouldNotMatchFieldNames 는 이러한 규칙의 예입니다. 그러나 실행 코드(비 기호)에 대한 위반을 감지하는 레거시 규칙은 MessageId
속성을 준수하지 않습니다. 또한, .NET 컴파일러 플랫폼("Roslyn") 분석기는 MessageId
속성을 존중하지 않습니다.
규칙의 특정 기호 위반을 억제하려면 특성 MessageId
의 속성 SuppressMessageAttribute
에 대해 기호 이름을 지정합니다. 다음 예제에서는 CA1500:VariableNamesShouldNotMatchFieldNames의 두 가지 위반이 있는 코드를 보여 줍니다. 하나는 변수에 대한 name
위반이고 다른 하나는 변수 위반 age
입니다.
age
기호에 대한 위반만 억제됩니다.
public class Animal
{
int age;
string name;
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "age")]
private void PrintInfo()
{
int age = 5;
string name = "Charlie";
Console.WriteLine($"Age {age}, Name {name}");
}
}
전역 수준 억제
관리 코드 분석 도구는 어셈블리, 모듈, 형식, 멤버 또는 매개 변수 수준에서 적용되는 특성을 검사 SuppressMessageAttribute
합니다. 또한 리소스 및 네임스페이스에 대한 위반을 제출합니다. 이러한 위반은 전역 수준에서 적용되어야 하며 범위가 지정되고 대상으로 지정됩니다. 예를 들어, 다음 메시지는 네임스페이스 위반 경고를 억제합니다.
[module: SuppressMessage("Microsoft.Design", "CA1020:AvoidNamespacesWithFewTypes", Scope = "namespace", Target = "MyNamespace")]
전역 수준 억제의 경우:
namespace
범위로 경고를 억제하면 네임스페이스 자체에 대한 경고가 억제됩니다. 네임스페이스 내의 형식에 대한 경고를 표시하지 않습니다.Target
항상 완전하게 정규화된 항목 이름을 포함합니다.명시적 범위를 지정하여 어떤 억제를 표현할 수 있습니다. 이러한 억제는 전역 수준에서 유지되어야 합니다. 형식을 수정하여 멤버 수준 억제를 지정할 수 없습니다.
전역 수준 억제는 명시적으로 제공된 사용자 원본에 매핑되지 않는 컴파일러 생성 코드를 참조하는 메시지를 표시하지 않는 유일한 방법입니다. 예를 들어, 다음 코드는 컴파일러가 생성한 생성자에 대한 위반을 차단합니다.
[module: SuppressMessage("Microsoft.Design", "CA1055:AbstractTypesDoNotHavePublicConstructors", Scope="member", Target="Microsoft.Tools.FxCop.Type..ctor()")]
전역 차단 파일
전역 억제 파일은 전역 수준의 억제 또는 대상을 지정하지 않는 억제를 유지 관리합니다. 예를 들어 어셈블리 수준 위반에 대한 억제 사항이 이 파일에 저장됩니다. 또한 프로젝트 수준 설정을 폼 뒤의 코드에 사용할 수 없으므로 일부 ASP.NET 억제가 이 파일에 저장됩니다. Visual Studio는 오류 목록 창에서 억제 명령의 프로젝트 억제 파일 옵션을 처음 선택하면 프로젝트에 전역 억제 파일을 만들고 추가합니다.
모듈 억제 범위
module
범위를 사용하여 전체 어셈블리에 대한 코드 품질 위반을 억제할 수 있습니다.
예를 들어, GlobalSuppressions 프로젝트 파일의 다음 특성은 ASP.NET Core 프로젝트에서 ConfigureAwait 위반을 억제합니다.
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Reliability", "CA2007:Consider calling ConfigureAwait on the awaited task", Justification = "ASP.NET Core doesn't use thread context to store request context.", Scope = "module")]
생성된 코드
관리 코드 컴파일러 및 일부 외부 도구는 신속한 코드 개발에 도움이 되는 코드를 생성합니다. 소스 파일에 표시되는 컴파일러 생성 코드는 GeneratedCodeAttribute
특성으로 표시됩니다.
소스 코드 분석의 경우 .editorconfig 파일에서 생성된 코드의 메시지를 표시하지 않을 수 있습니다. 자세한 내용은 생성된 코드 제외를 참조하세요.
레거시 코드 분석의 경우 생성된 코드에 대한 코드 분석 경고 및 오류를 표시하지 않을지 여부를 선택할 수 있습니다. 이러한 경고 및 오류를 표시하지 않는 방법에 대한 자세한 내용은 생성된 코드에 대한 코드 분석 경고 표시 안 함(Suppress code analysis warning)을 참조하세요.
비고
코드 분석은 전체 어셈블리 또는 단일 매개 변수에 적용되는 경우 무시 GeneratedCodeAttribute
됩니다.