Condividi tramite


Dichiarazioni di tipo

Q# supporta tipi di struct definiti dall'utente. tipi sono simili ai tipi di record in F#; sono non modificabili, ma supportano un costrutto copia e aggiornamento .

Tipi di struct

struct tipi possono contenere solo elementi denominati e non supportano elementi anonimi. È supportata qualsiasi combinazione di elementi denominati, anche se gli elementi non possono essere annidati.

La dichiarazione seguente, ad esempio, definisce un Complex struct con due elementi denominati Real e Imaginary, entrambi di tipo Double:

struct Complex {
    Real : Double,
    Imaginary : Double,
}

È possibile accedere agli elementi contenuti tramite il nome o di decostruzione . Per altre informazioni, vedere accesso agli elementi. È anche possibile accedere a una tupla di tutti gli elementi in cui la forma corrisponde a quella definita nella dichiarazione tramite l'operatore unwrap.

struct tipi sono utili per due motivi. Prima di tutto, purché le librerie e i programmi che usano i tipi definiti accingano agli elementi tramite il nome anziché tramite la decostruzione, il tipo può essere esteso per contenere elementi aggiuntivi in un secondo momento senza interrompere alcun codice di libreria. Per questo motivo, l'accesso agli elementi tramite la decostruzione è in genere sconsigliato.

In secondo luogo, Q# consente di comunicare la finalità e le aspettative per un tipo di dati specifico poiché non esiste alcuna conversione automatica tra valori di due tipi di struct, anche se i tipi di elemento sono identici.

Costruttori di struct

I costruttori per i nuovi tipi di struct vengono generati automaticamente dal compilatore quando legge una definizione di struct. Per lo struct Complex nell'esempio precedente, è possibile creare un'istanza con

let complexPair = Complex(1.4, 2.1);

Le istanze possono anche essere definite dall'utente con la parola chiave new, ad esempio

let complexPair = new Complex { Real = 1.4, Imaginary = 2.1 };

È anche possibile copiare uno struct esistente con la sintassi ...

let copyPair = new Complex { ...complexPair };

Durante la copia, è possibile specificare singoli campi da modificare

let updatedPair = new Complex { ...complexPair, Real = 3.5 };