Módosíthatatlanság
A-ben minden Q# típus értéktípus.
Q# nem rendelkezik hivatkozással vagy mutatóval. Ehelyett lehetővé teszi egy új érték hozzárendelését egy korábban deklarált változóhoz egy set
utasítással. Például nincs különbség a típus vagy típusú változók újrahozzárendelései Int
Int[]
között. Vegye figyelembe a következő utasítások sorozatát:
mutable arr1 = new Int[3];
let arr2 = arr1;
set arr1 w/= 0 <- 3;
Az első utasítás egy új egész számtömböt [0,0,0]
példányosít, és hozzárendeli a függvényhez arr1
.
A következő utasítás hozzárendeli ezt az értéket egy nevű arr2
változóhoz. Az utolsó utasítás létrehoz egy új tömbpéldányt arr1
ugyanazokkal az értékekkel, kivéve a 0 index értékét, amely 3-ra van állítva. Az újonnan létrehozott tömb ezután hozzá lesz rendelve a változóhoz arr1
. Az utolsó sor a rövidített szintaxist használja az evaluate-and-reassign utasításokhoz, és ennek megfelelően a következőként set arr1 = arr1 w/ 0 <- 1;
lett megírva: .
A három utasítás futtatása után a az értéket [3,0,0]
fogja tartalmazni, arr1
miközben arr2
változatlan marad, és a értéket [0,0,0]
tartalmazza.
Q# egyértelműen megkülönbözteti a leírók módosíthatóságát és a típus viselkedését. A belül Q# a módosíthatóság olyan fogalom, amely nem típusra vagy értékre, hanem szimbólumra vonatkozik; a leíróra vonatkozik, amely lehetővé teszi egy érték elérését, és nem magához az értékhez. Nem jelenik meg a típusrendszerben, implicit módon vagy explicit módon.
Természetesen ez csupán a formálisan meghatározott viselkedés leírása; a motorháztető alatt a tényleges megvalósítás hivatkozásszámlálási sémát használ a memória lehető legnagyobb mértékű másolásának elkerülése érdekében. A módosítás kifejezetten a helyén történik, feltéve, hogy csak egy érvényes leíró fér hozzá egy bizonyos értékhez.