다음을 통해 공유


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

경고를 표시하지 않는 경우

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

참고 항목