gpt4 book ai didi

F# 属性设计

转载 作者:行者123 更新时间:2023-12-04 13:09:42 25 4
gpt4 key购买 nike

因此,据我所知,当我在我的 F# 代码中创建一些属性时,因为 F# 不支持自动属性。我必须创建支持字段并将它们初始化为 null,这在函数式编程术语中似乎不正确。例如


let mutable albums : DbSet = null
let mutable genres : DbSet = null



member x.Albums
with get() = albums
and set(value) = albums <- value


member x.Genres
with get() = genres
and set (value) = genres <- value

有没有更好的方法来做到这一点?非常感谢您的建议。

最佳答案

当您需要可变属性时,F# 不支持自动属性,但当您只需要只读属性时,它支持轻量级语法。如果您正在编写一些功能代码,那么使用只读属性实际上可能更合适:

type Music(genres : DbSet, albums : DbSet) = 
member x.Albums = albums
member x.Genres = genres

这与 pad 建议的记录基本相同,但如果您想更好地控制类型的外观(以及它们在 C# 中的显示方式,或用于数据绑定(bind)),它可能更合适。

如果 DbSet是可变类型,那么您可能只需使用上述类型并将其初始化一次(您仍然可以修改 DbSet 值)。如果要更改 DbSet值,您可以添加一个返回克隆对象的方法:
  member x.WithAlbums(newAlbums) = 
Music(genres, newAlbums)

使用 nullUnchecked.defaultOf<_>在 F# 中被认为是一种非常糟糕的做法,您应该始终尝试创建完全初始化的对象。如果该值可能丢失,您可以使用 option类型来表示它,但是您必须始终为缺失值编写处理程序,以使您的程序安全。

关于F# 属性设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9190059/

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