CA1831: Uygun durumlarda dize için aralık bazlı dizinleyiciler yerine AsSpan kullanın

Özellik Değer
Kural Kimliği CA1831
Başlık Uygun olduğunda dize için Aralık tabanlı dizin oluşturucular yerine AsSpan kullanın
Kategori Performans
Düzeltme bozucu ya da bozmayan olabilir Kesintisiz
.NET 10'da varsayılan olarak etkin Uyarı olarak
Geçerli diller C# ve Visual Basic

Neden

Bir dizede aralık dizinleyici kullanılır ve değer ReadOnlySpan<char>'ye örtük olarak atanır.

Kural açıklaması

Bu kural, bir dizede aralık dizinleyici kullandığınızda ve bunu bir span türüne atadığınızda tetiklenir. Bir Span<T> üzerindeki aralık dizin oluşturucu, kopyalama yapmayan Slice bir işlemdir, ancak bir dizedeki aralık dizin oluşturucu için Substring yöntemi yerine Slice kullanılır. Bu, dizenin istenen bölümünün bir kopyasını oluşturur. Bu kopya genellikle ReadOnlySpan<T> veya ReadOnlyMemory<T> değeri olarak örtük bir şekilde kullanıldığında gereksizdir. Bir kopya amaçlanmamışsa, gereksiz kopyayı önlemek için yöntemini kullanın AsSpan . Kopyalama amaçlanıyorsa, önce yerel bir değişkene atayın veya açık bir dönüşüm ekleyin. Çözümleyici, sadece aralık dizin oluşturucu işleminin sonucu üzerinde örtük bir atama kullanıldığında bunu bildirir.

Tespit eder

Örtük dönüştürme:

ReadOnlySpan<char> slice = str[a..b];

Algılanmaz

Açık dönüştürme:

ReadOnlySpan<char> slice = (ReadOnlySpan<char>)str[a..b];

İhlalleri düzeltme

Bu kuralın ihlalini düzeltmek için, gereksiz veri kopyalamalarından kaçınmak amacıyla dizideki Range-tabanlı dizin oluşturucu yerine AsSpan kullanın.

public void TestMethod(string str)
{
    // The violation occurs
    ReadOnlySpan<char> slice = str[1..3];
    ...
}
public void TestMethod(string str)
{
    // The violation fixed with AsSpan extension method
    ReadOnlySpan<char> slice = str.AsSpan()[1..3];
    ...
}

İpucu

Visual Studio'da bu kural için bir kod düzeltmesi kullanılabilir. Bunu kullanmak için imleci ihlalin üzerine getirin ve Ctrl+. (nokta) tuşuna basın. Sunulan seçenekler listesinden bir dizede Aralık tabanlı dizin oluşturucu yerine AsSpan Kullan'ı seçin.

CA1831 için kod düzeltmesi - Uygun olduğunda Aralık tabanlı dizin oluşturucular yerine AsSpan kullanın

Bu uyarıyı önlemek için açık bir dönüşüm de ekleyebilirsiniz.

public void TestMethod(string str)
{
    // The violation occurs.
    ReadOnlySpan<char> slice = str[1..3];
    ...
}
public void TestMethod(string str)
{
    // The violation avoided with explicit casting.
    ReadOnlySpan<char> slice = (ReadOnlySpan<char>)str[1..3];
    ...
}

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

Bu kuralın ihlalini göz ardı etmek, bir kopya oluşturmak amaçlandığında güvenlidir.

Uyarıyı gizleme

Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.

#pragma warning disable CA1831
// The code that's violating the rule is on this line.
#pragma warning restore CA1831

Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini noneolarak ayarlayın.

[*.{cs,vb}]
dotnet_diagnostic.CA1831.severity = none

Bu kural kategorisinin tamamını devre dışı bırakmak için, kategorinin önem derecesini noneyapılandırma dosyasında olarak ayarlayın.

[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Performance.severity = none

Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.

Ayrıca bkz.