CA1846: AsSpan'yı Substring'ye tercih et

Özellik Değer
Kural Kimliği CA1846
Başlık AsSpan tercih et Substring yerine
Kategori Performans
Düzeltme bozucu ya da bozmayan olabilir Kesintisiz
.NET 10'da varsayılan olarak etkin Öneri olarak
Geçerli diller C# ve Visual Basic

Neden

Bir aşırı yüklemenin String.Substring sonucu, ReadOnlySpan<Char> kabul eden kullanılabilir bir aşırı yüklemeye sahip bir yönteme geçirilir.

Kural açıklaması

Substring yığında yeni string bir nesne ayırır ve ayıklanan metnin tam kopyasını gerçekleştirir. Dize işleme, birçok program için performans sorunudur. Sık kullanılan bir yolda çok sayıda küçük, kısa ömürlü string ayırmak, bellek yönetimi üzerinde performansı etkileyebilecek derecede baskı oluşturabilir. Tarafından oluşturulan Substring O(n) kopyalar, alt dizeler genişlediğinde ilgili hale gelir. Span<T> ve ReadOnlySpan<T> türleri bu performans sorunlarını çözmek için oluşturulmuştur.

String kabul eden birçok API'nin, ReadOnlySpan<System.Char> bağımsız değişken kabul eden aşırı yüklenmiş versiyonları da vardır. Böyle aşırı yüklemeler mevcut olduğunda, Substring yerine AsSpan çağrısı yaparak performansı artırabilirsiniz.

İhlalleri düzeltme

Bu kuralın ihlalini düzeltmek için, string.Substring çağrısını uzantı yöntemlerinden birine MemoryExtensions.AsSpan çağrısıyla değiştirin.

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

Uyarıların ne zaman bastırılması gerekiyor?

Performans önemli değilse, bu kuraldan gelen uyarıların gizlenmesi güvenlidir.

Ayrıca bkz.