CA2018: count Argument, który Buffer.BlockCopy ma określać liczbę bajtów do skopiowania

Właściwości Wartość
Identyfikator reguły CA2018
Tytuł count Argument , który Buffer.BlockCopy ma określać liczbę bajtów do skopiowania
Kategoria Niezawodność
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 8 Jako ostrzeżenie

Przyczyna

Ta reguła jest uruchamiana, gdy Array.Length jest używana dla count argumentu Buffer.BlockCopy w tablicach, których elementy są większe niż jeden bajt w rozmiarze.

Opis reguły

W przypadku używania Buffer.BlockCopycount argument określa liczbę bajtów do skopiowania. Argumentu należy używać Array.Lengthcount tylko w przypadku tablic, których elementy są dokładnie jednym bajtem rozmiaru. byte, sbytei bool tablice mają elementy o rozmiarze jednego bajtu.

Jak naprawić naruszenia

Określ liczbę bajtów, które mają być kopiowane dla argumentu count .

Przykład

Naruszenie:

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

Poprawka:

Jeśli elementy tablicy mają rozmiar większy niż jeden bajt, można pomnożyć długość tablicy według rozmiaru elementu, aby uzyskać liczbę bajtów.

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

Kiedy pomijać ostrzeżenia

Zazwyczaj nie można bezpiecznie pominąć ostrzeżenia z tej reguły.

Zobacz też