CA1008: 열거형에는 0 값이 있어야 합니다.
속성 | 값 |
---|---|
규칙 ID | CA1008 |
제목 | 열거형에는 0 값이 있어야 합니다. |
범주 | 디자인 |
수정 사항이 주요 변경인지 여부 | 작업을 중단하지 않는 변경 - 비플래그 열거형에 None 값을 추가하라는 메시지가 표시되는 경우. 호환성이 손상되는 변경 - 열거형 값의 이름을 바꾸거나 제거할 것인지 묻는 메시지가 표시되는 경우. |
.NET 9에서 기본적으로 사용 | 아니요 |
원인
System.FlagsAttribute를 적용하지 않은 열거형은 값이 0인 멤버를 정의하지 않습니다. 또는 적용된 FlagsAttribute가 있는 열거형이 0 값을 포함하지만 이름이 ‘None’이 아닌 멤버를 정의합니다. 또는 열거형은 값인 0인 멤버를 여러 개 정의합니다.
기본적으로 이 규칙은 외부에 표시되는 열거형만 확인하지만 이는 구성 가능합니다.
규칙 설명
초기화를 취소한 열거형의 기본값은 다른 값 형식과 마찬가지로 0입니다. 플래그가 없는 특성을 가진 열거형에서는 기본값이 열거형의 유효한 값이 되도록 0 값을 사용하여 멤버를 정의해야 합니다. 적절한 경우 멤버 이름을 'None'(또는 허용된 추가 이름 중 하나)으로 지정합니다. 그렇지 않으면 가장 자주 사용되는 멤버에 0을 할당합니다. 기본적으로 선언에서 첫 번째 열거형 멤버의 값이 설정되지 않은 경우에 값은 0입니다.
적용된 열거형이 FlagsAttribute 값이 0인 멤버를 정의하는 경우 열거형에 값이 설정되지 않았음을 나타내려면 해당 이름은 'None'(또는 허용된 추가 이름 중 하나)이어야 합니다. 다른 용도로 값이 0인 멤버를 사용하는 FlagsAttribute 것은 비트 연산자가 멤버에 쓸모가 없다는 것을 AND
OR
사용하는 것과 반대입니다. 이는 한 멤버에게만 0 값을 할당해야 함을 의미합니다. 플래그 특성을 사용하는 열거형에서 값이 0인 멤버가 여러 개 발생하는 경우에 Enum.ToString()
은 0이 아닌 멤버에 대해 잘못된 결과를 반환합니다.
위반 문제를 해결하는 방법
플래그가 없는 특성을 가진 열거형에 대한 이 규칙 위반 문제를 해결하려면 값이 0인 멤버를 정의합니다. 이는 작업을 중단하지 않는 변경입니다. 0 값 멤버를 정의하는 플래그 특성을 사용하는 열거형의 경우, 이 멤버를 ‘None’이라 명명하고 값이 0인 다른 멤버를 삭제합니다. 이는 호환성이 손상되는 변경입니다.
경고를 표시하지 않는 경우
이전에 제공된 플래그 특성을 사용하는 열거형 외에는 이 규칙의 경고를 표시해야 합니다.
경고 표시 안 함
단일 위반만 표시하지 않으려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 사용하지 않도록 설정한 후 다시 사용하도록 설정합니다.
#pragma warning disable CA1008
// The code that's violating the rule is on this line.
#pragma warning restore CA1008
파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않도록 설정하려면 구성 파일에서 심각도를 none
으로 설정합니다.
[*.{cs,vb}]
dotnet_diagnostic.CA1008.severity = none
자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.
분석할 코드 구성
다음 옵션을 사용하여 이 규칙이 실행될 코드베이스 부분을 구성합니다.
이 규칙, 적용되는 모든 규칙 또는 적용되는 이 범주(디자인)의 모든 규칙에 대해 이 옵션을 구성할 수 있습니다. 자세한 내용은 코드 품질 규칙 구성 옵션을 참조하세요.
특정 API 화면 포함
접근성을 기반으로 이 규칙을 실행할 코드베이스의 파트를 구성할 수 있습니다. 예를 들어 규칙이 퍼블릭이 아닌 API 표면에서만 실행되도록 지정하려면 프로젝트의 .editorconfig 파일에 다음 키-값 쌍을 추가합니다.
dotnet_code_quality.CAXXXX.api_surface = private, internal
추가 0 값 필드 이름
.NET 7 이상 버전에서는 값이 0인 열거형 필드 외에 다른 허용 가능한 이름을 구성할 수 있습니다 None
. 여러 이름을 문자로 구분합니다 |
. 다음 표에서는 몇 가지 예를 보여 줍니다.
옵션 값 | 요약 |
---|---|
dotnet_code_quality.CA1008.additional_enum_none_names = Never |
다음을 모두 None 허용합니다. Never |
dotnet_code_quality.CA1008.additional_enum_none_names = Never|Nothing |
허용 , None Never 및Nothing |
예시
다음 예제에서는 규칙을 충족하는 열거형 두 개와 규칙을 위반하는 BadTraceOptions
열거형을 보여 줍니다.
using System;
namespace ca1008
{
public enum TraceLevel
{
Off = 0,
Error = 1,
Warning = 2,
Info = 3,
Verbose = 4
}
[Flags]
public enum TraceOptions
{
None = 0,
CallStack = 0x01,
LogicalStack = 0x02,
DateTime = 0x04,
Timestamp = 0x08,
}
[Flags]
public enum BadTraceOptions
{
CallStack = 0,
LogicalStack = 0x01,
DateTime = 0x02,
Timestamp = 0x04,
}
class UseBadTraceOptions
{
static void MainTrace()
{
// Set the flags.
BadTraceOptions badOptions =
BadTraceOptions.LogicalStack | BadTraceOptions.Timestamp;
// Check whether CallStack is set.
if ((badOptions & BadTraceOptions.CallStack) ==
BadTraceOptions.CallStack)
{
// This 'if' statement is always true.
}
}
}
}
Imports System
Namespace ca1008
Public Enum TraceLevel
Off = 0
AnError = 1
Warning = 2
Info = 3
Verbose = 4
End Enum
<Flags>
Public Enum TraceOptions
None = 0
CallStack = &H1
LogicalStack = &H2
DateTime = &H4
Timestamp = &H8
End Enum
<Flags>
Public Enum BadTraceOptions
CallStack = 0
LogicalStack = &H1
DateTime = &H2
Timestamp = &H4
End Enum
Class UseBadTraceOptions
Shared Sub Main1008()
' Set the flags.
Dim badOptions As BadTraceOptions =
BadTraceOptions.LogicalStack Or BadTraceOptions.Timestamp
' Check whether CallStack is set.
If ((badOptions And BadTraceOptions.CallStack) =
BadTraceOptions.CallStack) Then
' This 'If' statement is always true.
End If
End Sub
End Class
End Namespace
관련 규칙
- CA2217: 열거형을 FlagsAttribute로 표시하지 마십시오.
- CA1700: 열거형 값의 이름을 'Reserved'로 지정하지 마십시오.
- CA1712: 열거형 값에 형식 이름을 접두사로 사용하지 마십시오.
- CA1028: 열거형 스토리지는 Int32여야 합니다.
- CA1027: 열거형을 FlagsAttribute로 표시하십시오.
참고 항목
.NET