【问题标题】:How to initialize a struct with both a mutable and an immutable field?如何使用可变字段和不可变字段初始化结构?
【发布时间】:2014-05-25 02:52:26
【问题描述】:

到目前为止,我读过的所有结构示例要么是所有字段都是可变的,要么是所有字段都是不可变的。因此,这编译得很好:

[<Struct>]
type Number(x:int) =
    member this.X = x

这也是如此:

[<Struct>]
type Number =
    val mutable X:int
    new(x) = {X = x}

但是,我不知道如何为具有一个可变字段和一个不可变字段的结构编写显式构造函数:

[<Struct>]
type Numbers(x:int) =
    member this.X = x
    val mutable Y:int
    new(x,y) = ???

显式构造函数必须清楚地调用隐式构造函数。到目前为止,我尝试过的所有天真的解决方案都失败了。

一个后续问题:解决方案,不管它是什么,是否将字段 Y 分配一次或两次(首先使用默认值)?

【问题讨论】:

    标签: f# c#-to-f#


    【解决方案1】:

    第二个示例中使用的显式构造语法适用于所有结构,无论它们是否具有可变字段。

    我们也可以重写第一个示例以使用该语法,尽管它看起来不太美观。还有一个技术区别在于member this.X 定义了一个属性,而val X 定义了一个字段。

    在第三种情况下,你会这样写:

    [<Struct>]
    type Numbers =
        val X : int
        val mutable Y : int
        new(x, y) = { X = x; Y = y }
    

    这只会显式分配一次Y

    【讨论】:

    • 谢谢! val Xmember this.X 仅在使用的构造函数上有所不同吗?如果是这样,为什么微软在msdn.microsoft.com/en-us/library/dd469494.aspx 中说“显式字段不适合日常使用”?
    • 实际上,member this.X 是 /property/,而不是字段 - 尽管编译器最终会将构造函数参数 x 放入字段中,以便属性实现可以访问它。所以它们是两个完全不同的东西,即使它们看起来一样。我应该在我的回答中提到这一点,我会编辑它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    相关资源
    最近更新 更多