Neproměnlivost
Všechny typy v Q# jsou typy hodnot.
Q# nemá koncept odkazu nebo ukazatele. Místo toho umožňuje znovu přiřadit novou hodnotu dříve deklarované proměnné pomocí výrazu přiřazení. Například neexistuje rozdíl v chování mezi opětovným přiřazením proměnných typu Int
nebo proměnných typu Int[]
. Představte si následující posloupnost příkazů:
mutable arr1 = new Int[3];
let arr2 = arr1;
arr1 w/= 0 <- 3;
První příkaz vytvoří instanci nového pole celých čísel [0,0,0]
a přiřadí ho arr1
.
Další příkaz přiřadí hodnotu proměnné s názvem arr2
. Poslední příkaz vytvoří novou instanci pole na základě arr1
se stejnými hodnotami s výjimkou hodnoty indexu 0, která je nastavena na hodnotu 3. Nově vytvořené pole se pak přiřadí proměnné arr1
. Poslední řádek používá zkrácenou syntaxi pro příkazy evaluate-and-reassigna může být ekvivalentní jako arr1 = arr1 w/ 0 <- 1;
.
Po spuštění těchto tří příkazů bude arr1
obsahovat hodnotu [3,0,0]
, zatímco arr2
zůstane beze změny a obsahuje hodnotu [0,0,0]
.
Q# jasně rozlišuje proměnlivost popisovače a chování typu. Mutability within Q# is a concept that applies to a symbol than a type or value; vztahuje se na popisovač, který umožňuje přístup k hodnotě, nikoli k samotné hodnotě. Je není reprezentován v systému typů implicitně nebo explicitně.
Samozřejmě je to pouze popis formálně definovaného chování; skutečná implementace používá schéma počítání odkazů, aby se zabránilo kopírování paměti co nejvíce. Úpravy se provádějí konkrétně, pokud existuje pouze jeden aktuálně platný popisovač, který přistupuje k určité hodnotě.