Memory 它被复制了吗?传递引用和值类型如何在后台工作

Memory 它被复制了吗?传递引用和值类型如何在后台工作,memory,f#,pass-by-reference,pass-by-value,Memory,F#,Pass By Reference,Pass By Value,我想知道作为参数传递reference和value类型是如何在后台工作的,以及在中是如何执行的 我想知道如何处理重复实例的风险。 而且 我只找到了有关使用的提示。一次又一次。但在本例中,我对不可变的值和引用类型感兴趣 我试着去做实验,但是我没有弄清楚如何找出不可更改的东西的地址位置 let myfun x = printfn "pointer: %A" &x 导致错误的原因: 错误FS0256:值必须是可变的才能改变内容 或者获取值类型的地址,例如“let mutable

我想知道作为参数传递
reference
value
类型是如何在后台工作的,以及在中是如何执行的

我想知道如何处理重复实例的风险。 而且

我只找到了有关使用的提示。一次又一次。但在本例中,我对不可变的值和引用类型感兴趣

我试着去做实验,但是我没有弄清楚如何找出不可更改的东西的地址位置

let myfun x  = 
    printfn "pointer: %A" &x
导致错误的原因:

错误FS0256:值必须是可变的才能改变内容 或者获取值类型的地址,例如“let mutable x=…”


变量作为参数传递时是否复制? 我认为,在处理不可变值时,“复制”参数值是没有意义的

案例1:值类型

案例2:参考类型

案例3:具有可变参数的类

案例4:关闭- 不,它不是复制的

type Test3 () =
    let mutable counter = 10
    member this.DoSomething () = printfn "Hello!"
    member this.Counter = counter
    member this.AddCounter x = 
        counter <- counter + x

let ex = Test3 ()
let closure (x: Test3) = (fun variable ->
                            x.DoSomething ()
                            variable + x.Counter )

let funct = closure ex
let res = funct 20

ex.AddCounter 20
let res2 = funct 20

我怀疑此实现会复制
MailboxProcessor
,导致内存中活动和循环的代理激增。但是,屏幕输出表明情况并非如此。

我理解主要问题是:

“作为参数传递时,[a]变量是否被复制?”

如果所讨论的变量是值类型,则是,除非您特别使用“byref”构造(请参阅)

如果所讨论的变量是引用类型,则否,复制的是引用,而不是引用对象本身。对象是否是不可变的没有区别


因此,一般来说,就像在C#中一样,您不会简单地通过将实例作为参数传递来复制它们。(接收参数的函数当然可以手动复制其参数,例如,通过调用复制构造函数。)

您是否查看了Yes,谢谢。这个链接没有回答这个问题。啊…关闭。闭包没有什么神奇之处。它们只是syntaxic sugar,其中创建一个类来包装lambda,并将关闭的变量传递到新类中。它的传递方式仍然取决于相同的规则。然而,被关闭的东西并不总是显而易见的,而quick通常会关闭它的
这个
。这是为了减少新创建的类的数量。我不完全理解你的例子。有参考资料吗?非常感谢。顺便说一句,我添加了一些代码行,有些代码行是从稍远的地方开始的,但我想在头脑中澄清一下会发生什么。我想知道如何获得值类型的内存地址。尝试了上面的
&
操作符,但没有成功。非常感谢
type Test () = 
    member this.DoSomething () = printfn "Hello!"
let useTestType (x: Test) = x.DoSomething ()    
let testInstance = Test ()
useTestType testInstance
type Test2 () =
    let mutable counter = 10
    member this.DoSomething () = printfn "Hello!"
let useTestType2 (x: Test2) = x.DoSomething ()
type Test3 () =
    let mutable counter = 10
    member this.DoSomething () = printfn "Hello!"
    member this.Counter = counter
    member this.AddCounter x = 
        counter <- counter + x

let ex = Test3 ()
let closure (x: Test3) = (fun variable ->
                            x.DoSomething ()
                            variable + x.Counter )

let funct = closure ex
let res = funct 20

ex.AddCounter 20
let res2 = funct 20
let names = [ "Sensor1"; "Sensor2"; "Sensor3" ]
let bdays = [ "CCH15"; "BBH15"; "AAH15" ]
let dict = List.zip names bdays |> Map.ofList


type MsgToAgent = | Value of string []


let testAgent =
    MailboxProcessor.Start(fun inbox ->
        let rec loop () =
            async { 
                    let! msg = inbox.Receive()
                    match msg with
                    | Value array -> 
                        printfn "Array: %s" (String.concat ", " array)
                    return! loop ()}
        printfn "Hello World"
        loop ())



type DataDispatcher (dictionary) =     

    let available = new Event<Map<string,string>> ()  

    member this.ManualTrigger () = 
        available.Trigger dictionary
    member this.Subscribe (agent: MailboxProcessor<MsgToAgent>, names: string []) = 
        available.Publish.Add (fun dict ->
            let list = 
                names 
                |> Array.map dict.TryFind 
                |> Array.choose id
            agent.Post (Value list) )

let datadispatcher = DataDispatcher(dict)
datadispatcher.Subscribe (testAgent, [| "Sensor1"; "Sensor3" |]) 
datadispatcher.ManualTrigger ()