CA1051: 표시되는 인스턴스 필드를 선언하지 마십시오.

속성
규칙 ID CA1051
타이틀 표시되는 인스턴스 필드를 선언하지 마세요.
범주 디자인
수정 사항이 주요 변경인지 여부 주요 변경
.NET 8에서 기본적으로 사용 아니요

원인

형식에 private이 아닌 인스턴스 필드가 있습니다.

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

규칙 설명

필드의 주된 용도는 구현을 세부적으로 설명하는 것입니다. 필드는 private 또는 internal이어야 하고 속성을 통해 노출되어야 합니다. 필드에 액세스하는 것처럼 속성에 쉽게 액세스할 수 있으며 형식의 기능이 호환성이 손상되는 변경을 적용하지 않고 확장되므로 속성 접근자 코드가 변경될 수 있습니다.

private 필드 또는 internal 필드의 값을 반환하는 속성은 필드 액세스와 동등하게 수행하도록 최적화되어 있습니다. 속성 대신 외부에 표시되는 필드를 사용하여 얻을 수 있는 성능 향상은 최소화되어 있습니다. ‘외부에 표시된다’는 것은 public, protected, protected internal(Visual Basic에서 Public, Protected, Protected Friend) 접근성 수준을 나타냅니다.

또한 public 필드는 링크 요청으로 보호할 수 없습니다. (링크 요청은 .NET Core 앱에 적용되지 않습니다.)

위반 문제를 해결하는 방법

해당 규칙 위반 문제를 해결하려면 필드 private 또는 internal로 설정하거나 외부에 표시되는 속성을 사용하여 노출합니다.

경고를 표시하지 않는 경우

소비자가 필드에 직접 액세스해야 하는 것이 확실한 경우에만 해당 경고를 표시합니다. 대부분의 애플리케이션에서 노출된 필드는 속성에 대한 성능 또는 유지 관리 이점을 제공하지 않습니다.

소비자는 다음과 같은 경우에 필드 액세스가 필요할 수 있습니다.

  • ASP.NET Web Forms 콘텐츠 컨트롤에 있는 경우.
  • 대상 플랫폼에서 ref를 사용하여 WPF 및 UWP용 MVVM(Model-View-ViewModel) 프레임워크와 같은 필드를 수정하는 경우.

경고 표시 안 함

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

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

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

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

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

API 포함 또는 API 제외

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

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

특정 API 화면 포함

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

dotnet_code_quality.CAXXXX.api_surface = private, internal

구조체 제외

struct(Visual Basic에서 Structure) 필드가 분석되지 않도록 제외할 수 있습니다.

dotnet_code_quality.ca1051.exclude_structs = true

예시

다음 예제에서는 해당 규칙을 위반하는 형식(BadPublicInstanceFields)을 보여 줍니다. GoodPublicInstanceFields는 수정된 코드를 표시합니다.

public class BadPublicInstanceFields
{
    // Violates rule DoNotDeclareVisibleInstanceFields.
    public int instanceData = 32;
}

public class GoodPublicInstanceFields
{
    private int instanceData = 32;

    public int InstanceData
    {
        get { return instanceData; }
        set { instanceData = value; }
    }
}

참고 항목