CA2018: Argument count by měl ve Buffer.BlockCopy specifikovat počet bajtů ke zkopírování

Vlastnost Hodnota
ID pravidla CA2018
Název Argument count, který Buffer.BlockCopy specifikuje počet bajtů ke zkopírování
Kategorie Spolehlivost
Oprava, která může být destruktivní nebo nedestruktivní Nezlomitelný
Povoleno ve výchozím nastavení v .NET 10 Jako upozornění
Příslušné jazyky C# a Visual Basic

Příčina

Toto pravidlo se spustí, když Array.Length je použit jako argument count u polí Buffer.BlockCopy, jejichž prvky jsou větší než jeden bajt.

Popis pravidla

Při použití Buffer.BlockCopycount argument určuje počet bajtů, které se mají zkopírovat. Měli byste použít Array.Length pro argument count pouze u polí, jejichž prvky mají velikost přesně jednoho bajtu. byte, sbytea bool pole obsahují prvky, které mají velikost jednoho bajtu.

Jak opravit porušení

Zadejte počet bajtů, které chcete zkopírovat pro count argument.

Příklad

Porušení:

using System;
class Program
{
    static void Main()
    {
        int[] src = new int[] {1, 2, 3, 4};
        int[] dst = new int[] {0, 0, 0, 0};

        Buffer.BlockCopy(src, 0, dst, 0, src.Length);
    }
}

Oprava:

Pokud jsou prvky pole větší než jeden bajt, můžete délku pole vynásobit velikostí prvku a získat tak počet bajtů.

using System;
class Program
{
    static void Main()
    {
        int[] src = new int[] {1, 2, 3, 4};
        int[] dst = new int[] {0, 0, 0, 0};

        Buffer.BlockCopy(src, 0, dst, 0, src.Length * sizeof(int));
    }
}

Kdy potlačit upozornění

Obecně není bezpečné potlačit upozornění z tohoto pravidla.

Viz také