Laden...

Ist es sinnvoller oder performanter mit Events zu arbeiten?

Erstellt von Frokuss vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.693 Views
F
Frokuss Themenstarter:in
158 Beiträge seit 2015
vor 4 Jahren
Ist es sinnvoller oder performanter mit Events zu arbeiten?

Hallo Leute,
habe da mal eine Frage, was sinnvoller wäre um mit Events zu arbeiten...
Ich habe mir 2 Controls - Liste ( : Panel) und ListenElement ( : Label) - erstellt. Eine Liste kann dabei beliebig viele ListenElemente haben, solange die ID des ListenElementes nur einmal vorkommt. Sprich ich habe mehrere Listen, bei denen ich mittels Drag&Drop die ListenElemente in eine andere Liste kopieren(!) kann.

Dabei ist es nun so, dass die Liste zu 100% von ListenElementen bedeckt ist. Das bedeutet, dass wenn ich etwas Droppen will, dass ganze auf dem ListenElement (Label) geschieht. Und das ist jetzt der Punkt an dem ich nicht weis, was sinnvoller wäre:

1.) Wie ich es aktuell habe:
Da das ListenElement nur Informationen über sich selber hat (z.B: die eigene ID), kann ich das Event zum Droppen nicht im ListenElement erstellen sondern muss dies in der Liste erstellen, die alle Informationen über seine Kinder hat.
Das bedeutet, wenn ein ListenElement in die Liste hinzugefügt wird, weisen ich direkt in der Liste dem ListenElement das DropEvent zu und habe damit alle Informationen aus der Liste zur Verfügung.

2.) Ich bin gestern Abend bei Suche auf einen kleinen Thread hier im Forum gestoßen: Click- und Hover-Events von Label an Parent (Button) weiterleiten?!?
Dort wurde geschrieben, dass es die OnXyz-Methoden gibt. Ich weise jedem ListenElement direkt in seiner Klasse Events hinzu nach folgenden Format:

        private void Evt_DragDrop(object sender, DragEventArgs evt) {
            if(this.Parent != null)
                    this.Parent.OnDragDrop(evt);
        }

und habe dazu dann in meiner Liste nur ein Event, was das ganze dann handelt.

Zusammengefasst:

  • Entweder weise ich jedem ListenElement ein Event in der Liste hinzu, oder
  • ich leite alle Events vom ListenElement an die Liste weiter (wie in dem Code-Beispiel)

Mir gehts ejtzt also eigentlich darum, was sinnvoller wäre, bzw. was performanter wäre... Hoffe ihr könnt mir da weiterhelfen 😃

Gruß Frokuss

C
2.121 Beiträge seit 2010
vor 4 Jahren
  • Entweder weise ich jedem ListenElement ein Event in der Liste hinzu, oder
  • ich leite alle Events vom ListenElement an die Liste weiter (wie in dem Code-Beispiel)

Ist da ein Unterschied? Du machst doch beides.

F
Frokuss Themenstarter:in
158 Beiträge seit 2015
vor 4 Jahren

Naja, ich dachte da gäbe es wohl einen Unterscheid... Aber wenns quas keinen gibt, ist es ja gut 😃

Gruß Frokuss

M
2 Beiträge seit 2011
vor 4 Jahren

Du könntest alternativ auch eine Action verwenden. Diese weist du dann in der Liste dem ListenElement zu.

public Action<DragEventArgs> DropListElement:

private void Evt_DragDrop(object sender, DragEventArgs evt) {
            DropListElement?.Invoke(evt);  // Hier wird dann die zugewiesene Funktion in der Liste aufgerufen
        }

Dann benötigst du in ListElement keine Information über die Liste (Parent).

16.806 Beiträge seit 2008
vor 4 Jahren

Du könntest alternativ auch eine Action verwenden.

Gilt im .NET Umfeld auf diese Art und Weise aber prinzipiell als negativen Weg (manche sagen auch Anti Pattern), weil es den Design Pattern von C# hier bricht.
Die Action hier bringt keinen Vorteil (unterm Strich sogar eher einen Nachteil), auch wenn es technisch funktioniert.

Bezogen auf die Frage, ob es mit Events sinnvoller ist: ja, Events sind in diesem Fall spgar sinvoller als Actions.

F
Frokuss Themenstarter:in
158 Beiträge seit 2015
vor 4 Jahren

Also unabhängig davon, dass ich Action noch nice vorher gehört habe, macht es erstei einmal Sinn das ganze weiterhin mit Events zu lösen.
Aber spielt es eine Rolle, wenn ich alle Events vom Kind auf die Eltern umleite oder ob ich den Kindern direkt durch die Eltern das Event zuordne? Oder ist das im Grunde irrelevant, weil es kaum einen Performence-Unterscheid gäbe?

Gruß Frokuss

16.806 Beiträge seit 2008
vor 4 Jahren

Software Design ist prinzipiell wichtiger als Deine Optimierungen, die in die Kategorie Micro-Optimierungen fallen.
Klar, man behält die Performance im Auge - Micro Optimierungen nimmt man aber dann in Angriff, wenn es notwendig ist.

Ich wette Du hast andere Stellen, die viel mehr ins Gewicht fallen als das hier.

Daher: behalte den .NET Event Pattern im Auge und sorg dafür, dass Du eine gute Struktur hast.
Das ist viel mehr Wert und löst/verhindert i.d.R. u.a. auch Konzeptfehler, die nachher Performance kosten.

M
2 Beiträge seit 2011
vor 4 Jahren

@Abt
Die Action sollte nicht anstelle des Events eingesetzt werden, sondern den Funktionsaufruf im Parent ersetzen, der im geposteten Code verwendet wird. Damit kann die doppelte Abhängigkeit aufgelöst werden. ListElement muss List nicht kennen Lediglich List kennt das ListElement.

Stattdessen kann man natürlich auch an der Stelle einen Event implementieren, den die Liste abonniert und das ListElement feuert.

F
Frokuss Themenstarter:in
158 Beiträge seit 2015
vor 4 Jahren

Ja gut. Da hast du vermutlich recht. dachte nur, wenn ich super viele Events habe, könnte sich das irgendwann etwas deutlicher auswirken.

Gruß Frokuss