CA1846:
| 속성 | 값 |
|---|---|
| 규칙 ID | CA1846 |
| 제목 |
AsSpan보다 Substring 선호 |
| 범주 | 성능 |
| 수정 사항이 호환성을 깨뜨리는지 여부 또는 무중단인지 여부 | 주요 변경 아님 |
| .NET 10에서 기본적으로 사용하도록 설정 | 제안 사항 |
| 적용 가능한 언어 | C# 및 Visual Basic |
원인
String.Substring 오버로드 중 하나에 대한 호출 결과는 ReadOnlySpan<Char>을 허용하는 사용 가능한 오버로드가 있는 메서드에 전달됩니다.
규칙 설명
Substring은 힙에 새 string 개체를 할당하고 추출된 텍스트의 전체 복사를 수행합니다. 문자열 조작은 많은 프로그램에서 성능 병목 현상을 일으킵니다. 핫 경로에 수명이 짧은 작은 문자열을 많이 할당하면 성능에 영향을 줄 수 있는 충분한 컬렉션 압력이 발생할 수 있습니다.
Substring에서 만든 O(n) 복사본은 부분 문자열이 커질 때 관련성이 있습니다.
Span<T> 및 ReadOnlySpan<T> 형식은 이러한 성능 문제를 해결하기 위해 만들어졌습니다.
문자열을 허용하는 많은 API에는 ReadOnlySpan<System.Char> 인수를 허용하는 오버로드도 있습니다. 이러한 오버로드를 사용할 수 있는 경우 AsSpan 대신 Substring을 호출하여 성능을 향상시킬 수 있습니다.
위반 문제를 해결하는 방법
이 규칙 위반 문제를 해결하려면 string.Substring에 대한 호출을 MemoryExtensions.AsSpan 확장 메서드 중 하나에 대한 호출로 대체합니다.
using System;
public void MyMethod(string iniFileLine)
{
// Violation
int.TryParse(iniFileLine.Substring(7), out int x);
int.TryParse(iniFileLine.Substring(2, 5), out int y);
// Fix
int.TryParse(iniFileLine.AsSpan(7), out int x);
int.TryParse(iniFileLine.AsSpan(2, 5), out int y);
}
Imports System
Public Sub MyMethod(iniFileLine As String)
Dim x As Integer
Dim y As Integer
' Violation
Integer.TryParse(iniFileLine.Substring(7), x)
Integer.TryParse(iniFileLine.Substring(2, 5), y)
' Fix
Integer.TryParse(iniFileLine.AsSpan(7), x)
Integer.TryParse(iniFileLine.AsSpan(2, 5), y)
End Sub
경고를 표시하지 않는 경우
성능이 문제가 되지 않는 경우 이 규칙의 경고를 표시하지 않아도 됩니다.
참고하기
.NET