2016-04-20 8 views
1

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; 
} 
+0

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) –

+0

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

+0

Diese Frage eignet sich möglicherweise besser für http://programmers.stackexchange.com/ – AlexFoxGill

Antwort

1

Es ist mein Eindruck ist, dass der ganze Sinn der event s ist es, die Kontrolle über die Ereignisse in den einschließenden Typen zu setzen. Es ist nicht Aufgabe der Clients, wann das Ereignis ausgelöst wird. Ein Ereignis ist eine (Sammlung von) Funktion (en), die aufgerufen wird, wenn ein Zustand in einem Typ geändert wird oder wenn etwas Interessantes passiert, auf das Kunden reagieren möchten, aber die genauen Details sollten für die Aus demselben Grund sollten Sie auch keine Felder an Clients weitergeben.

Es gibt nichts inhärent VERRÜCKT damit in dem Sinne, dass es dein Haus in die Luft sprengen wird, aber auf der anderen Seite gibt es keinen Grund, sie so zu benutzen. Ereignisse haben einen Grund in der Sprache, sie haben eine semantische Bedeutung. Wenn Sie anstelle von Ereignissen Action/Func Delegaten verwenden, müssen Personen, die Ihren Code lesen, herausfinden, was zum Teufel Sie tun und warum Sie nicht die herkömmlichen Tools verwenden. Es ist nur Unordnung, also rate ich, es zu vermeiden.

+0

Vielen Dank für Ihren Kommentar, genauso wie ich über dieses Problem denke. Der Grund für meine Frage ist, dass ich ein Software-Training besucht habe und der Trainer auf diese Weise Aktionen durchgeführt hat. Und ich frage mich, was ist der Vorteil davon? Leider konnte der Trainer meine Frage nicht beantworten ... – user2959547

+0

Ja ... und wir sollten unsere eigenen komplexen Klassen/Objekte nicht benutzen ... weil es für andere so verwirrend sein kann ... –

Verwandte Themen