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 | CA1832 |
| Başlık | Bir dizinin ReadOnlySpan veya ReadOnlyMemory kısmını almak için Aralık tabanlı dizinleyiciler yerine AsSpan veya AsMemory kullanın. |
| 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 dizide aralık dizin oluşturucu kullanırken ve değeri ReadOnlySpan<T> veya ReadOnlyMemory<T>öğesine örtük olarak atarken.
Kural açıklaması
Span<T> üzerindeki aralık dizinleyici, kopyalanmayan bir Slice işlemdir. Ancak bir dizideki aralık dizin oluşturucu için, dizinin istenen bölümünün bir kopyasını üreten Slice yöntemi yerine, GetSubArray yöntemi kullanılır. 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 AsSpan veya AsMemory yöntemini kullanın. 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ürmeler:
ReadOnlySpan<SomeT> slice = arr[a..b];ReadOnlyMemory<SomeT> slice = arr[a..b];
Algılanmaz
Açık dönüştürmeler:
ReadOnlySpan<SomeT> slice = (ReadOnlySpan<SomeT>)arr[a..b];ReadOnlyMemory<SomeT> slice = (ReadOnlyMemory<SomeT>)arr[a..b];
İhlalleri düzeltme
Bu kuralın ihlalini düzeltmek için, gereksiz veri kopyaları oluşturmamak amacıyla AsSpan veya AsMemory uzantı yöntemini kullanın.
class C
{
public void TestMethod(byte[] arr)
{
// The violation occurs for both statements below
ReadOnlySpan<byte> tmp1 = arr[0..2];
ReadOnlyMemory<byte> tmp3 = arr[5..8];
...
}
}
class C
{
public void TestMethod(byte[] arr)
{
// The violations fixed with AsSpan or AsMemory accordingly
ReadOnlySpan<byte> tmp1 = arr.AsSpan()[0..2];
ReadOnlyMemory<byte> tmp3 = arr.AsMemory()[5..8];
...
}
}
İ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 dizide Aralık tabanlı dizin oluşturucu yerine AsSpan kullan seçeneğini seçin.
Ayrıca, açık bir kapsama ekleyerek bu uyarıyı önleyebilirsiniz.
class C
{
public void TestMethod(byte[] arr)
{
// The violation occurs
ReadOnlySpan<byte> tmp1 = arr[0..2];
ReadOnlyMemory<byte> tmp3 = arr[5..8];
...
}
}
class C
{
public void TestMethod(byte[] arr)
{
// The violation fixed with explicit casting
ReadOnlySpan<byte> tmp1 = (ReadOnlySpan<byte>)arr[0..2];
ReadOnlyMemory<byte> tmp3 = (ReadOnlyMemory<byte>)arr[5..8];
...
}
}
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 CA1832
// The code that's violating the rule is on this line.
#pragma warning restore CA1832
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.CA1832.severity = none
Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.
İlgili kurallar
- CA1831: Uygun olduğunda dize için Aralık tabanlı dizin oluşturucular yerine AsSpan 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