Share via


CA1802: 가능하면 리터럴을 사용하십시오.

속성
규칙 ID CA1802
타이틀 가능하면 리터럴을 사용하세요.
범주 성능
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 8에서 기본적으로 사용 아니요

원인

필드가 선언된 staticreadonly(Visual Basic의 경우 SharedReadOnly)이고 컴파일 시간에 계산할 수 있는 값으로 초기화됩니다.

기본적으로 이 규칙은 외부에 표시되는 static, readonly 필드만 확인하지만 이는 구성 가능합니다.

규칙 설명

static readonly 필드의 값은 선언 형식에 대한 정적 생성자가 호출되면 런타임에 계산됩니다. static readonly 필드가 선언될 때 초기화되고 정적 생성자가 명시적으로 선언되지 않은 경우 컴파일러는 정적 생성자를 내보내 필드를 초기화합니다.

필드 값 const 은 컴파일 시간에 계산되고 메타데이터에 저장되므로 필드와 비교할 때 런타임 성능이 향상됩니다 static readonly .

대상 필드에 할당된 값은 컴파일 시간에 계산할 수 있으므로 이 값이 런타임 대신 컴파일 시간에 계산되도록 선언을 const 필드로 변경합니다.

위반 문제를 해결하는 방법

이 규칙의 위반 문제를 해결하려면 staticreadonly 한정자를 const 한정자로 바꿉니다.

참고 항목

일부 시나리오에서는 const 한정자를 사용하지 않는 것이 좋습니다.

경고를 표시하지 않는 경우

성능이 중요하지 않은 경우 이 규칙의 경고를 표시하지 않거나 규칙을 사용하지 않도록 설정해도 됩니다.

경고 표시 안 함

단일 위반만 표시하지 않으려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 사용하지 않도록 설정한 후 다시 사용하도록 설정합니다.

#pragma warning disable CA1802
// The code that's violating the rule is on this line.
#pragma warning restore CA1802

파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않도록 설정하려면 구성 파일에서 심각도를 none으로 설정합니다.

[*.{cs,vb}]
dotnet_diagnostic.CA1802.severity = none

자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.

분석할 코드 구성

다음 옵션을 사용하여 이 규칙이 실행될 코드베이스 부분을 구성합니다.

이 규칙, 적용되는 모든 규칙 또는 이 범주의 모든 규칙(성능)에 대해 이러한 옵션을 구성할 수 있습니다. 자세한 내용은 코드 품질 규칙 구성 옵션을 참조하세요.

특정 API 화면 포함

접근성을 기반으로 이 규칙을 실행할 코드베이스의 파트를 구성할 수 있습니다. 예를 들어 규칙이 퍼블릭이 아닌 API 표면에서만 실행되도록 지정하려면 프로젝트의 .editorconfig 파일에 다음 키-값 쌍을 추가합니다.

dotnet_code_quality.CAXXXX.api_surface = private, internal

필수 한정자

필수 필드 한정자를 재정의하도록 이 규칙을 구성할 수 있습니다. 기본적으로 staticreadonly는 모두 분석되는 필드의 필수 한정자입니다. 다음 표에서 쉼표로 구분된 하나 이상의 한정자 값 목록으로 재정의할 수 있습니다.

옵션 값 요약
none 한정자 요구 사항이 없습니다.
static 또는 Shared ‘static’(Visual Basic의 경우 ‘Shared’)으로 선언되어야 합니다.
const ‘const’로 선언되어야 합니다.
readonly ‘readonly’로 선언되어야 합니다.

예를 들어 규칙이 정적 및 인스턴스 필드에 대해 실행되도록 지정하려면 프로젝트의 .editorconfig 파일에 다음 키-값 쌍을 추가합니다.

dotnet_code_quality.CA1802.required_modifiers = none

예시

다음 예제에서는 규칙을 위반하는 형식인 UseReadOnly 및 규칙을 충족하는 형식인 UseConstant를 보여 줍니다.

Imports System

Namespace ca1802

    ' This class violates the rule.
    Public Class UseReadOnly

        Shared ReadOnly x As Integer = 3
        Shared ReadOnly y As Double = x + 2.1
        Shared ReadOnly s As String = "readonly"

    End Class

    ' This class satisfies the rule.
    Public Class UseConstant

        Const x As Integer = 3
        Const y As Double = x + 2.1
        Const s As String = "const"

    End Class

End Namespace
// This class violates the rule.
public class UseReadOnly
{
    static readonly int x = 3;
    static readonly double y = x + 2.1;
    static readonly string s = "readonly";

    public void Print()
    {
        Console.WriteLine(s);
    }
}

// This class satisfies the rule.
public class UseConstant
{
    const int x = 3;
    const double y = x + 2.1;
    const string s = "const";
}