gpt4 book ai didi

f# - 如何在 F# 中正确实现属性?

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

考虑我的第一次尝试,F# 中的一个简单类型,如下所示:

type Test() =
inherit BaseImplementingNotifyPropertyChangedViaOnPropertyChanged()
let mutable prop: string = null
member this.Prop
with public get() = prop
and public set value =
match value with
| _ when value = prop -> ()
| _ ->
let prop = value
this.OnPropertyChanged("Prop")

现在我通过 C# 测试它(这个对象被暴露给一个 C# 项目,所以明显的 C# 语义是可取的):
[TestMethod]
public void TaskMaster_Test()
{
var target = new FTest();
string propName = null;
target.PropertyChanged += (s, a) => propName = a.PropertyName;
target.Prop = "newString";

Assert.AreEqual("Prop", propName);
Assert.AreEqual("newString", target.Prop);

return;
}
propName已正确分配,我的 F# Setter 正在运行,但第二个断言失败,因为 prop 的基础值没有改变。这对我来说很有意义,因为如果我删除 mutable来自 prop字段,不会产生错误(应该是因为我试图改变值)。我想我一定错过了一个基本概念。

重新绑定(bind)/变异的正确方法是什么 propTest上课,这样我就可以通过我的单元测试?

最佳答案

作为旁注,我可能会使用 if .. then而不是 match构造,因为它使代码更简洁(当您需要针对多个复杂模式测试值时,模式匹配特别有值(value))。另外,publicmember 的默认访问权限,因此您可以使代码更简洁:

type Test() = 
inherit BaseImplementingNotifyPropertyChangedViaOnPropertyChanged()
let mutable prop : string = null
member this.Prop
with get() = prop
and set(value) =
if value <> prop then
prop <- value
this.OnPropertyChanged("Prop")

关于f# - 如何在 F# 中正确实现属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2567299/

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