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

不可变性

Q# 中的所有类型都是 值类型。 Q# 没有引用或指针的概念。 相反,它允许通过赋值表达式将新值重新分配给以前声明的变量。 例如,Int 类型的变量或 Int[]类型的变量的重新分配行为没有区别。 请考虑以下语句序列:

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

第一个语句实例化一个新的整数数组 [0,0,0],并将其分配给 arr1。 下一语句将该值分配给名称为 arr2的变量。 最后一个语句基于具有相同值的 arr1 创建新的数组实例,但索引 0 处的值设置为 3。 然后将新创建的数组分配给变量 arr1。 最后一行使用 计算和重新分配语句的缩写语法,并等效地编写为 arr1 = arr1 w/ 0 <- 1;
运行三个语句后,arr1 将包含值 [3,0,0],而 arr2 保持不变,并且包含值 [0,0,0]

因此,Q# 清楚地区分句柄的可变性和类型的行为。 Q# 中的可变性是适用于 符号 而不是类型或值的概念;它适用于允许访问值而不是值本身的句柄。 它 在类型系统中隐式或显式表示。

当然,这只是对正式定义的行为的描述:在后台,实际实现使用引用计数方案,以避免尽可能多地复制内存。 只要只有一个当前有效的句柄访问特定值,就专门进行了修改。