Condividi tramite


Immutabilità

Tutti i tipi in Q# sono tipi valore . Q# non ha un concetto di riferimento o puntatore. Consente invece di riassegnare un nuovo valore a una variabile dichiarata in precedenza tramite un'espressione di assegnazione. Ad esempio, non esiste alcuna distinzione nel comportamento tra riassegnazioni per le variabili di tipo Int o variabili di tipo Int[]. Si consideri la sequenza di istruzioni seguente:

    mutable arr1 = new Int[3];
    let arr2 = arr1;
    arr1 w/= 0 <- 3;

La prima istruzione crea un'istanza di una nuova matrice di numeri interi [0,0,0] e la assegna a arr1. L'istruzione successiva assegna tale valore a una variabile con nome arr2. L'ultima istruzione crea una nuova istanza di matrice basata su arr1 con gli stessi valori, ad eccezione del valore in corrispondenza dell'indice 0 impostato su 3. La matrice appena creata viene quindi assegnata alla variabile arr1. L'ultima riga usa la sintassi abbreviata per istruzioni evaluate-and-reassigne potrebbe essere stata scritta in modo equivalente come arr1 = arr1 w/ 0 <- 1;.
Dopo aver eseguito le tre istruzioni, arr1 conterrà il valore [3,0,0] mentre arr2 rimane invariato e contiene il valore [0,0,0].

Q# chiaramente distingue la mutabilità di un handle e il comportamento di un tipo. La mutabilità all'interno di Q# è un concetto che si applica a un simbolo anziché a un tipo o valore; si applica all'handle che consente di accedere a un valore anziché al valore stesso. È non rappresentato nel sistema dei tipi, in modo implicito o esplicito.

Naturalmente, si tratta semplicemente di una descrizione del comportamento formalmente definito; sotto le quinte, l'implementazione effettiva usa uno schema di conteggio dei riferimenti per evitare di copiare la memoria il più possibile. La modifica viene eseguita in modo specifico, purché vi sia un solo handle attualmente valido che accede a un determinato valore.