CA2018: el argumento count para Buffer.BlockCopy debería especificar el número de bytes que deben copiarse

Propiedad Value
Identificador de la regla CA2018
Título El argumento count para Buffer.BlockCopy debe especificar el número de bytes que se copiará
Categoría Confiabilidad
La corrección es problemática o no problemática Poco problemático
Habilitado de forma predeterminada en .NET 8 Como advertencia

Causa

Esta regla se ejecuta cuando Array.Length se usa para el argumento count de Buffer.BlockCopy en matrices cuyos elementos tienen un tamaño superior a un byte.

Descripción de la regla

Al usar Buffer.BlockCopy, el argumento count especifica el número de bytes que deben copiarse. Solo debería usar Array.Length para el argumento count en matrices cuyos elementos tendrán exactamente un tamaño de un byte. Las matrices byte, sbyte y bool tienen elementos con un tamaño de un byte.

Cómo corregir infracciones

Especifique el número de bytes que desea copiar para el argumento count.

Ejemplo

Infracción:

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

Corrección:

Si los elementos de la matriz tienen un tamaño superior a un byte, puede multiplicar la longitud de la matriz por el tamaño del elemento para obtener el número de bytes.

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

Cuándo suprimir las advertencias

Normalmente, NO es seguro suprimir una advertencia de esta regla.

Vea también