どのように私は適切にF#でプロパティを実装していますか?

StackOverflow https://stackoverflow.com/questions/2567299

  •  24-09-2019
  •  | 
  •  

質問

私の最初の試みは、以下のような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#のセマンティクスが望ましい)を介して

次にI試験この

[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#セッターが実行されているが、propの基本となる値が変更されていないため、2番目のアサートが失敗しています。私はmutableフィールドからpropを削除した場合、エラーが発生していないので、作るのこの種のは、私には意味(と私は値を変異しようとしているので、1がでなければなりません)。私は基本的な概念が欠落しなければならないと考えます。

私はユニットテストに合格することができるようにpropクラスで/のmutate Testを再バインドするための正しい方法は何ですか?

役に立ちましたか?

解決

これを試してみてください

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呼ばれる)結合新しいを作成したので、全く変化が見られなかった。

他のヒント

それはコードがより簡潔になります(値agains複数の複雑なパターンをテストする必要がある場合patterhマッチングは特に貴重である)として

は、サイドノートとして、私はおそらく代わりにif .. then構築物のmatchを使用します。また、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") 

あなたのパターンマッチでは、あなたが実際に使用して新しい値を結合している。

let prop = value
あなたが同じ名前を持つこのような値をバインドするときは、

、新たに宣言1の範囲のために他の値をシャドウします。私はあなたが実際にやりたいことは、このであると信じています:

prop <- value
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top