| 속성 | 값 |
|---|---|
| 규칙 ID | CA2245 |
| 제목 | 속성을 자체에 할당하지 마세요. |
| 범주 | 사용 현황 |
| 수정 사항이 호환성을 깨뜨리는지 여부 또는 무중단인지 여부 | 주요 변경 아님 |
| .NET 10에서 기본적으로 사용하도록 설정 | 제안 사항 |
| 적용 가능한 언어 | C# 및 Visual Basic |
원인
어떤 속성이 실수로 그 자체에 할당되었습니다.
규칙 설명
필드, 로컬 또는 매개 변수 기호가 자신에게 할당된 경우에는 C# 컴파일러가 CS1717: 같은 변수에 할당했습니다. 다른 요소를 할당하시겠습니까? 경고를 생성합니다. 이러한 실수는 로컬, 매개 변수 또는 필드 기호의 이름이 범위에 있는 다른 기호와 비슷한 경우에 자주 발생합니다. 할당의 왼쪽 및 오른쪽에 다른 기호가 사용되지 않고 동일한 기호가 양쪽에서 사용되었습니다. 이로 인해 값을 자신에게 중복해서 할당하게 되고 대개 기능 버그가 있음을 의미합니다.
자신에게 속성을 할당하는 것은 거의 모든 실제 사례에서 발생하는 유사한 기능 버그이기도 합니다. 그러나 일부 극단적인 경우에는 속성 값을 가져옴으로써 부작용이 발생할 수 있으며 해당 속성의 새 값이 원래 값과 다를 수 있습니다. 이 경우, 속성 자체 할당은 중복되지 않으므로 제거할 수 없습니다. 그 결과 컴파일러가 해당 경우에 대한 호환성이 손상되는 변경을 도입하지 않고도 속성 자체 할당에 대한 CS1717 경고를 생성하지 않습니다.
규칙 CA2245는 이러한 차이를 대상으로 합니다. 이러한 기능 버그를 수정하는 데 도움이 되는 속성 자체 할당에 대한 위반을 보고합니다. 속성 자체 할당이 필요한 소수의 비정상적인 상황에서는 적절한 근거 주석을 사용하여 소스에서 CA2245 위반을 억제할 수 있습니다.
위반 문제를 해결하는 방법
할당의 왼쪽과 오른쪽에서 서로 다른 기호를 사용하여 위반을 수정하십시오. 예를 들어 다음 코드 조각은 규칙의 위반 및 해결 방법을 보여 줍니다.
public class C
{
private int p = 0;
public int P { get; private set; }
public void M(int p)
{
// CS1717: Accidentally assigned the parameter 'p' to itself.
p = p;
// CA2245: Accidentally assigned the property 'P' to itself.
P = P;
}
}
public class C
{
private int p = 0;
public int P { get; private set; }
public void M(int p)
{
// No violation, now the parameter is assigned to the field.
this.p = p;
// No violation, now the parameter is assigned to the property.
P = p;
}
}
경고를 표시하지 않는 경우
속성 값을 가져오는 경우 부작용이 있을 수 있고 속성의 새 값이 원래 값과 다른 경우 이 규칙의 위반을 표시하지 않는 것이 안전합니다. 이 경우에는 속성 자체 할당이 중복되지 않습니다. 이를 예상 동작으로 문서화하려면 비표시 항목에 근거 주석을 추가해야 합니다.
경고 표시 안 함
단일 위반을 억제하려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 비활성화한 후 다시 활성화하십시오.
#pragma warning disable CA2245
// The code that's violating the rule is on this line.
#pragma warning restore CA2245
파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않으려면 구성 파일에서 none의 심각도를 설정합니다.
[*.{cs,vb}]
dotnet_diagnostic.CA2245.severity = none
자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.
관련 규칙
- CS1717: 같은 변수에 할당했습니다. 다른 요소를 할당하시겠습니까?
- CA2011: setter 내에서 속성을 할당하지 마세요.
- CA2246: 동일한 문에 기호와 해당 멤버를 할당하지 마세요.
참고하기
.NET