Share via


不變性

Q# 中的所有型別是「實值型別」。 Q# 沒有參考或指標的概念。 相反地,它可讓您透過 set 語句,將新值重新指派給先前宣告的變數。 例如,在重新指派類型 Int 變數或 類型 Int[]變數之間的行為沒有區別。 請考慮下列語句序列:

    mutable arr1 = new Int[3];
    let arr2 = arr1; 
    set arr1 w/= 0 <- 3; 

第一個語句會具現化整數的新數位, [0,0,0] 並將它指派給 arr1。 下一個語句會將該值指派給名稱為 arr2的變數。 最後一個語句會根據 arr1 相同值建立新的數位實例,但索引0的值設定為3除外。 然後,新建立的陣列會指派至變數 arr1。 最後一行會使用評估和重新指派陳述式的縮寫語法,而且可能會以同樣的方式寫成 set arr1 = arr1 w/ 0 <- 1;
執行三個 語句之後, arr1 將會包含 值 [3,0,0] ,同時 arr2 維持不變,並包含 值 [0,0,0]

因此,Q# 會明確區分控制代碼的可變動性和型別的行為。 內的 Q# 可變動性是套用至 符號 而非類型或值的概念;它適用於可讓您存取值而非值本身的句柄。 其在型別系統中「不會」以隱含或明確的方式表示。

當然,這只是正式定義行為的描述;其實,實際實作會使用參考計數配置,盡可能避免複製記憶體。 只要只有一個目前有效的句柄可以存取特定值,修改就特別完成。