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 |
| Kategori | Performa |
| Perbaikan bersifat merusak atau tidak merusak | Tidak terputus |
| Diaktifkan secara default di .NET 10 | Sebagai saran |
| Bahasa yang berlaku | C# dan Visual Basic |
Penyebab
Hasil panggilan ke salah satu overload String.Substring diteruskan ke metode dengan overload yang tersedia yang menerima ReadOnlySpan<Char>.
Deskripsi aturan
Substring mengalokasikan objek baru string pada heap 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 satu metode ekstensi 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
Kapan harus menekan peringatan
Adalah aman untuk menekan peringatan dari aturan ini jika kinerja bukan prioritas utama.