Teilen über


Unveränderlichkeit

Alle Typen in Q# sind Werttypen. Q# beinhaltet kein Konzept für einen Verweis oder Zeiger. Stattdessen ermöglicht das Programm das erneute Zuweisen eines neuen Werts zu einer zuvor deklarierten Variablen über eine set-Anweisung. Es gibt keinen Verhaltensunterschied zwischen Neuzuweisungen für Variablen vom Typ Int oder Variablen vom Typ Int[]. Sehen Sie sich die folgende Anweisungssequenz an:

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

Die erste Anweisung instanziiert ein neues Array von ganzen Zahlen ([0,0,0]) und weist es arr1 zu. Die nächste Anweisung weist diesen Wert einer Variablen mit dem Namen arr2 zu. Die letzte Anweisung erstellt eine neue Arrayinstanz basierend auf arr1 mit den gleichen Werten (mit Ausnahme des Werts am Index 0, der auf „3“ festgelegt wird). Das neu erstellte Array wird dann der Variablen arr1 zugewiesen. Die letzte Zeile verwendet die abgekürzte Syntax für evaluate-and-reassign-Anweisungen und könnte entsprechend als set arr1 = arr1 w/ 0 <- 1; geschrieben worden sein.
Nach dem Ausführen der drei Anweisungen enthält arr1 den Wert [3,0,0], während arr2 unverändert bleibt und den Wert [0,0,0] enthält.

Q# unterscheidet somit eindeutig die Veränderlichkeit eines Handles und das Verhalten eines Typs. Veränderlichkeit in Q# ist ein Konzept, das für ein Symbol und nicht für einen Typ oder Wert gilt. Es gilt für das Handle, das es ermöglicht, auf einen Wert zuzugreifen, und nicht für den Wert selbst. Es wird nicht im Typsystem dargestellt, weder implizit noch explizit.

Dies ist natürlich nur eine Beschreibung des formal definierten Verhaltens. Im Rahmen der eigentlichen Implementierung wird im Hintergrund ein Referenzzählungsschema verwendet, um das Kopieren in den Arbeitsspeicher so weit wie möglich zu vermeiden. Die Änderung erfolgt explizit an Ort und Stelle, solange nur ein derzeit gültiges Handle für den Zugriff auf einen bestimmten Wert verfügbar ist.