在我的代碼中,我通過引用傳遞了一些結構,聲明它們是可變的並使用&
符號。問題是,在某些地方,這些字段已損壞(僅在發佈模式下發生),我不知道爲什麼。地址和ref操作符之間的差異
我發現一個修復,使用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()
傳遞結構與按地址似乎有用的,只有互操作的情況,或者如果你想變異結構的領域。但這不是我的情況。我應該考慮通過值來傳遞結構類型(約20字節左右)嗎?
謝謝!
我對F#不太瞭解,所以很遺憾沒有答案給你。但我認爲避免這個問題的一種方法不是使用可變結構的邪惡。 – Joren 2010-10-23 15:27:04