どのように私は適切にF#でプロパティを実装していますか?
-
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
を使用します。また、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")
あなたのパターンマッチでは、あなたが実際に使用して新しい値を結合している。
let prop = value
あなたが同じ名前を持つこのような値をバインドするときは、、新たに宣言1の範囲のために他の値をシャドウします。私はあなたが実際にやりたいことは、このであると信じています:
prop <- value
所属していません StackOverflow