| 속성 | 값 |
|---|---|
| 규칙 ID | CA1822 |
| 제목 | 멤버를 static으로 표시하세요. |
| 범주 | 성능 |
| 수정 사항이 호환성을 깨뜨리는지 여부 또는 무중단인지 여부 | 비파괴적인 변경 - 변경이 멤버의 어셈블리 외부 표시 여부에 영향을 미치지 않는 경우입니다. 변경 시 시스템에 영향을 주지 않는 경우 - this 키워드를 사용하여 멤버를 인스턴스 멤버로 단순히 변경하는 경우입니다.호환성을 깨뜨리는 경우 - 인스턴스 멤버를 정적 멤버로 변경하고 멤버가 어셈블리 외부에서 보이는 경우. |
| .NET 10에서 기본적으로 사용하도록 설정 | 제안 사항 |
| 적용 가능한 언어 | C# 및 Visual Basic |
원인
인스턴스 데이터에 액세스하지 않는 멤버는 static(Visual Basic의 경우 공유)으로 표시되지 않습니다.
규칙 설명
인스턴스 데이터에 액세스하지 않거나 인스턴스 메서드를 호출하지 않는 멤버는 static(Visual Basic의 경우 Shared)으로 표시할 수 있습니다. 메서드를 static으로 표시하면 컴파일러는 이러한 멤버에 대한 비가상 호출 사이트를 내보냅니다. 비가상 호출 사이트를 내보내면 현재 개체 포인터가 null이 아닌지 확인하는 각 호출에 대해 런타임 시 검사가 차단됩니다. 따라서 성능이 중요한 코드에서 성능이 크게 향상될 수 있습니다. 경우에 따라 현재 개체 인스턴스에 액세스하지 못하면 정확성 문제가 발생합니다.
위반 문제를 해결하는 방법
해당하는 경우 멤버를 static(Visual Basic의 경우 공유)으로 표시하거나 메서드 본문에서 ‘this’/‘Me’를 사용합니다.
Example
public class Printer
{
private readonly List<char> _items = [
'H', 'e', 'l', 'l', 'o',
];
public void PrintHello()
{
BadPrintHelloInternal();
GoodPrintHelloInternal();
GoodPrintHelloStaticInternal();
}
// This method violates the rule.
private void BadPrintHelloInternal()
{
Console.WriteLine("Hello");
}
// This methods satisfies the rule.
private void GoodPrintHelloInternal()
{
Console.WriteLine(string.Join(string.Empty, this._items));
}
private static void GoodPrintHelloStaticInternal()
{
Console.WriteLine("Hello");
}
}
경고를 표시하지 않는 경우
다음과 같은 경우 이 규칙의 경고를 표시하지 않는 것이 안전합니다.
- 이전에 제공된 코드의 경우 수정이 호환성이 손상되는 변경이 될 수 있습니다.
- MarshalByRefObject에서 상속된 클래스의 메서드에 대해 .NET 원격 인프라는 인스턴스 디스패치를 사용하여 AppDomain 경계를 넘어 호출을 전달하기 때문에 이러한 클래스의 메서드는 정적으로 표시되지 않아야 합니다. 이러한 메서드를 정적으로 만들면 AppDomain 경계를 넘어 원격 프로세스 호출이 중단될 수 있습니다.
경고 표시 안 함
단일 위반을 억제하려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 비활성화한 후 다시 활성화하십시오.
#pragma warning disable CA1822
// The code that's violating the rule is on this line.
#pragma warning restore CA1822
파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않으려면 none에서 의 심각도를 설정합니다.
[*.{cs,vb}]
dotnet_diagnostic.CA1822.severity = none
자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.
분석할 코드 구성
다음 옵션을 사용하여 이 규칙이 실행될 코드베이스 부분을 구성합니다.
이 규칙, 적용되는 모든 규칙 또는 적용되는 이 범주의 모든 규칙(성능)에 대해 이 옵션을 구성할 수 있습니다. 자세한 내용은 코드 품질 규칙 구성 옵션을 참조하세요.
특정 API 화면 포함
api_surface 옵션을 설정하여 접근성에 따라 이 규칙을 실행할 코드베이스의 일부를 구성할 수 있습니다. 예를 들어 규칙이 퍼블릭이 아닌 API 표면에서만 실행되도록 지정하려면 프로젝트의 .editorconfig 파일에 다음 키-값 쌍을 추가합니다.
dotnet_code_quality.CAXXXX.api_surface = private, internal
메모
XXXX
CAXXXX 부분을 해당 규칙의 ID로 바꿉니다.
관련 규칙
.NET