Ist das hier
genau das selbe wie Das
Wenn nein Wo ligt der unterschied
genau das selbe wie Das
Wenn nein Wo ligt der unterschied
Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.
Delegate Sub T(...)
bzw. Delegate Function T(...) As ...
.New T(M)
.T
ist ein Delegattyp. Wichtig ist hier, dass es sich um einen nicht-abstrakten Delegattyp handelt. Ist wie bei ganz normalen Klassen: Katze ist ein ("erbt von") Tier. Du kannst eine Katze erstellen, aber kein Tier, weil Tier was abstraktes ist.M
ist ein Methodenausdruck. Hier gibt es diese zwei Möglichkeiten: AddressOf N
, wobei N der Name einer anderswo deklarierten Methode ist, welche eine mit dem Delegaten kompatible Signatur haben muss.M
als Ausdruck hinzuschreiben und der Compiler baut im Hintergrund die Instanziierung drumherum selbst zusammen. Wenn das Ziel für den Ausdruck ein nicht-abstrakter Delegattyp ist, dann wird als T eben jener Typ verwendet. Wenn der Typ ein abstrakter Delegattyp (z.B. beim Aufruf von Me.Invoke
) oder nicht bekannt ist (z.B. bei Dim x = D
mit Option Infer On), dann wird im Hintergrund ein anonymer Delegattyp deklariert und verwendet.D.Invoke(..)
, oder abgekürzt D(...)
, was aber auch nur zu vorherigem kompiliert.D
ist irgend ein Ausdruck, der eine Instanz eines Delegattyps ergibt. Also zum Beispiel eine lokale Variable (wie in deinem zweiten Codeschnipsel) (aber jetzt nicht mit Me.Invoke
verwechseln, welches damit nichts zu tun hat!), ein Parameter, ein Feld oder - wenn auch etwas unsinnig - eine direkte Instanziierung wie in Schritt 2.Me.Invoke
, welches ja einen System.Delegate entgegennimmt, dann die Methode auf, wenn es keine Invoke
-Methode gibt? Nun, es gibt da noch die DynamicInvoke
-Methode. Die nimmt ein Object
-Array entgegen und macht im Grunde genommen das: D.Invoke(Args(0), Args(1), Args(2), ...)
. Also das erste Objekt im Array wird als erster Parameter verwendet, das zweite Element als zweiter Parameter, und so weiter. Das ist natürlich Fehleranfällig, weil der Compiler nicht wissen kann, ob die Anzahl an Parametern und deren Typen stimmen. Das wird erst zur Laufzeit geprüft und löst im Fehlerfall eine ArgumentException aus.Invoke
-Methode, und so weiter.Me.Invoke
-Methode.ClearButtons
-Methode zeigt und schmeißt die Instanz in die Me.Invoke
-Methode. Keine Magie, alles ganz einfach.ClearButtons
-Methode. Da Du die Instanziierung nicht explizit hingeschrieben hast und die Me.Invoke
-Methode einen abstrakten Delegattyp entgegennimmt, es also keinen nicht-abstrakten Delegattyp gibt, der verwendet werden könnte, wird ein anonymer Delegattyp deklariert und an der Stelle instanziiert. Ab jetzt gibt es nur noch ein paar kleine Details, in denen sich der Code von Schnipsel 2 unterscheidet. Also z.B. dass der anonyme Delegattyp in Schnipsel 1 ohne Namespace in der Assembly deklariert wird, aber so genau muss man es dann auch nicht wissen.Me.Invoke(New TestDelegate(AddressOf ClearButtons))
hinschreibst, dann steht da implizit eigentlich Me.Invoke(New TestDelegate(AddressOf Me.ClearButtons))
. Da es sich also um eine Instanzmethode handelt, merkt sich die Instanz des Delegattyps hier ebenfalls, was Me
ist.ClearButtons
-Methode zeigt. Niko Ortner schrieb:
(Kompatibel bedeutet, dass Vererbung beachtet wird, also z.B. eine Instanz eines Delegattypen, der eine Katze als Parameter entgegennehmen muss, auch auf eine Methode zeigen darf, die alle Arten von Tieren entgegennimmt.)
Inne Praxis gibts glaub nur einen, den MultiCast.Niko Ortner schrieb:
Es gibt genau zwei abstrakte Delegattypen: System.Delegate und System.MulticastDelegate (erbt von System.Delegate).
Niko Ortner schrieb:
Genau genommen ist die Unterscheidung zwischen Delegate und MulticastDelegate unnütz und wurde nur behalten, weil es vor Release von .NET Framework 1.0 zu aufwändig gewesen wäre, die beiden Typen zusammenzufassen: blogs.msdn.microsoft.com/brada…te-and-multicastdelegate/ und genau genommen erben alle nicht-abstrakten Delegattypen einfach von System.MulticastDelegate.
Arby schrieb:
Umgekehrt, oder nicht?
FeedAnimal
-Methode darf Katzen und andere Tiere entgegennehmen. In die Invoke
-Methode wird eine Katze reingeschmissen, der Delegattyp spezifiziert ja schließlich, dass eine Katze entgegengenommen wird. Klappt also.FeedCat
-Methode darf nur Katzen entgegennehmen. In die Invoke
-Methode wird ein Hund reingeschmissen, der Delegattyp spezifiziert ja schließlich, dass alle Arten von Tieren entgegengenommen werden. Die FeedCat
-Methode bekommt jetzt einen Hund, obwohl sie nur Katzen entgegennehmen kann. Das ist also falsch.GetThing
-Methode).Private Delegate -> Public Variable
thecengizhan96 - - Sonstige ProblemstellungenEinfrieren der Form verhindern...Hilfe!
MediaXtremely - - Sonstige Problemstellungen