CA2018: Argumentet count som ska Buffer.BlockCopy anges ska ange hur många byte som ska kopieras

Property Värde
Regel-ID CA2018
Title Argumentet count som Buffer.BlockCopy ska anges ska ange hur många byte som ska kopieras
Kategori Tillförlitlighet
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Som varning

Orsak

Den här regeln utlöses när Array.Length används för argumentet Buffer.BlockCopy för count på matriser vars element är större än en byte i storlek.

Regelbeskrivning

När du använder Buffer.BlockCopycount anger argumentet antalet byte som ska kopieras. Du bör bara använda Array.Length för count argumentet på matriser vars element är exakt en byte i storlek. byte, sbyte, och bool matriser har element som är en byte i storlek.

Så här åtgärdar du överträdelser

Ange antalet byte som du tänker kopiera för count argumentet.

Exempel

Överträdelse:

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);
    }
}

Lösningen

Om matrisens element är större än en byte i storlek kan du multiplicera matrisens längd med elementstorleken för att få antalet byte.

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));
    }
}

När du ska ignorera varningar

Det är vanligtvis INTE säkert att ignorera en varning från den här regeln.

Se även