Compartir a través de


Búferes de tamaño fijo (Guía de programación de C#)

En C#, puede utilizar la instrucción fixed para crear un búfer con una matriz de tamaño fijo en una estructura de datos. Esto es útil cuando se trabaja con código existente, como el código escrito en otros lenguajes, archivos DLL preexistentes o proyectos COM. La matriz fija puede tomar cualquiera de los atributos o modificadores permitidos para los miembros de structs normales. La única restricción es que el tipo de matriz debe ser bool, byte, char, short, int, long, sbyte, ushort, uint, ulong, float o double.

private fixed char name[30];

Comentarios

En las primeras versiones de C#, declarar una estructura de tamaño fijo con el estilo de C++ era difícil, porque un struct de C# que contiene una matriz no contiene los elementos de la matriz. En su lugar, el struct contiene una referencia a los elementos.

En C# 2.0 se agregó la capacidad de incrustar una matriz de tamaño fijo en un objeto struct cuando se utiliza en un bloque de código no seguro.

Por ejemplo, antes de C# 2.0, los siguientes struct tendrían 8 bytes de tamaño. La matriz pathName es una referencia a la matriz asignada en el montón:

    public struct MyArray
    {
        public char[] pathName;
        private int reserved;
    }

Comenzando con C# 2.0, un struct puede contener una matriz incrustada. En el siguiente ejemplo, la matriz fixedBuffer tiene un tamaño fijo. Para tener acceso a los elementos de la matriz, use una instrucción fixed para establecer un puntero al primer elemento. La instrucción fixed ancla una instancia de fixedBuffer a una ubicación concreta de la memoria.

namespace FixedSizeBuffers
{
    internal unsafe struct MyBuffer
    {
        public fixed char fixedBuffer[128];
    }

    internal unsafe class MyClass
    {
        public MyBuffer myBuffer = default(MyBuffer);
    }

    internal class Program
    {
        static void Main()
        {
            MyClass myC = new MyClass();

            unsafe
            {
                // Pin the buffer to a fixed location in memory.
                fixed (char* charPtr = myC.myBuffer.fixedBuffer)
                {
                    *charPtr = 'A';
                }
            }
        }
    }
}

El tamaño de la matriz char de 128 elementos es 256 bytes. Los búferes char de tamaño fijo siempre admiten dos bytes por carácter, independientemente de la codificación. Esto es verdadero, incluso cuando los búferes de caracteres se calculan por referencia a los métodos API o structs con CharSet = CharSet.Auto o CharSet = CharSet.Ansi. Para obtener más información, vea CharSet.

Otra matriz de tamaño fijo común es la matriz bool. Los elementos de una matriz bool siempre tienen un byte de tamaño. Las matrices bool no son adecuadas para crear matrices de bits o búferes.

Nota

Con excepción de la memoria creada con stackalloc, el compilador de C# y Common Language Runtime (CLR) no realizan ninguna comprobación de saturación del búfer de seguridad. Como sucede con todo código no seguro, se ha de tener precaución.

Los búferes no seguros son diferentes de las matrices normales en los siguientes puntos:

  • Sólo se pueden utilizar búferes no seguros en un contexto no seguro.

  • Los búferes no seguros siempre son vectores, o matrices unidimensionales.

  • La declaración de la matriz debe incluir un recuento, por ejemplo, char id[8]. No puede utilizar char id[] en su lugar.

  • Los búferes no seguros sólo pueden ser campos de instancias de structs en un contexto no seguro.

Vea también

Referencia

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

fixed (Instrucción, Referencia de C#)

Interoperabilidad (Guía de programación de C#)

Conceptos

Guía de programación de C#