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.
| Ö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.
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.
İlgili kurallar
- CA1832: Bir dizinin ReadOnlySpan veya ReadOnlyMemory bölümünü almak için Aralık tabanlı dizin oluşturucular yerine AsSpan veya AsMemory kullanın
- CA1833: Bir dizinin Span veya Memory bölümünü elde etmek için Aralık tabanlı dizleyiciler yerine AsSpan veya AsMemory kullanın