私のコードでは、参照によっていくつかの構造体を渡し、それらを変更可能であると宣言し、&
シンボルを使用しています。問題は、ある場所でフィールドが壊れていることです (リリース モードでのみ発生します)。その理由はまったくわかりません。
address-of 演算子の代わりに 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 バイト程度) で構造型を渡すことを検討する必要がありますか?
ありがとう!