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

时间:2010-04-02 14:56:27

标签: f# mutable let-binding

考虑我的第一次尝试,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,则不会产生错误(一个应该是因为我试图改变该值)。我想我一定错过了一个基本概念。

prop课程中重新绑定/变异Test的正确方法是什么,以便我可以通过单元测试?

3 个答案:

答案 0 :(得分:9)

作为旁注,我可能会使用if .. then而不是match构造,因为它使代码更简洁(当您需要再次测试多个复杂值时,patterh匹配特别有用)模式)。此外,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") 

答案 1 :(得分:8)

试试这个:

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 -> ()
                | _ -> 
                    prop <- value
                    this.OnPropertyChanged("Prop")

您需要使绑定变为可变,然后在您的setter中更改其值。在您的初始代码中,您只是在setter中创建了一个新绑定(也称为prop),因此没有可见的更改。

答案 2 :(得分:5)

在模式匹配中,您实际上是使用

绑定新值
let prop = value

当您使用相同的名称绑定此类值时,它将为新声明的值的范围隐藏另一个值。我相信你真正想要做的是:

prop <- value