Condividi tramite


Strutture (F#)

Una struttura è un tipo di oggetto compatto che può risultare più efficace rispetto a una classe per i tipi che dispongono di una piccola quantità di dati e presentano un comportamento semplice.

[ attributes ]
type [accessibility-modifier] type-name =
   struct
      type-definition-elements
   end
// or
[ attributes ]
[<StructAttribute>]
type [accessibility-modifier] type-name =
   type-definition-elements

Note

Le strutture sono tipi di valore e vengono pertanto archiviate direttamente nello stack o, se utilizzate come campi o elementi di matrice, inline nel tipo padre. A differenza di classi e record, la semantica delle strutture prevede il passaggio per valore. Ciò significa che sono utili principalmente per piccole aggregazioni di dati a cui si accede e che vengono copiate di frequente.

Nella sintassi precedente sono illustrate due forme. La prima non rappresenta la sintassi leggera, ma è comunque utilizzata frequentemente perché, quando si utilizzano le parole chiave struct e end, è possibile omettere l'attributo StructAttribute, presente nella seconda forma. È possibile abbreviare StructAttribute in Struct.

type-definition-elements nella sintassi precedente rappresenta le dichiarazioni e le definizioni di membro. Le strutture possono disporre di costruttori e campi modificabili e non modificabili e possono dichiarare implementazioni di interfacce e membri. Per ulteriori informazioni, vedere Membri (F#).

Le strutture non possono partecipare all'ereditarietà, non possono contenere associazioni let o do e non possono contenere in modo ricorsivo campi del loro tipo (sebbene possano contenere celle di riferimento che fanno riferimento al loro tipo).

Poiché le strutture non consentono le associazioni let, è necessario dichiarare i campi nelle strutture utilizzando la parola chiave val. La parola chiave val definisce un campo e il relativo tipo, ma non consente l'inizializzazione. Le dichiarazioni val vengono invece inizializzate su un valore zero o Null. Per questo motivo, le strutture che dispongono di un costruttore implicito (ovvero, parametri forniti immediatamente dopo il nome della struttura nella dichiarazione) richiedono che le dichiarazioni val vengano annotate con l'attributo DefaultValue. Le strutture per le quali è definito un costruttore supportano comunque l'inizializzazione su zero. L'attributo DefaultValue è pertanto una dichiarazione che indica che tale valore zero è valido per il campo. I costruttori impliciti per le strutture non eseguono alcuna azione in quanto le associazioni let e do sono consentite per il tipo, ma i valori dei parametri del costruttore implicito passati sono disponibili come campi privati.

I costruttori espliciti potrebbero comportare l'inizializzazione dei valori di campo. Quando si dispone di una struttura con un costruttore esplicito, l'inizializzazione su zero è comunque supportata. L'attributo DefaultValue non viene tuttavia utilizzato nelle dichiarazioni val in quanto è in conflitto con il costruttore esplicito. Per ulteriori informazioni sulle dichiarazioni val, vedere Campi espliciti: parola chiave val (F#).

Gli attributi e i modificatori di accessibilità sono consentiti nelle strutture e seguono le stesse regole di quelle per gli altri tipi. Per ulteriori informazioni, vedere Attributi (F#) e Controllo di accesso (F#).

Negli esempi di codice seguenti vengono illustrate le definizioni di strutture.

// In Point3D, three immutable values are defined.
// x, y, and z will be initialized to 0.0.
type Point3D =
   struct
      val x: float
      val y: float
      val z: float
   end

// In Point2D, two immutable values are defined.
// Point2D has an explicit constructor.
// You can create zero-initialized instances of Point2D, or you can
// pass in arguments to initialize the values.
type Point2D =
   struct
      val X: float
      val Y: float
      new(x: float, y: float) = { X = x; Y = y }
   end

Vedere anche

Riferimenti

Classi (F#)

Record (F#)

Concetti

Membri (F#)

Altre risorse

Riferimenti per il linguaggio F#