你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

不可变性

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# 中的可变性是一个适用于符号而不是类型或值的概念;它适用于允许访问值的句柄,而不适用于值本身。 它不会在类型系统中隐式或显式表示。

当然,这只是正式定义的行为的说明;在幕后,实际的实现使用引用计数方案来尽可能避免复制内存。 只要当前只有一个访问特定值的有效句柄,就会专门在原处完成修改。