Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
CA1846: Lebih memilih
| 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 10 | 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.