Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
CA1846:
| Ö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.