3

当记录被扩展(深拷贝?)时,编译器是否在内存中创建一个新位置,或者编译器是否使记录可变并修改值?

例如:

type MyRecord = { A : string
                ; B : string
                }

let record = { A = "A"; B = "B" }

let record = { record with A = "new A" } //copy or overwrite? 

由于我正在覆盖record,编译器会复制还是覆盖?无论哪种方式都存在性能问题吗?

4

2 回答 2

6

它制作副本。

复制和更新记录表达式

*复制和更新记录表达式的详细说明就好像它是一个记录表达式,如下所示:

让 v = expr in { field-label1 = expr1 ; … ; 字段标签 = exprn; F1 = v.F1; ... ; 调频=v.调频}

其中 F1 ... FM 是 R 中未在字段初始化器中定义的字段,v 是一个新变量。*

于 2012-07-23T18:59:43.400 回答
2

type T = {
  A : string
  B : string
}

let x = { A = "a"; B = "b" }
let y = { x with A = "aa" }

相当于这个

class T {
    public readonly string A;
    public readonly string B;
    public T(string a, string b) {
        A = a;
        B = b;
    }
}

var x = new T("a", "b");
var y = new T("aa", x.B);
于 2012-07-23T19:11:24.323 回答