다음을 통해 공유


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

속성
규칙 ID CA1008
제목 열거형에는 0 값이 있어야 합니다.
범주 디자인
수정 사항이 주요 변경인지 여부 작업을 중단하지 않는 변경 - 비플래그 열거형에 None 값을 추가하라는 메시지가 표시되는 경우. 호환성이 손상되는 변경 - 열거형 값의 이름을 바꾸거나 제거할 것인지 묻는 메시지가 표시되는 경우.
.NET 10에서 기본적으로 사용하도록 설정 아니요

원인

System.FlagsAttribute를 적용하지 않은 열거형은 값이 0인 멤버를 정의하지 않습니다. 또는 적용된 FlagsAttribute가 있는 열거형이 0 값을 포함하지만 이름이 ‘None’이 아닌 멤버를 정의합니다. 또는 열거형은 값인 0인 멤버를 여러 개 정의합니다.

기본적으로 이 규칙은 외부에 표시되는 열거형만 확인하지만 이는 구성 가능합니다.

규칙 설명

초기화를 취소한 열거형의 기본값은 다른 값 형식과 마찬가지로 0입니다. 플래그가 없는 특성을 가진 열거형에서는 기본값이 열거형의 유효한 값이 되도록 0 값을 사용하여 멤버를 정의해야 합니다. 적절한 경우 멤버 이름을 'None'(또는 허용된 추가 이름 중 하나)으로 지정합니다. 그렇지 않으면 가장 자주 사용되는 멤버에 0을 할당합니다. 기본적으로 선언에서 첫 번째 열거형 멤버의 값이 설정되지 않은 경우에 값은 0입니다.

적용된 열거형이 FlagsAttribute 값이 0인 멤버를 정의하는 경우 열거형에 값이 설정되지 않았음을 나타내려면 해당 이름은 'None'(또는 허용된 추가 이름 중 하나)이어야 합니다. 다른 용도로 값이 0인 멤버를 사용하는 FlagsAttribute 것은 비트 연산자가 멤버에 쓸모가 없다는 것을 ANDOR 사용하는 것과 반대입니다. 이는 한 멤버에게만 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_surface 옵션을 설정하여 접근성에 따라 이 규칙을 실행할 코드베이스의 일부를 구성할 수 있습니다. 예를 들어 규칙이 퍼블릭이 아닌 API 표면에서만 실행되도록 지정하려면 프로젝트의 .editorconfig 파일에 다음 키-값 쌍을 추가합니다.

dotnet_code_quality.CAXXXX.api_surface = private, internal

메모

XXXX CAXXXX 부분을 해당 규칙의 ID로 바꿉니다.

추가 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

참고 항목