Mémoires tampons de taille fixe (Guide de programmation C#)Fixed Size Buffers (C# Programming Guide)

En C#, vous pouvez utiliser l’instruction fixed pour créer une mémoire tampon avec un tableau de taille fixe dans une structure de données.In C#, you can use the fixed statement to create a buffer with a fixed size array in a data structure. Les mémoires tampons de taille fixe sont utiles quand vous écrivez des méthodes qui sont interopérables avec les sources de données d’autres langages ou plateformes.Fixed size buffers are useful when you write methods that interop with data sources from other languages or platforms. Le tableau fixe peut accepter tous les attributs ou modificateurs qui sont autorisés pour les membres de structures régulières.The fixed array can take any attributes or modifiers that are allowed for regular struct members. La seule restriction est que le tableau doit être de type bool, byte, char, short, int, long, sbyte, ushort, uint, ulong, float ou double.The only restriction is that the array type must be bool, byte, char, short, int, long, sbyte, ushort, uint, ulong, float, or double.

private fixed char name[30];

NotesRemarks

Dans du code safe, un struct C# qui contient un tableau ne contient pas les éléments du tableau.In safe code, a C# struct that contains an array does not contain the array elements. Le struct contient une référence aux éléments du tableau.Instead, the struct contains a reference to the elements. Vous pouvez incorporer un tableau de taille fixe dans un struct quand il est utilisé dans un bloc de code unsafe.You can embed an array of fixed size in a struct when it is used in an unsafe code block.

Le struct suivant a une taille de 8 octets.The following struct is 8 bytes in size. Le tableau pathName est une référence :The pathName array is a reference:

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

Un struct peut contenir un tableau incorporé dans du code unsafe.A struct can contain an embedded array in unsafe code. Dans l’exemple suivant, le tableau fixedBuffer a une taille fixe.In the following example, the fixedBuffer array has a fixed size. Utilisez une instruction fixed pour établir un pointeur vers le premier élément.You use a fixed statement to establish a pointer to the first element. Accédez aux éléments du tableau par le biais de ce pointeur.You access the elements of the array through this pointer. L’instruction fixed épingle le champ de l’instance fixedBuffer à un emplacement spécifique de la mémoire.The fixed statement pins the fixedBuffer instance field to a specific location in memory.

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

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

private static void AccessEmbeddedArray()
{
    MyClass myC = new MyClass();

    unsafe
    {
        // Pin the buffer to a fixed location in memory.
        fixed (char* charPtr = myC.myBuffer.fixedBuffer)
        {
            *charPtr = 'A';
        }
        // Access safely through the index:
        char c = myC.myBuffer.fixedBuffer[0];
        Console.WriteLine(c);
        // modify through the index:
        myC.myBuffer.fixedBuffer[0] = 'B';
        Console.WriteLine(myC.myBuffer.fixedBuffer[0]);
    }

}

La taille du tableau char de 128 éléments est de 256 octets.The size of the 128 element char array is 256 bytes. Les mémoires tampons char de taille fixe acceptent toujours deux octets par caractère, quel que soit l’encodage.Fixed size char buffers always take two bytes per character, regardless of the encoding. Ceci est vrai même lorsque les mémoires tampons char sont marshalées vers des méthodes ou des structs d’API avec CharSet = CharSet.Auto ou CharSet = CharSet.Ansi.This is true even when char buffers are marshaled to API methods or structs with CharSet = CharSet.Auto or CharSet = CharSet.Ansi. Pour plus d'informations, consultez CharSet.For more information, see CharSet.

L’exemple précédent montre comment accéder aux champs fixed sans épinglage, ce qui est possible à compter de C# 7.3.The preceding example demonstrates accessing fixed fields without pinning, which is available starting with C# 7.3.

Un autre tableau courant de taille fixe est le tableau bool.Another common fixed-size array is the bool array. La taille des éléments d’un tableau bool est toujours d’un octet.The elements in a bool array are always one byte in size. Les tableaux bool ne conviennent pas à la création de tableaux d’octets ou de mémoires tampons.bool arrays are not appropriate for creating bit arrays or buffers.

Notes

Le compilateur C# et le common language runtime (CLR) ne contrôlent pas le dépassement de la mémoire tampon de sécurité, sauf pour la mémoire créée à l’aide de stackalloc.Except for memory created by using stackalloc, the C# compiler and the common language runtime (CLR) do not perform any security buffer overrun checks. Comme toujours pour le code unsafe, la prudence est recommandée.As with all unsafe code, use caution.

Les mémoires tampons unsafe diffèrent des tableaux normaux à différents niveaux :Unsafe buffers differ from regular arrays in the following ways:

  • Les mémoires tampons unsafe peuvent uniquement être utilisées dans un contexte unsafe.You can only use unsafe buffers in an unsafe context.
  • Les mémoires tampons unsafe sont toujours des vecteurs ou des tableaux unidimensionnels.Unsafe buffers are always vectors, or one-dimensional arrays.
  • La déclaration du tableau doit inclure un nombre, tel que char id[8].The declaration of the array should include a count, such as char id[8]. Vous ne pouvez pas utiliser char id[].You cannot use char id[].
  • Les mémoires tampons unsafe peuvent uniquement être des champs d’instance de structs dans un contexte unsafe.Unsafe buffers can only be instance fields of structs in an unsafe context.

Voir aussiSee also