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.993
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
Neuer Beitrag 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.
Neuer Beitrag 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.838


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.
Neuer Beitrag 23.06.2016 10:00 Beiträge des Benutzers | zu Buddylist hinzufügen
witte
myCSharp.de-Mitglied

Dabei seit: 03.09.2010
Beiträge: 867


witte ist offline

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

* Client sollte Publisher heissen
* warum eigentlich keine Events?
Neuer Beitrag 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.993
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
Neuer Beitrag 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. 03.06.2020 20:44