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

Actualización: noviembre 2007

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 estructuras 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 versiones anteriores de C#, declarar una estructura de tamaño fijo con el estilo de C++ era difícil, porque una estructura de C# que contiene una matriz no contiene los elementos de la matriz, sino una referencia a ellos.

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 unsafe.

Por ejemplo, antes de C# 2.0, los siguientes objetos struct tendrían un tamaño de 8 bytes, donde la matriz pathName sería una referencia a la matriz asignada por montón:

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

En C# 2.0 es posible declarar un objeto struct con una matriz incrustada:

public struct MyArray // This code must appear in an unsafe block
{
    public fixed char pathName[128];
}

En esta estructura, la matriz pathName es de tamaño y ubicación fijos y, por consiguiente, puede utilizarse con otro código no seguro.

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 estructuras 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 resultan apropiadas 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 estructuras en un contexto no seguro.

Vea también

Conceptos

Guía de programación de C#

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#)