CA1846:偏好
| 屬性 | 值 |
|---|---|
| 規則識別碼 | CA1846 |
| 職稱 | 偏好 AsSpan 而非 Substring |
| 類別 | 效能 |
| 修正程式是中斷或非中斷 | 不中斷 |
| 在 .NET 10 中預設啟用 | 建議 |
原因
呼叫其中 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
隱藏警告的時機
如果效能不相關,可以放心地隱藏此規則的警告。