| 재산 | Value |
|---|---|
| 규칙 ID | CA1878 |
| Title | 읽기 전용 배열 필드보다 ReadOnlySpan 속성 선호 |
| 카테고리 | 성능 |
| 수정 사항이 기능을 손상시키는지, 아니면 비손상적인지 | Non-breaking |
| .NET 11에서 기본적으로 사용 | 제안으로서 |
| 적용 가능한 언어 | C# |
원인
프라이빗 정적 읽기 전용 1차원 배열 필드에는 지원되는 상수 값이 포함되며 관찰된 모든 사용량을 안전하게 다시 작성하여 속성을 사용할 ReadOnlySpan<T> 수 있습니다.
규칙 설명
정적 읽기 전용 배열 필드에는 관리되는 배열 할당이 필요합니다. 속성이 ReadOnlySpan<T> 지원되는 상수 데이터를 반환하는 경우 C# 컴파일러는 관리되는 배열을 할당하지 않고 데이터를 낮출 수 있습니다. 필드를 속성으로 바꿔서 데이터에 대한 읽기 전용 액세스를 유지하면서 할당을 줄일 수 있습니다.
분석기는 다음 요소 형식을 지원합니다.
-
bool,byte사용할sbyte수 있을 때마다 ReadOnlySpan<T> 지원됩니다. -
short,ushort,char,int,uint,float,long,ulong및double대상 컴파일이 공용 정적 RuntimeHelpers.CreateSpan<T>(RuntimeFieldHandle) 메서드를 노출하는 경우에만 지원됩니다. .NET 7 이상 참조 어셈블리는 이 메서드를 노출합니다.
분석기는 , , nintnuint열거형 형식, 임의 구조체 또는 참조 형식의 decimal배열을 진단하지 않습니다. 또한 들쭉날쭉한 배열 또는 다차원 배열을 진단하지 않습니다.
위반 문제를 해결하는 방법
배열 필드를 반환하는 식 본문 속성으로 바꿉다 ReadOnlySpan<T>.
코드 수정은 필드의 적격 사용량을 다시 작성합니다. 지원되는 AsSpan 호출의 경우 중복 호출을 제거하거나 호출을 해당하는 범위 작업(예: Slice)으로 바꿉니다. 코드 수정은 모든 사용의 의미 체계를 유지할 수 없는 경우 제공되지 않습니다.
예제
다음 코드 조각은 CA1878 위반을 보여줍니다.
class CA1878ViolationExample
{
private static readonly byte[] Prefix = new byte[] { 0x50, 0x4B, 0x03, 0x04 };
public static ReadOnlySpan<byte> GetPrefix() => Prefix;
}
다음 코드 조각은 이 위반을 해결합니다.
class CA1878FixExample
{
private static ReadOnlySpan<byte> Prefix => new byte[] { 0x50, 0x4B, 0x03, 0x04 };
public static ReadOnlySpan<byte> GetPrefix() => Prefix;
}
경고를 표시하지 않는 경우
배열의 ID 또는 변경 가능성을 의도적으로 유지하거나 API 호환성을 유지하려면 멤버가 배열 필드로 유지되어야 하는 경우 경고를 표시하지 않습니다. 규칙은 관찰된 사용량을 안전하게 다시 작성할 수 있는 프라이빗 정적 읽기 전용 필드만 보고합니다.
경고 표시 안 함
단일 위반을 억제하려면 소스 파일에 전처리기 지시문을 추가하여 규칙을 비활성화한 다음 다시 활성화하세요.
#pragma warning disable CA1878
// The code that's violating the rule is on this line.
#pragma warning restore CA1878
파일, 폴더 또는 프로젝트에 대한 규칙을 비활성화하려면 none에서 해당 심각도를 로 설정하세요.
[*.{cs,vb}]
dotnet_diagnostic.CA1878.severity = none
자세한 내용은 코드 분석 경고를 표시하지 않는 방법을 참조하세요.
참고하십시오
.NET