Onveranderbaarheid
Alle typen in Q# zijn waardetypen.
Q# heeft geen concept van een verwijzing of aanwijzer. In plaats daarvan kunt u een nieuwe waarde opnieuw toewijzen aan een eerder gedeclareerde variabele via een set
-instructie. Er is bijvoorbeeld geen verschil in gedrag tussen hertoewijzingen voor variabelen van het type Int
of variabelen van het type Int[]
. Houd rekening met de volgende reeks instructies:
mutable arr1 = new Int[3];
let arr2 = arr1;
set arr1 w/= 0 <- 3;
Met de eerste instructie wordt een nieuwe matrix met gehele getallen [0,0,0]
geïnstitueert en toegewezen aan arr1
.
De volgende instructie wijst die waarde toe aan een variabele met de naam arr2
. Met de laatste instructie wordt een nieuwe matrixinstantie gemaakt op arr1
basis van met dezelfde waarden, behalve de waarde bij index 0 die is ingesteld op 3. De zojuist gemaakte matrix wordt vervolgens toegewezen aan de variabele arr1
. De laatste regel maakt gebruik van de verkorte syntaxis voor evaluate-and-reassign-instructies en kan op dezelfde wijze zijn geschreven als set arr1 = arr1 w/ 0 <- 1;
.
Na het uitvoeren van de drie -instructies, arr1
bevat de waarde [3,0,0]
terwijl arr2
deze ongewijzigd blijft en de waarde [0,0,0]
bevat.
Q# maakt duidelijk onderscheid tussen de veranderlijkheid van een handvat en het gedrag van een type. Veranderlijkheid binnen Q# is een concept dat van toepassing is op een symbool in plaats van een type of waarde; het is van toepassing op de greep waarmee u toegang hebt tot een waarde in plaats van de waarde zelf. Het wordt niet impliciet of expliciet weergegeven in het typesysteem.
Natuurlijk is dit slechts een beschrijving van het formeel gedefinieerde gedrag; onder de motorkap maakt de daadwerkelijke implementatie gebruik van een referentie telschema om het kopiëren van geheugen zoveel mogelijk te voorkomen. De wijziging wordt specifiek uitgevoerd zolang er momenteel slechts één geldige ingang is die toegang heeft tot een bepaalde waarde.