Cómo: Utilizar punteros para copiar una matriz de bytes (Guía de programación de C#)

Actualización: noviembre 2007

El ejemplo siguiente utiliza punteros para copiar bytes de una matriz a otra.

En este ejemplo se utiliza la palabra clave unsafe, que permite el uso de punteros en el método Copy. La instrucción fixed se utiliza para declarar punteros a las matrices de origen y destino. Así se ancla la ubicación de las matrices de origen y destino en memoria, para que no puedan ser desplazadas por la recolección de elementos no utilizados. Estos bloques de memoria se desanclan cuando finaliza el bloque fixed. Dado que la función Copy en este ejemplo utiliza la palabra clave unsafe, se debe compilar con la opción del compilador /unsafe.

Ejemplo

// compile with: /unsafe
class TestCopy
{
    // The unsafe keyword allows pointers to be used within the following method:
    static unsafe void Copy(byte[] src, int srcIndex, byte[] dst, int dstIndex, int count)
    {
        if (src == null || srcIndex < 0 ||
            dst == null || dstIndex < 0 || count < 0)
        {
            throw new System.ArgumentException();
        }

        int srcLen = src.Length;
        int dstLen = dst.Length;
        if (srcLen - srcIndex < count || dstLen - dstIndex < count)
        {
            throw new System.ArgumentException();
        }

        // The following fixed statement pins the location of the src and dst objects
        // in memory so that they will not be moved by garbage collection.
        fixed (byte* pSrc = src, pDst = dst)
        {
            byte* ps = pSrc;
            byte* pd = pDst;

            // Loop over the count in blocks of 4 bytes, copying an integer (4 bytes) at a time:
            for (int i = 0 ; i < count / 4 ; i++)
            {
                *((int*)pd) = *((int*)ps);
                pd += 4;
                ps += 4;
            }

            // Complete the copy by moving any bytes that weren't moved in blocks of 4:
            for (int i = 0; i < count % 4 ; i++)
            {
                *pd = *ps;
                pd++;
                ps++;
            }
        }
    }

    static void Main()
    {
        byte[] a = new byte[100];
        byte[] b = new byte[100];

        for (int i = 0; i < 100; ++i)
        {
            a[i] = (byte)i;
        }

        Copy(a, 0, b, 0, 100);
        System.Console.WriteLine("The first 10 elements are:");

        for (int i = 0; i < 10; ++i) 
        {
            System.Console.Write(b[i] + " ");
        }
        System.Console.WriteLine("\n");
    }
}
/* Output:
    The first 10 elements are:
    0 1 2 3 4 5 6 7 8 9        
*/

Vea también

Tareas

Ejemplo de código no seguro

Conceptos

Guía de programación de C#

Referencia

Código no seguro y punteros (Guía de programación de C#)

/unsafe (Habilitar modo Unsafe) (Opciones del compilador de C#)

Otros recursos

Recolección de elementos no utilizados