CA1846: Substring
보다 AsSpan
선호
속성 | 값 |
---|---|
규칙 ID | CA1846 |
제목 | Substring 보다 AsSpan 선호 |
범주 | 성능 |
수정 사항이 주요 변경인지 여부 | 주요 변경 아님 |
.NET 9에서 기본적으로 사용 | 제안 사항 |
원인
String.Substring 오버로드 중 하나에 대한 호출 결과는 ReadOnlySpan<Char>
을 허용하는 사용 가능한 오버로드가 있는 메서드에 전달됩니다.
규칙 설명
Substring
은 힙에 새 string
개체를 할당하고 추출된 텍스트의 전체 복사를 수행합니다. 문자열 조작은 많은 프로그램에서 성능 병목 현상을 일으킵니다. 핫 경로에 수명이 짧은 작은 문자열을 많이 할당하면 성능에 영향을 줄 수 있는 충분한 컬렉션 압력이 발생할 수 있습니다. Substring
에서 만든 O(n) 복사본은 부분 문자열이 커질 때 관련성이 있습니다. Span<T> 및 ReadOnlySpan<T> 형식은 이러한 성능 문제를 해결하기 위해 만들어졌습니다.
문자열을 허용하는 많은 API에는 ReadOnlySpan<System.Char>
인수를 허용하는 오버로드도 있습니다. 이러한 오버로드를 사용할 수 있는 경우 Substring
대신 AsSpan
을 호출하여 성능을 향상시킬 수 있습니다.
위반 문제를 해결하는 방법
이 규칙 위반 문제를 해결하려면 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
경고를 표시하지 않는 경우
성능이 문제가 되지 않는 경우 이 규칙의 경고를 표시하지 않아도 됩니다.
참고 항목
GitHub에서 Microsoft와 공동 작업
이 콘텐츠의 원본은 GitHub에서 찾을 수 있으며, 여기서 문제와 끌어오기 요청을 만들고 검토할 수도 있습니다. 자세한 내용은 참여자 가이드를 참조하세요.
.NET