Aracılığıyla paylaş


CA1846: Tercih et AsSpanSubstring

Özellik Değer
Kural Kimliği CA1846
Başlık Tercih AsSpan et Substring
Kategori Performans
Hataya neden olan veya bozulmayan düzeltme Hataya neden olmayan
.NET 9'da varsayılan olarak etkin Öneri olarak

Neden

Aşırı yüklemelerden birine yapılan çağrının String.Substring sonucu, kabul ReadOnlySpan<Char>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 erişimli bir yola çok sayıda küçük, kısa ömürlü dize ayırma performansı etkilemek için yeterli koleksiyon baskısı 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.

Dizeleri kabul eden birçok API'nin bağımsız değişken kabul ReadOnlySpan<System.Char> eden aşırı yüklemeleri de vardır. Bu tür aşırı yüklemeler kullanılabilir olduğunda yerine çağrısı AsSpan Substringyaparak performansı geliştirebilirsiniz.

İhlalleri düzeltme

Bu kuralın ihlalini düzeltmek için çağrısı string.Substring yerine uzantı yöntemlerinden birine yapılan çağrıyı MemoryExtensions.AsSpan yazın.

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.