CA1846: AsSpan보다 Substring 선호

속성
규칙 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

경고를 표시하지 않는 경우

성능이 문제가 되지 않는 경우 이 규칙의 경고를 표시하지 않아도 됩니다.

참고하기