Mémoires tampons de taille fixe (Guide de programmation C#)
En C#, vous pouvez utiliser l'instruction fixed pour créer un tampon avec un tableau de taille fixe dans une structure de données. Cette action est utile lorsque vous utilisez un code existant, comme le code écrit dans d'autres langages, les DLL préexistantes ou les projets COM. Le tableau fixe peut accepter tous les attributs ou modificateurs qui sont prévus pour les membres de structures régulières. La seule restriction est que le type de tableau doit être bool, byte, char, short, int, long, sbyte, ushort, uint, ulong, float ou double.
private fixed char name[30];
Notes
Dans les premières versions de C#, la déclaration d'une structure de taille fixe de type C++ s'avère difficile car un struct C# qui contient un tableau n'inclut pas les éléments du tableau. Au lieu de cela, le struct contient une référence aux éléments.
C# 2.0 permet également d'incorporer un tableau de taille fixe dans un struct en cas d'utilisation dans un bloc de code unsafe.
Par exemple, avant C# 2.0, le struct suivant avait une taille de 8 octets. Le tableau pathName est une référence au tableau alloué par tas :
public struct MyArray
{
public char[] pathName;
private int reserved;
}
Avec C# 2.0, un struct peut contenir un tableau intégré. Dans l'exemple suivant, le tableau fixedBuffer a une taille fixe. Pour accéder aux éléments du tableau, vous utilisez une instruction fixed pour établir un pointeur vers le premier élément. L'instruction fixed épingle une instance de fixedBuffer à un emplacement spécifique en mémoire.
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';
}
}
}
}
}
La taille du tableau char de 128 éléments est de 256 octets. Les mémoires tampons char de taille fixe occupent toujours deux octets par caractère, quel que soit l'encodage. Cela est vrai même lorsque les mémoires tampons de caractères sont marshalées en fonction de méthodes API ou de structs avec CharSet = CharSet.Auto ou CharSet = CharSet.Ansi. Pour plus d'informations, consultez CharSet.
Un autre tableau de taille fixe courant est le tableau bool. Les éléments dans un tableau bool ont toujours une taille d'un octet. Les tableaux bool ne sont pas appropriés pour la création de tableaux d'octets ou de mémoires tampons.
Notes
À l'exception de la mémoire créée à l'aide de stackalloc, le compilateur C# et le common language runtime (CLR) n'effectuent pas de contrôles du dépassement de mémoire tampon de la sécurité. Comme avec le code unsafe, soyez prudent.
Les mémoires tampons unsafe sont différentes des tableaux normaux :
Vous pouvez utiliser des mémoires tampons unsafe dans un contexte unsafe uniquement.
Les mémoires tampons unsafe sont toujours des vecteurs, ou tableaux unidimensionnels.
La déclaration du tableau doit inclure un compte, tel que char id[8]. Vous ne pouvez pas utiliser char id[] à la place.
Les mémoires tampons unsafe peuvent uniquement être des champs d'instance de structs dans un contexte unsafe.
Voir aussi
Référence
Pointeurs et code unsafe (Guide de programmation C#)
fixed, instruction (référence C#)
Interopérabilité (Guide de programmation C#)