Oföränderlighet
Alla typer i Q# är värdetyper.
Q# inte har något begrepp om en referens eller pekare. I stället kan du tilldela om ett nytt värde till en tidigare deklarerad variabel via en set
-instruktion. Det finns till exempel ingen skillnad i beteende mellan omtilldelningar för variabler av typen Int
eller variabler av typen Int[]
. Överväg följande sekvens med instruktioner:
mutable arr1 = new Int[3];
let arr2 = arr1;
set arr1 w/= 0 <- 3;
Den första instruktionen instansierar en ny matris med heltal [0,0,0]
och tilldelar den till arr1
.
Nästa instruktion tilldelar värdet till en variabel med namnet arr2
. Den sista instruktionen skapar en ny matrisinstans baserat på med samma värden förutom värdet vid index 0 som är inställt på arr1
3. Den nyligen skapade matrisen tilldelas sedan till variabeln arr1
. Den sista raden använder den förkortade syntaxen för evaluate-and-reassign-instruktioner och kan ha skrivits som set arr1 = arr1 w/ 0 <- 1;
.
När du har kört de tre -uttrycken arr1
innehåller det värdet [3,0,0]
medan arr2
det förblir oförändrat och innehåller värdet [0,0,0]
.
Q# särskiljer tydligt ett handtags föränderlighet och beteendet hos en typ. Föränderlighet inom Q# är ett begrepp som gäller för en symbol snarare än en typ eller ett värde. Det gäller för handtaget som gör att du kan komma åt ett värde snarare än själva värdet. Den representeras inte i typsystemet, implicit eller explicit.
Naturligtvis är detta bara en beskrivning av det formellt definierade beteendet; under huven använder den faktiska implementeringen ett referensräkningsschema för att undvika att kopiera minnet så mycket som möjligt. Ändringen görs specifikt på plats så länge det bara finns en giltig handtag som har åtkomst till ett visst värde.