Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
| Vlastnost | Hodnota |
|---|---|
| ID pravidla | CA1833 |
| Název | Pro získání části Span nebo Memory pole používat místo indexerů založených na rozsahu metodu AsSpan nebo AsMemory |
| Kategorie | Výkon |
| Oprava, která může být destruktivní nebo nedestruktivní | Nezlomitelný |
| Povoleno ve výchozím nastavení v .NET 10 | Jako návrh |
| Příslušné jazyky | C# a Visual Basic |
Příčina
Při použití indexeru rozsahu na pole a implicitním přiřazování hodnoty do Span<T> nebo Memory<T>.
Popis pravidla
Indexer pro rozsah v objektu Span<T> je operace Slice bez kopírování. Ale pro indexer rozsahu v poli bude použita metoda GetSubArray místo Slice, což vytvoří kopii požadované části pole. Tato kopie je obvykle nepotřebná, pokud se implicitně používá jako hodnota Span<T> nebo Memory<T>. Pokud kopie není zamýšlená, použijte metodu AsSpan nebo AsMemory, abyste se vyhnuli zbytečné kopii. Pokud je kopie zamýšlená, buď ji nejprve přiřaďte místní proměnné, nebo přidejte explicitní přetypování. Analyzátor hlásí pouze při použití implicitního přetypování na výsledek operace indexeru rozsahu.
Zjišťuje
Implicitní převody:
Span<SomeT> slice = arr[a..b];Memory<SomeT> slice = arr[a..b];
Nezjistí se
Explicitní převody:
Span<SomeT> slice = (Span<SomeT>)arr[a..b];Memory<SomeT> slice = (Memory<SomeT>)arr[a..b];
Jak opravit porušení
Chcete-li opravit porušení tohoto pravidla, použijte metodu AsSpan rozšíření AsMemory , abyste se vyhnuli vytváření nepotřebných kopií dat.
class C
{
public void TestMethod(byte[] arr)
{
// The violation occurs for both statements below
Span<byte> tmp2 = arr[0..5];
Memory<byte> tmp4 = arr[5..10];
...
}
}
class C
{
public void TestMethod(byte[] arr)
{
// The violations fixed with AsSpan or AsMemory accordingly
Span<byte> tmp2 = arr.AsSpan()[0..5];
Memory<byte> tmp4 = arr.AsMemory()[5..10];
...
}
}
Tip
Oprava kódu je k dispozici pro toto pravidlo v sadě Visual Studio. Pokud ho chcete použít, umístěte kurzor na chybu a stiskněte
Také se můžete tomuto upozornění vyhnout přidáním explicitního přetypování.
class C
{
public void TestMethod(byte[] arr)
{
// The violation occurs
Span<byte> tmp1 = arr[0..5];
Memory<byte> tmp2 = arr[5..10];
...
}
}
class C
{
public void TestMethod(byte[] arr)
{
// The violation fixed with explicit casting
Span<byte> tmp1 = (Span<byte>)arr[0..5];
Memory<byte> tmp2 = (Memory<byte>)arr[5..10];
...
}
}
Kdy potlačit upozornění
Pokud chcete vytvořit kopii, je bezpečné potlačit porušení tohoto pravidla.
Potlačení upozornění
Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.
#pragma warning disable CA1833
// The code that's violating the rule is on this line.
#pragma warning restore CA1833
Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.
[*.{cs,vb}]
dotnet_diagnostic.CA1833.severity = none
Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.
Související pravidla
- CA1831: Místo indexerů založených na rozsahu použijte pro řetězec AsSpan, pokud je to vhodné
- CA1832: Místo indexerů založených na rozsahu použijte AsSpan nebo AsMemory pro získání části pole ReadOnlySpan nebo ReadOnlyMemory.