considero il mio primo tentativo, un tipo semplice in F # come il seguente:Come implementare correttamente una proprietà in 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")
Ora testare questa via C# (questo oggetto è stato esposto ad un progetto C#, in modo apparente C# semantica è auspicabile):
[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
venga assegnato, la mia F # Setter è in esecuzione, ma la seconda asserzione non riesce a causa del valore sottostante di prop
non viene modificato. Questo tipo di ha senso per me, perché se rimuovo mutable
dal campo prop
, non viene generato alcun errore (e uno dovrebbe essere perché sto cercando di mutare il valore). Penso che mi debba mancare un concetto fondamentale.
Qual è il modo corretto di riassociare/mutare prop
nella classe Test
in modo che possa superare il test dell'unità?
Grazie, @kvb. Niente mi fa sentire come un n00b nella lingua piuttosto che una soluzione tanto semplice. :) –
@Greg - nessun problema. Il modo in cui i binding e gli shadowing possono richiedere un po 'di tempo per abituarsi, in particolare perché le altre lingue fanno le cose in modo così diverso. Tuttavia, una volta ottenuto il modello mentale, penso che l'eleganza dell'approccio di F # sia evidente. – kvb