Buffer a dimensione fissa (Guida per programmatori C#)
Aggiornamento: novembre 2007
In C# è possibile utilizzare l'istruzione fixed per creare un buffer con una matrice di dimensioni fisse in una struttura di dati. Ciò si rivela particolarmente utile quando si utilizza codice esistente, ad esempio codice scritto in altri linguaggi, DLL preesistenti o progetti COM. La matrice fissa può accettare attributi o modificatori consentiti per i membri struttura normali. L'unica restrizione è rappresentata dal fatto che il tipo di matrice deve essere bool, byte, char, short, int, long, sbyte, ushort, uint, ulong, float o double.
private fixed char name[30];
Note
Nelle versioni precedenti di C# era difficile dichiarare una struttura a dimensione fissa di tipo C++, in quanto una struttura C# contenente una matrice non include gli elementi della matrice, ma piuttosto un riferimento a tali elementi.
In C# 2.0 è stata aggiunta la possibilità di incorporare una matrice di dimensioni fisse in una struttura utilizzata in un blocco di codice unsafe.
Prima della versione 2.0 di C#, ad esempio, l'oggetto struct seguente avrebbe avuto una dimensione di 8 byte con la matrice pathName come riferimento alla matrice allocata sull'heap:
public struct MyArray
{
public char[] pathName;
private int reserved;
}
In C# 2.0 è possibile dichiarare un oggetto struct con una matrice incorporata:
public struct MyArray // This code must appear in an unsafe block
{
public fixed char pathName[128];
}
In questa struttura la matrice pathName prevede una dimensione e una posizione fisse e può pertanto essere utilizzata con altro codice unsafe.
La dimensione della matrice char a 128 elementi è di 256 byte. I buffer char a dimensione fissa accettano sempre due byte per carattere, indipendentemente dalla codifica. Questo vale anche quando viene eseguito il marshalling tra i buffer char e le strutture o i metodi API con CharSet = CharSet.Auto o CharSet = CharSet.Ansi. Per ulteriori informazioni, vedere CharSet.
Un'altra matrice a dimensione fissa comune è la matrice bool. La dimensione degli elementi di una matrice bool è sempre pari a un byte. Le matrici bool non sono adatte alla creazione di matrici di bit o buffer.
Nota: |
---|
A eccezione della memoria creata con stackalloc, il compilatore C# e Common Language Runtime (CLR) non eseguono controlli di sicurezza per sovraccarico del buffer. Come con tutto il codice unsafe, è necessario prestare la massima attenzione. |
I buffer unsafe sono diversi dalle normali matrici per i seguenti motivi:
È possibile utilizzare i buffer unsafe solo in un contesto unsafe.
I buffer unsafe sono sempre vettori, ovvero matrici unidimensionali.
La dichiarazione della matrice deve includere un conteggio, ad esempio char id[8]. Non è invece possibile utilizzare char id[].
I buffer unsafe possono essere solo campi di istanza di strutture in un contesto unsafe.
Vedere anche
Concetti
Riferimenti
Codice unsafe e puntatori (Guida per programmatori C#)