Ich erkannte das Merkmal von C#, dass es möglich ist, eine Aktion oder einen Func wie ein Ereignis zu verwenden. Was ich meine ist, dass ich folgendes tun:Verwenden von Action oder Func wie Ereignisse - schlechte Praxis?
Action aAction;
aAction = DoSomething;
aAction += DoAnotherting;
// execute the action -> both functions will be executed
aAction();
aAction -= DoSomething; // unsubscribe on function
Ich war nicht bewusst, dachte mit + = ist nur möglich für Veranstaltungen. Im ersten Moment sieht das ganz gut aus, da ich das event-Schlüsselwort nicht verwenden muss und diese Aktion auch außerhalb der Besitzerklasse aufrufen kann (was bei Ereignissen nicht möglich ist). Aber ich frage mich, gibt es irgendwelche guten Beispiele für eine solche Verwendung oder ist es nur schlechte Praxis?
Ein komplettes Beispiel wird hier gezeigt:
[TestMethod]
public void DummyTest()
{
DummyClass myInstance = new DummyClass();
int i = 0;
Action action1 =() => i++;
Action action2 =() => i += 2;
Func<int> func1 =() => 5;
myInstance.MyFunc +=() => 3;
myInstance.MyFunc += func1;
Assert.AreEqual(5, myInstance.MyFunc?.Invoke());
myInstance.MyFunc -= func1;
Assert.AreEqual(3, myInstance.MyFunc?.Invoke());
myInstance.MyAction = action1;
myInstance.MyAction += action2;
myInstance.MyAction?.Invoke();
Assert.AreEqual(3, i);
myInstance.MyAction -= action1;
myInstance.MyAction?.Invoke();
Assert.AreEqual(5, i);
myInstance.MyAction =() => i = 0;
myInstance.MyAction?.Invoke();
Assert.AreEqual(0, i);
}
class DummyClass
{
public Action MyAction;
public Func<int> MyFunc;
}
Nicht wirklich. Schau mal hier: [Aktionen] (http://stackoverflow.com/questions/7408744/is-it-bad-practice-to-use-action-and-func-all-the-time-instat-of-making-corresp) –
Ich möchte auf die NodaTime Formatierer verweisen. Ich habe einen Auszug hier extrahiert: https://gist.github.com/Feanathiel/38fbcace35bc3f4f2d48 (basierend auf https://github.com/nodatime/nodatime/blob/69a2cdad9cb4c32a82620eae4f2460ff9479570a/src/NodaTime/Text/Patterns/SteppedPatternBuilder. cs) – Caramiriel
Diese Frage eignet sich möglicherweise besser für http://programmers.stackexchange.com/ – AlexFoxGill