다음을 통해 공유


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 허용 , NoneNeverNothing

예시

다음 예제에서는 규칙을 충족하는 열거형 두 개와 규칙을 위반하는 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

참고 항목