Niezmienność
Wszystkie typy w programie Q# to typy wartości.
Q# nie ma pojęcia odwołania ani wskaźnika. Zamiast tego umożliwia ponowne przypisanie nowej wartości do wcześniej zadeklarowanej zmiennej za pomocą instrukcji set
. Na przykład nie ma rozróżnienia między ponownym przypisaniami zmiennych typu Int
lub zmiennych typu Int[]
. Rozważ następującą sekwencję instrukcji:
mutable arr1 = new Int[3];
let arr2 = arr1;
set arr1 w/= 0 <- 3;
Pierwsza instrukcja tworzy wystąpienie nowej tablicy liczb całkowitych [0,0,0]
i przypisuje ją do klasy arr1
.
Następna instrukcja przypisuje tę wartość do zmiennej o nazwie arr2
. Ostatnia instrukcja tworzy nowe wystąpienie tablicy na arr1
podstawie tych samych wartości, z wyjątkiem wartości indeksu 0, która jest ustawiona na 3. Nowo utworzona tablica jest następnie przypisywana do zmiennej arr1
. Ostatni wiersz korzysta ze skróconej składni dla instrukcji evaluate-and-reassign i może być również zapisywany jako set arr1 = arr1 w/ 0 <- 1;
.
Po uruchomieniu trzech instrukcji element będzie zawierać wartość[3,0,0]
, arr1
która arr2
pozostaje niezmieniona i zawiera wartość [0,0,0]
.
Q# w ten sposób rozróżnia niezmienność uchwytu i zachowanie typu. Mutability within Q# to pojęcie, które ma zastosowanie do symbolu , a nie typu lub wartości. Dotyczy to uchwytu, który umożliwia dostęp do wartości, a nie do samej wartości. Nie jest reprezentowany w systemie typów, niejawnie ani jawnie.
Oczywiście jest to jedynie opis formalnie zdefiniowanego zachowania; w tle rzeczywista implementacja używa schematu zliczania odwołań, aby uniknąć kopiowania pamięci w możliwie największym stopniu. Modyfikacja jest obowiązuje tak długo, jak tylko jedna aktualnie prawidłowa obsługa, która uzyskuje dostęp do określonej wartości.