diverse Probleme mit ClipboardWatcher (hauptsächlich Dispose)

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 45 Antworten in diesem Thema. Der letzte Beitrag () ist von Trade.

    btw: Interfaces sind Schnittstellen, welche immer mit einem I am Anfang des Namens gekennzeichnet sind.
    Dort werden die Signaturen von Methoden etc. eingefügt, aber auch nur das, sonst nix.

    Wenn eine Klasse jetzt ein Interface implementiert, dann muss diese die Methoden implementieren, die durch die Schnittstelle vorgegeben sind, also da drin stehen.
    Ein Interfaces schließt also sozusagen einen Vertrag ab.

    Das hat den Hintergund, dass man somit eine sehr gute Kontrolle hat, der User das jedoch eigens implementieren kann. Aber man schreibt vor, dass er das machen muss.

    Auch kann man mit Interfaces als Rückgabetyp bei Funktionen sagen, dass der User mehrere Möglichkeiten hat.
    Beispielsweise das Interface IEnumerable(Of T) stellt Zeugs bereit für Auflistungen, wie List(Of T), Stack(Of T) etc.
    Diese Auflistungen implementieren diese Schnittstelle deshalb.
    Das sind alles Auflistungen, in die man einzelne Items der angegebenen Sorte (z. B. String bei List(Of String)) reinpacken kann.

    Die Auflistungen unterscheiden sich in den Verhaltensweisen, je nachdem, was man braucht, ist jetzt auch egal.
    Wenn man jetzt eine Funktion schreibt, die was für Auflistungen machen soll, dann soll der User sich ja im Rahmen aller Auflistungen bewegen können.
    Da jetzt alle diese Auflistungen diese Schnittstelle implementieren, kann man sagen: Hey, dann sind diese Auflistungen in ihrer Art so ziemlich gleich und um alle unterstützen zu können, setze ich als Rückgabetyp: "IEnumerable(Of T)".

    Beispiel:

    Visual Basic-Quellcode

    1. Private Function Test() As IEnumerable(Of T)


    In dieser Funktion wird jetzt irgendwas gemacht und dann ein IEnumerable(Of T) zurückgegeben.

    So, jetzt kann der Nutzer diese Funktion aufrufen, egal welche Auflistung er verwendet, solange diese 'IEnumerable(Of T)' verwendet/implementiert.
    Der Sinn ist also sich im Rahmen dieser Auflistungen zu bewegen und der User kann das dann spezifizieren.
    Und so kann man das auch mit allem machen, wo man das braucht.

    Also nur Klassen unterstützen, die dann das gewählte Interface implementieren.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trade“ ()

    @Trade
    Danke, das hast du schön erklärt.

    @ErfinderDesRades
    auf was bezieht sich das?

    ErfinderDesRades schrieb:

    nicht wahr: eine nützliche Verbesserung, oder?

    Der Code aus 26 ist die ClipboardWatcher-Klasse. Er ist eine Verbesserung, weil man den Code spart, der mit dem IDisposable einhergeht.
    Der Code aus 39 bezieht sich auf das Hauptprogramm. Muss ich irgendwie am Ende meiner Anwendung manuell das ClipboardWatcher.Singleton-Objekt disposen?

    phil schrieb:

    Muss ich irgendwie am Ende meiner Anwendung manuell das ClipboardWatcher.Singleton-Objekt disposen?
    Für einen Programmierer ist das eiglich eine "dumme Frage", die der CW selbst beantwortet:
    Kannst du das ClipboardWatcher.Singleton-Objekt irgendwie disposen?
    Nicht?
    Dann musst du auch nicht :P - (und darin besteht die eigentliche Verbesserung - die Zeilen-Einsparung ist auch gut, aber weniger wesentlich).

    Und nun lese Buch. Wenn du einen korrekten Begriff von "disposen" hättest, wäre diese Frage garnet aufgekommen.

    phil schrieb:

    am Ende meiner Anwendung
    macht das das System für Dich.
    Allerdings wäre es für einen guten Stil nützlich, wenn Du im Dispose() der Hauptform Deine Instanz beräumst.
    Dieses Dispose ist in der Datei FormX.Designer.vb.

    VB.NET-Quellcode

    1. 'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen.
    2. <System.Diagnostics.DebuggerNonUserCode()> _
    3. Protected Overrides Sub Dispose(ByVal disposing As Boolean)
    4. Try
    5. If disposing AndAlso components IsNot Nothing Then
    6. components.Dispose()
    7. End If
    8. ' hier Dein eigenes Dispose
    9. Finally
    10. MyBase.Dispose(disposing)
    11. End Try
    12. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wenn jemand lernwillig ist und Fragen mit Sinn und Ausführlichkeit stellt, dann ist das doch gar kein Problem richtig zu helfen. ;)
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: