CA1846: Lebih memilih AsSpan
daripada Substring
Properti | Nilai |
---|---|
ID Aturan | CA1846 |
Judul | Lebih disukai AsSpan daripada Substring |
Golongan | Performa |
Perbaikan bersifat disruptif atau non-disruptif | Non-disruptif |
Diaktifkan secara default di .NET 9 | Sebagai saran |
Penyebab
Hasil panggilan ke salah String.Substring satu kelebihan beban diteruskan ke metode dengan kelebihan beban yang tersedia yang menerima ReadOnlySpan<Char>
.
Deskripsi aturan
Substring
mengalokasikan objek baru string
pada timbunan dan melakukan salinan lengkap teks yang diekstrak. Manipulasi string adalah hambatan performa untuk banyak program. Mengalokasikan banyak string kecil berumur pendek pada jalur panas dapat menciptakan tekanan pengumpulan yang cukup untuk memengaruhi performa. Salinan O(n) yang dibuat dengan Substring
menjadi relevan ketika substring menjadi besar. Jenis Span<T> dan ReadOnlySpan<T> dibuat untuk menyelesaikan masalah performa ini.
Banyak API yang menerima string juga memiliki kelebihan beban yang menerima ReadOnlySpan<System.Char>
argumen. Ketika kelebihan beban tersebut tersedia, Anda dapat meningkatkan performa dengan memanggil AsSpan
alih-alih Substring
.
Cara memperbaiki pelanggaran
Untuk memperbaiki pelanggaran aturan ini, ganti panggilan ke string.Substring
dengan panggilan ke salah MemoryExtensions.AsSpan satu metode ekstensi.
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
Kapan harus menekan peringatan
Aman untuk menekan peringatan dari aturan ini jika performa tidak menjadi perhatian.