Bagikan melalui


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.

Lihat juga