myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Code-Reviews » Observer - unsubscribe im Dispose()
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Observer - unsubscribe im Dispose()

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
LaTino LaTino ist männlich
myCSharp.de-Poweruser/ Experte

avatar-4122.png


Dabei seit: 03.04.2006
Beiträge: 2.989
Entwicklungsumgebung: Rider / VS2019 / VS Code
Herkunft: Thüringen


LaTino ist offline

Observer - unsubscribe im Dispose()

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Habe mal wieder ein Stück Code aus einem Review, bei dem ich mir nicht sicher bin, was ich davon halten soll - ein paar Meinungen von euch würden mir helfen.

Es handelt sich um eine sehr einfache Observer-Implementierung mit einem etwas ungewöhnlichen Twist:

C#-Code:
class Client
{
    private List<Subscriber> _subscribers;
    public void Subscibe(Subscriber subscriber) => _subscribers.Add(subscriber);
    public void Unsubscribe(Subscriber subscriber) => _subscribers.Remove(subscriber);
}

class Subscriber : IDisposable
{
   private Client _client;

   public Subscriber(Client client)
   {
        client.Subscribe(this);
        _client = client;
   }

//idisposable-Implementierung, soweit i.o., bis auf...
   protected virtual void Dispose(bool disposing)
   {
        //...irrelevante Zeilen weggelassen, das Übliche halt
        _client.Unsubscribe(this);
   }
}

Ich habe ein ungutes Gefühl dabei - wobei ich den Finger nicht genau auf den Punkt legen kann, der mir Unbehagen verursacht.

Was denkt ihr?

LaTino
23.06.2016 09:24 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
t0ms3n t0ms3n ist männlich
myCSharp.de-Mitglied

Dabei seit: 13.01.2013
Beiträge: 314


t0ms3n ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hmmm ich stell mir folgende Fragen:
- wieso hat der Subscriber überhaupt eine direkte Verbindung zum Client
- warum ist er selbst für das Subscriben/Unsubscriben zuständig

Unabhängig davon würde es mir persönlich nicht gefallen, wenn sofort im Konstruktor subscribed wird und ich gezwungen bin zu disposen um zu unsubscriben.
23.06.2016 09:55 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
FZelle
myCSharp.de-Poweruser/ Experte

Dabei seit: 23.04.2004
Beiträge: 9.828


FZelle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Wenn dein _subscribers die abos in normalen Listen hält ( keine WeakReference ) dann ist das so eigentlich die einzige sichere Möglichkeit keine Speicherlecks zu haben.

Ist übrigens das was ich mal zu dir wegen deterministischem Verhalten zu Dispose sagte.
23.06.2016 10:00 Beiträge des Benutzers | zu Buddylist hinzufügen
witte
myCSharp.de-Mitglied

Dabei seit: 03.09.2010
Beiträge: 848


witte ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

* Client sollte Publisher heissen
* warum eigentlich keine Events?
23.06.2016 10:04 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
LaTino LaTino ist männlich
myCSharp.de-Poweruser/ Experte

avatar-4122.png


Dabei seit: 03.04.2006
Beiträge: 2.989
Entwicklungsumgebung: Rider / VS2019 / VS Code
Herkunft: Thüringen

Themenstarter Thema begonnen von LaTino

LaTino ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von t0ms3n:
Hmmm ich stell mir folgende Fragen:
- wieso hat der Subscriber überhaupt eine direkte Verbindung zum Client
- warum ist er selbst für das Subscriben/Unsubscriben zuständig

Ich habe den Teil stark gekürzt, weil er nicht das Problem betrifft, das ich mit dem Code habe. Das ergibt prinzipiell schon Sinn so - bis auf den Punkt, dass man gezwungen ist, zu disposen, um das Abo zu beenden. Vielleicht hätte ich das noch deutlicher machen sollen - Dispose() ist nicht die einzige Möglichkeit, die subscription zu beenden (sowohl client als auch subscriber bieten dafür entsprechende Schnittstellen).

Der Sinn dahinter ist wohl gewesen, das hier zu ermöglichen:

C#-Code:
using(var tmpSubscriber = new Subscriber(client))
{
    tmpSubscriber.SpecialProperty = blablubb;
    client.DoSomething();
}

Funktioniert soweit natürlich auch. Ich glaube aber, ich halte das irgendwie für einen Missbrauch von Konstruktor und Dispose(). Die Frage ist - ist das nur ein etwas schräger Stil, oder reisst das potenzielle Probleme auf?

@witte: das war exakt meine erste Frage. Ich kann nur vermuten, dass man sicherstellen wollte, dass die Referenzen auf jeden Fall aufgelöst werden - was FZelle schrieb.
Die Benennung hier ist von mir, wie gesagt. Habe nur versucht, das Prinzip mit möglichst wenig Code klar zu machen.

LaTino
23.06.2016 10:09 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 3 Jahre.
Der letzte Beitrag ist älter als 3 Jahre.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 01.04.2020 04:19