Share via


CA2011: setter 내에서 속성을 할당하지 마세요.

속성
규칙 ID CA2011
타이틀 Setter 내에서 속성을 할당하지 마세요.
범주 신뢰성
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 8에서 기본적으로 사용 제안 사항

원인

속성이 자체 set 접근자 내에서 실수로 값을 할당받았습니다.

규칙 설명

Set 접근자에서 속성을 자체적으로 할당하면 set 접근자에 대한 재귀 호출의 무한 체인이 발생합니다. 이렇게 하면 런타임에 StackOverflowException이 발생합니다. 이러한 실수는 속성과 속성 값을 저장하는 지원 필드의 이름이 비슷한 경우 자주 발생합니다. 지원 필드에 값을 할당하는 대신 실수로 해당 속성 자체에 값을 할당받았습니다.

위반 문제를 해결하는 방법

위반 문제를 해결하려면 속성에 대한 위반 할당을 지원 필드에 대한 할당으로 바꾸거나 Auto 속성을 사용하도록 전환합니다. 예를 들어 다음 코드 조각에서는 규칙을 위반하고 이를 해결하는 몇 가지 방법을 보여 줍니다.

public class C
{
    // Backing field for property 'P'
    private int p;

    public int P
    {
        get
        {
            return p;
        }
        set
        {
            // CA2011: Accidentally assigned to property, instead of the backing field.
            P = value;
        }
    }
}
public class C
{
    // Backing field for property 'P'
    private int _p;

    public int P
    {
        get
        {
            return _p;
        }
        set
        {
            // Option 1: Assign to backing field and rename the backing field for clarity.
            _p = value;
        }
    }
}
public class C
{
    // Option 2: Use auto-property.
    public int P { get; set; }
}

경고를 표시하지 않는 경우

무한 재귀가 발생하지 않도록 set 접근자에 대한 재귀 호출이 조건부로 보호되는 경우에는 이 규칙에서 위반을 억제해도 괜찮습니다.

경고 표시 안 함

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

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

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

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

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

참고 항목