Udostępnij za pośrednictwem


CA2018: Argument count do Buffer.BlockCopy powinien określać liczbę bajtów do skopiowania

Właściwości Wartość
Identyfikator reguły CA2018
Tytuł count Argument Buffer.BlockCopy powinien określać liczbę bajtów do skopiowania.
Kategoria Niezawodność
Poprawka łamiąca lub nienaruszająca Niezgodność
Domyślnie włączone na platformie .NET 10 Jako ostrzeżenie
Zastosowane języki C# i Visual Basic

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 Array.Length należy używać tylko w przypadku argumentu count na tablicach, których elementy mają dokładnie jeden bajt 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ż