gpt4 book ai didi

.net - F# 处理值和引用

转载 作者:行者123 更新时间:2023-12-04 19:32:11 25 4
gpt4 key购买 nike

我需要了解有关F#的一些非常重要的知识:它如何处理引用和值。
我知道 F# 定义了不可变和可变对象,也知道原因。

但是有一件事我不知道:对象是如何处理的?

我的意思是,在 C# 中,一切都是一个指针,当将另一个对象的引用分配给一个对象时,数据是相同的,我们将有两个指针指向相同的数据。

所以在 C# 中,如果我有这个:

Object myobj1 = new Object();
Object myobj2 = myobj1;
bool myobj1 == myobj2; // It is true

那么,f# 怎么样?
let myvar: MyObj = new MyObj ()
let myvar2: MyObj = myvar

这是什么情况
作业是否涉及复制?或不。

而且,一般来说,这个主题的 f# 方法是什么? (我的意思是值(value)与引用)。

最佳答案

使用引用类型和值类型时,F#的行为类似于C#。

  • 当您具有引用类型时,它将与对堆中实例的引用一起使用。
  • 当您具有值类型(内置,使用Struct属性在C#中声明或在F#中声明)时,
    当您将值分配给另一个值或作为参数传递时,将复制该值。

  • 唯一显着的区别是标准F#类型(区分的联合,记录,列表,数组和元组)具有结构相等的语义。这意味着通过比较存储在其中的实际值而不是通过比较引用(即使它们是引用类型)来比较它们。例如,如果创建两个包含相同数据的元组列表,则会得到:
    > let l1 = [ ("Hello", 0); ("Hi", 1) ]
    let l2 = [ ("Hi", 1); ("Hello", 0) ] |> List.rev;;
    (...)

    > l1 = l2;;
    val it : bool = true

    即使列表和元组是引用类型,您也会得到 true。但是,如果您比较引用(编辑:添加了受kvb启发的示例):
    > System.Object.ReferenceEquals(l1, l2);;
    val it : bool = false

    在F#中使用结构相等是有意义的,因为类型是不可变的-创建包含相同数据的两个值时,它们将始终相同。如果它们是可变的,则可以更改它们,而它们将不再相等-这就是为什么对可变类型使用引用相等更有意义的原因。

    关于.net - F# 处理值和引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4986111/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com