在我的代码中,我通过引用传递了一些结构,将它们声明为可变并使用&
符号。问题是在某些地方字段已损坏(仅在发布模式下发生),我完全不知道为什么。
我找到了一个修复方法,使用 ref 关键字而不是地址运算符。我知道您可以自由交换它们(在实例成员参数的情况下),但为什么它解决了我的问题?
这是一个说明这一点的小代码示例:
[<Struct>]
type MyStruct =
val mutable private i : int
val mutable private f : float
new (a, b) = { i = a; f = b }
member t.I = t.i
member t.F = t.f
type Printer () =
member t.Print(data : MyStruct byref) = printfn "%d %f" data.I data.F
let bar (p : Printer) =
let mutable x = new MyStruct(2, 8.0)
p.Print(&x)
let foo (p : Printer) =
let mutable y = new MyStruct(2, 8.0)
p.Print(ref y) // What is exactly the difference, under the hood?
let main () =
foo (new Printer())
bar (new Printer())
do main ()
使用 byref 传递结构似乎仅对互操作场景有用,或者如果您想改变结构的字段。然而,这不是我的情况。我是否应该考虑按值传递结构类型(大约 20 个字节左右)?
谢谢!