CA1846: Lebih memilih AsSpan daripada Substring

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.

Lihat juga