CA1846: Tercih et AsSpan
Substring
Ö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
Substring
yaparak 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.