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変更されていないため、2番目のアサートが失敗しています。mutableこの種の意味は、フィールドから削除してpropもエラーが生成されないためです(値を変更しようとしているため、エラーが発生するはずです)。基本的な考え方が欠けているに違いないと思います。

単体テストに合格できるよう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")

バインディングを変更可能にしてから、セッターでその値を変更する必要があります。prop最初のコードでは、セッター内に新しいバインディング(とも呼ばれます)を作成しているだけなので、変更は表示されませんでした。

于 2010-04-02T14:59:16.490 に答える
5

パターンマッチでは、実際に新しい値をバインドしています

let prop = value

このような値を同じ名前でバインドすると、新しく宣言された値のスコープのもう一方の値がシャドウされます。私はあなたが実際にやりたいことはこれだと信じています:

prop <- value
于 2010-04-02T15:02:44.037 に答える