6

考虑我的第一次尝试,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未更改。这种对我来说很有意义,因为如果我mutableprop字段中删除,不会产生错误(应该是因为我试图改变值)。我想我一定错过了一个基本概念。

prop在课堂上重新绑定/变异以Test通过单元测试的正确方法是什么?

4

3 回答 3

9

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

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") 
于 2010-04-02T15:19:57.903 回答
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 中创建了一个新绑定(也称为prop),因此看不到任何更改。

于 2010-04-02T14:59:16.490 回答
5

在您的模式匹配中,您实际上是在绑定一个新值

let prop = value

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

prop <- value
于 2010-04-02T15:02:44.037 回答