Onveranderbaarheid
Alle typen in Q# zijn waardetypen.
Q# heeft geen concept van een verwijzing of verwijzing. In plaats daarvan kunt u een nieuwe waarde opnieuw toewijzen aan een eerder gedeclareerde variabele via een toewijzingsexpressie. Er is bijvoorbeeld geen onderscheid 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;
arr1 w/= 0 <- 3;
Met de eerste instructie wordt een nieuwe matrix met gehele getallen geïnstitueert [0,0,0]
en toegewezen aan arr1
.
Met de volgende instructie wordt die waarde toegewezen aan een variabele met de naam arr2
. Met de laatste instructie wordt een nieuw matrixexemplaren gemaakt op basis van arr1
met dezelfde waarden, met uitzondering van 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 instructies voor evalueren en opnieuw toewijzen, en kan equivalent zijn geschreven als arr1 = arr1 w/ 0 <- 1;
.
Nadat de drie instructies zijn uitgevoerd, bevat arr1
de waarde [3,0,0]
terwijl arr2
ongewijzigd blijft en de waarde [0,0,0]
bevat.
Q# de muteerbaarheid van een handgreep en het gedrag van een type duidelijk onderscheiden. Mutabiliteit binnen Q# is een concept dat van toepassing is op een symbool in plaats van een type of waarde; deze is van toepassing op de ingang waarmee u toegang hebt tot een waarde in plaats van tot de waarde zelf. Het wordt niet weergegeven in het typesysteem, impliciet of expliciet.
Natuurlijk is dit slechts een beschrijving van het formeel gedefinieerde gedrag; onder de motorkap maakt de daadwerkelijke implementatie gebruik van een referentietelschema om het kopiëren van geheugen zoveel mogelijk te voorkomen. De wijziging wordt specifiek uitgevoerd zolang er slechts één geldige ingang is die toegang heeft tot een bepaalde waarde.