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
隱藏警告的時機
如果效能不相關,可以放心地隱藏此規則的警告。