CA2211: 비상수 필드는 노출되면 안 됩니다.

속성
규칙 ID CA2211
타이틀 비상수 필드는 노출되면 안 됩니다.
범주 사용 현황
수정 사항이 주요 변경인지 여부 주요 변경
.NET 8에서 기본적으로 사용 제안 사항

원인

public 또는 protected 정적 필드가 상수가 아니거나 읽기 전용입니다.

규칙 설명

상수도 아니고 읽기 전용도 아닌 static 필드는 스레드로부터 안전하지 않습니다. 해당 필드에 대한 액세스는 신중하게 제어해야 하며 클래스 개체에 대한 액세스를 동기화하는 고급 프로그래밍 기술을 필요로 합니다. 이러한 방법은 학습하기 어려운 기술이며 이러한 개체를 테스트하는 것은 고유한 과제를 발생시키고 정적 필드는 변경되지 않는 데이터를 저장하는 데 가장 적합합니다. 이 규칙은 라이브러리에 적용됩니다. 애플리케이션은 필드를 노출하면 안 됩니다.

위반 문제를 해결하는 방법

이 규칙 위반 문제를 해결하려면 정적 필드를 상수 또는 읽기 전용으로 설정합니다. 가능하지 않은 경우 기본 필드에 대한 스레드로부터 안전한 액세스를 관리하는 스레드로부터 안전한 속성과 같은 대체 메커니즘을 사용하도록 형식을 다시 디자인합니다. 잠금 경합 및 교착 상태와 같은 문제는 라이브러리의 성능 및 동작에 영향을 줄 수 있습니다.

경고를 표시하지 않는 경우

애플리케이션을 개발하고 있으므로 정적 필드를 포함하는 형식에 대한 모든 권한을 보유하는 경우에는 이 규칙에서 경고를 표시하지 않아도 됩니다. 라이브러리 디자이너는 이 규칙의 경고를 표시해야 합니다. 비상수 정적 필드를 사용하면 개발자가 라이브러리를 제대로 사용하기가 어려울 수 있습니다.

경고 표시 안 함

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

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

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

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

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

예시

다음 예제에서는 해당 규칙을 위반하는 형식을 보여 줍니다.


Imports System

Namespace ca2211

    Public Class SomeStaticFields
        ' Violates rule: AvoidNonConstantStatic;
        ' the field is public and not a literal.
        Public Shared publicField As DateTime = DateTime.Now

        ' Satisfies rule: AvoidNonConstantStatic.
        Public Shared ReadOnly literalField As DateTime = DateTime.Now

        ' Satisfies rule: NonConstantFieldsShouldNotBeVisible;
        ' the field is private.
        Private Shared privateField As DateTime = DateTime.Now
    End Class
End Namespace
public class SomeStaticFields
{
    // Violates rule: AvoidNonConstantStatic;
    // the field is public and not a literal.
    static public DateTime publicField = DateTime.Now;

    // Satisfies rule: AvoidNonConstantStatic.
    public static readonly DateTime literalField = DateTime.Now;

    // Satisfies rule: NonConstantFieldsShouldNotBeVisible;
    // the field is private.
    static DateTime privateField = DateTime.Now;
}