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'istruzione set . 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; 
    set 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 le istruzioni di valutazione e riassegnazione e potrebbe essere stata scritta in modo equivalente come set 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# distingue chiaramente la modificabilità di un handle e il comportamento di un tipo. La mutabilità all'interno Q# di è 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 di tipi, in modo implicito o esplicito.

Naturalmente, si tratta semplicemente di una descrizione del comportamento formalmente definito, dietro 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 specificamente purché vi sia un solo handle attualmente valido che accede a un determinato valore.