CA1846:偏好 AsSpan 使用 Substring

屬性
規則識別碼 CA1846
標題 偏好 AsSpan 而非 Substring
類別 效能
修正程式是中斷或非中斷 不中斷
預設在 .NET 8 中啟用 建議

原因

呼叫其中 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

隱藏警告的時機

如果效能不相關,可以放心地隱藏此規則的警告。

另請參閱