考慮我的第一次嘗試,像下面這樣的簡單類型在F#:如何在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
沒有更改。這種情況對我來說很有意義,因爲如果我從prop
字段中刪除mutable
,則不會生成錯誤(並且應該是因爲我試圖修改該值)。我想我必須錯過一個基本概念。
在Test
類中重新綁定/變異prop
的正確方法是什麼,以便我可以通過我的單元測試?
謝謝,@kvb。沒有什麼讓我覺得自己像一個簡單的解決方案,在語言上像一個n00b。 :) – 2010-04-02 15:00:59
@Greg - 沒問題。綁定和隱藏工作的方式可能需要一些習慣,特別是因爲其他語言做得如此不同。但是,一旦你的思維模式變得直白,我認爲F#方法的優雅就會變得明顯。 – kvb 2010-04-02 15:06:28