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 ()