<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Πρώτα Βήματα - Αρχές προγραμματισμού</title><link>https://www.dotnetzone.gr:443/cs/forums/72/ShowForum.aspx</link><description>Αναρωτιέστε τι σημαίνει object; Class; Inheritance; Design pattern; Την απάντηση μπορείτε να την βρείτε εδώ!</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: Delegates</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/7612.aspx</link><pubDate>Wed, 07 Dec 2005 21:32:39 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:7612</guid><dc:creator>cap</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/7612.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=72&amp;PostID=7612</wfw:commentRss><description>Χαρακτηρίζω το post ως "Εχει επιλυθεί". &lt;br&gt;Αν υπάρχει διαφορετική άποψη, διορθώστε με. &lt;br&gt;Επίσης να θυμίσω οτι μπορείτε να επιλέγετε αν σας βοήθησε ή οχι η κάθε απάντηση που δίνεται στο post από το σχετικό combo κάτω από τον τίτλο της απάντησης.</description></item><item><title>Απ: Delegates</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/7325.aspx</link><pubDate>Sat, 26 Nov 2005 00:24:28 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:7325</guid><dc:creator>axaros</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/7325.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=72&amp;PostID=7325</wfw:commentRss><description>&lt;P&gt;Μάνο είστε neck to neck με τον Russo για την πιο ολοκληρωμένη απάντηση στο .DNZ &lt;BR&gt;(τουλάχιστον προς εμένα) !!! Εύγε !!!!&lt;BR&gt;Χίλια ευχαριστώ !!!&lt;BR&gt;&lt;BR&gt;&lt;/P&gt;</description></item><item><title>Απ: Delegates</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/7324.aspx</link><pubDate>Sat, 26 Nov 2005 00:07:16 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:7324</guid><dc:creator>cap</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/7324.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=72&amp;PostID=7324</wfw:commentRss><description>Επίσης θα πρότεινα, αν συμφωνείτε, να μετακινηθεί σε κάποια άλλη περιοχή (π.χ. .NET Framework) μια και ξεφεύγει από τα "πρώτα βήματα".</description></item><item><title>Απ: Delegates</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/7323.aspx</link><pubDate>Fri, 25 Nov 2005 23:59:22 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:7323</guid><dc:creator>cap</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/7323.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=72&amp;PostID=7323</wfw:commentRss><description>Μανο συγχαρητήρια! Βγαλτο και σε άρθρο!</description></item><item><title>Απ: Delegates</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/7320.aspx</link><pubDate>Fri, 25 Nov 2005 22:54:59 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:7320</guid><dc:creator>KelMan</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/7320.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=72&amp;PostID=7320</wfw:commentRss><description>&lt;P&gt;Μικρή ερώτηση, μεγάλη απάντηση &lt;img src="/cs/emoticons/emotion-1.gif" alt="Smile [:)]" /&gt; Για να πούμε τι είναι τα delegates πρέπει πρώτα να κάνουμε ένα βήμα πίσω…&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Ταξίδι στο χρόνο&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Σίγουρα όλοι ξέρουμε τι είναι ένα event και όλοι ξέρουμε πώς να καλέσουμε ένα&amp;nbsp; function. Και πολλές φορές έχουμε συσχετίσει functions με events έτσι ώστε όταν ενεργοποιηθεί (ή όπως συνηθίζεται να λέμε «γίνει raise») ένα event να «τρέχει» αυτομάτως το function (ή Sub για τη περίπτωση της VB). Τι διαφορά έχει το να καλέσουμε εμείς ένα function από το να το καλέσει ένα event;&lt;/P&gt;
&lt;P&gt;Ας φανταστούμε δύο objects, το client και το server. To client δημιουργεί το server και καλεί τις μεθόδους του αλλά και το server «ειδοποιεί» το client όταν έχει συμβεί κάτι (οτιδήποτε είναι αυτό που ενεργοποιεί το event). Όταν καλούμε εμείς τις μεθόδους του server object, τότε όλα αυτά γίνονται μέσα στα πλαίσια κάποιας ακολουθίας εντολών που τρέχουν στον client. Τα events που τρέχουν όμως, ενεργοποιούνται άσχετα με την ροή εντολών του προγράμματος είναι δηλαδή κλήσεις σε functions που έχει το client object και στις οποίες κλήσεις θα πρέπει να απαντήσει.&lt;/P&gt;
&lt;P&gt;Στη VB6 είχαμε δύο βασικούς μηχανισμούς για την υλοποίηση events. Ο πρώτος είναι ο τυπικός (όταν δηλώναμε ένα object με το WithEvents keyword). O δεύτερος είναι ο μηχανισμός callback, το λεγόμενο «OLE callback» κατά το οποίο ο client περνάει ένα reference του εαυτού του στον server πράγμα που επιτρέπει στον server να καλεί τις μεθόδους του client. Οι δύο τεχνικές αυτές έχουν πλεονεκτήματα και μειονεκτήματα, αλλά ειδικά στη δεύτερη, αν το καλοσκεφτούμε το πράγμα θα δούμε ότι αυτά τα δύο objects θα πρέπει να μείνουν για πάντα στη μνήμη διότι το ένα εξαρτάται από το άλλο και ως εκ τούτου κανένα δεν μπορεί να απελευθερωθεί. Γι αυτόν το λόγο στο COM (γιατί τόση ώρα για COM μιλάμε αλλά δεν ήθελα να το πω από την αρχή μην σταματήσετε να διαβάζετε) υπάρχει ένας μηχανισμός που δεν υποκύπτει στο προηγούμενο πρόβλημα που λέγεται «κυκλική αναφορά» (circular reference) [Σημ. Το πρόβλημα του circular reference δεν αντιμετωπίζεται πάντοτε με επιτυχία και είναι πολύ εύκολο με λίγο «απρόσεχτο» προγραμματισμό να το πετύχουμε]. &lt;/P&gt;
&lt;P&gt;Ο μηχανισμός που λέγαμε βασίζεται σε κάποιες …χμμμμ «οντότητες» που ονομάζονται connection points στα οποία ένα object μπορεί να εκθέσει πληροφορίες για τα events που διαθέτει, δηλαδή το όνομα του event και τις παραμέτρους με τον τύπο που έχει η κάθε μία. Το server object περιμένει από το client (λέγεμε και event sink) να παρέχει μεθόδους με υπογραφές (υπογραφή = πλήθος και τύπος παραμέτρων και επιστρεφόμενης τιμής) που «ταιριάζουν» με τις υπογραφές των events του. &lt;/P&gt;
&lt;P&gt;Αυτά τα connection points υλοποιούνται με μια σειρά COM interfaces που εκθέτουν τις απαραίτητες πληροφορίες και επίσης καθορίζουν πως το server object θα συντηρεί μια λίστα από clients που το χρησιμοποιούν ώστε να μπορεί να γίνει raise ένα event σε όλους τους clients. Επίσης, αυτά τα interfaces καθορίζουν ότι το server object θα πρέπει να κρατάει ένα «weak reference» του κάθε client object. Weak είναι ένα reference που ενώ το server object μπορεί να το χρησιμοποιήσει για να καλέσει τις μεθόδους του client, εντούτοις δεν είναι δεσμευτικό, όπερ σημαίνει ότι το client object μπορεί να καταστραφεί παρότι είναι event sink του server object (για τους nerds – οι υπόλοιποι κάντε skip – να πω ότι αυτό το reference δεν μετριέται κατά το COM reference counting προκειμένου να κατέβει το server object από τη μνήμη)&lt;/P&gt;
&lt;P&gt;Όλα αυτά είναι στην πράξη αρκετά σύνθετα και στην περίπτωση της VB γινόντουσαν στο παρασκήνιο και αποτελούν έναν από του λόγους που οι VB developers είναι κακομαθημένοι. Παίρνουν την μπουκιά μασημένη. Πέρα όμως από το λεκτικό spanking για τους τεμπέληδες VB developers, όλα αυτά τα έγραψα για να καταλήξω στην παρακάτω πρόταση:&lt;/P&gt;
&lt;P&gt;Όλα αυτά δεν ισχύουν στο .NET Framework, ούτε έχουμε το περίφημο circular reference πρόβλημα γιατί για όλα αυτά υπάρχουν διαφορετικοί μηχανισμοί σε διάφορα επίπεδα. Και αν θέλουμε να υλοποιήσουμε σενάριο callback, τότε θα χρησιμοποιήσουμε τα delegates.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Στο ζουμί τώρα&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Διαβάζοντας τα παραπάνω διαπιστώνουμε ότι ένας μηχανισμός για events αποτελείται από δύο πράγματα. Το πρώτο είναι η ανάγκη του server object και του client object να συμφωνούν στις υπογραφές των events. Το δεύτερο είναι η ανάγκη του server object να κρατάει ένα reference του client object. Λοιπόν στο .ΝΕΤ υπάρχουν κάποια objects που κάνουν ακριβώς αυτό! Είναι μεσολαβητές που κάνουν την βρωμοδουλειά…&lt;/P&gt;
&lt;P&gt;Ένα delegate object καθορίζει την υπογραφή μιας μεθόδου και ο ορισμός του γίνεται με το Delegate keyword. Για παράδειγμα:&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Delegate&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Sub&lt;/span&gt; SimpeDelegate(&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;ByVal&lt;/span&gt; s &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;as&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;String&lt;/span&gt;)&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;Η σύνταξη του παραπάνω είναι κάπως περίεργη… Λέει «Sub» αλλά δεν υπάρχει ούτε περιεχόμενο, ούτε «End Sub». Παρατηρείστε δύο πράγματα. Ένα delegate πάντοτε χειρίζεται ένα και μόνο ένα signature, δηλαδή δεν μπορώ να φτιάξω ένα delegate που να περιέχει όλα τα methods του client object. Το δεύτερο – και σημαντικότερο – είναι ότι με το παραπάνω statement ουσιαστικά δημιουργούμε μια νέα κλάση που κάνει inherit την κλάση Delegate, έχει όνομα το «SimpleDelegate» και προσδιορίζει τις παραμέτρους και τι επιστρέφει αυτό το delegate.&lt;/P&gt;
&lt;P&gt;Άρα λοιπόν, αν έχουμε μία κλάση όπως η παρακάτω:&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Class&lt;/span&gt; CalledClass&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Sub&lt;/span&gt; DisplayMessage(&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;ByVal&lt;/span&gt; sMsg &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;as&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;String&lt;/span&gt;)&lt;br /&gt;        Console.WriteLine(sMsg)&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;End&lt;/span&gt; Dub&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;End&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;Μπορούμε να συσχετίσουμε το Delegate με το DisplayMessage Sub:&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Dim&lt;/span&gt; cc &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;as&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;New&lt;/span&gt; CalledClass()&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Dim&lt;/span&gt; d1 &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;as&lt;/span&gt; SimpleDelegate &lt;span style="color: Red;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;AddressOf&lt;/span&gt; cc.DisplayMessage&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;Προσέξατε αυτό το AddressOf; Το delegate δεν αναφέρεται απλά σε μία μέθοδο του client object αλλά σε κάποια συγκεκριμένη μέθοδο που θα βρίσκεται σε συγκεκριμένη θέση μνήμης, όταν θα έχει τρέξει ο κώδικας.&lt;/P&gt;
&lt;P&gt;Πλέον, μπορούμε να καλέσουμε την DisplayMessage με τον παρακάτω κώδικα:&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;d1.Invoke(“Hello &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;delegate&lt;/span&gt; world”)&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;Ενδεχομένως να το υποθέσατε μέχρι τώρα, το SimpleDelegate μπορεί να χρησιμοποιηθεί παντού, οπουδήποτε υπάρχει signature με μία παράμετρο τύπου string που δεν επιστρέφει τίποτα, σε shared methods, σε event functions, σε υπορουτίνες από modules.&lt;/P&gt;
&lt;P&gt;Η χρησιμότητα των delegates είναι μεγάλη. Πέρα από το ότι σε αυτά βασίζεται ο μηχανισμός των events στο .NET Framework, είναι πολλές οι εφαρμογές τους από τη στιγμή που θα κατανοηθεί ο τρόπος λειτουργίας τους. Ένα κλασικό παράδειγμα, είναι μια δυναμική ρουτίνα ταξινόμησης της οποίας το function που συγκρίνει δύο items (η καρδιά κάθε ρουτίνας ταξινόμησης) με της περνιέται ως παράμετρος τύπου delegate!&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Events επιτέλους!&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Στην VB.NET (sorry C# developers, ενδεχομένως κάποιος να προσαρμόσει το άρθρο με C# παραδείγματα) όταν κάνουμε κατά το design time διπλό-κλικ πάνω σε ένα button, αυτόματα έχουμε τον κώδικα:&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Private&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Sub&lt;/span&gt; Button1_Click(&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;as&lt;/span&gt; System.&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Object&lt;/span&gt;, &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;as&lt;/span&gt; System.EventArgs) &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Handles&lt;/span&gt; Button1.Click&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;End&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;Αυτό το «Handles» ουσιαστικά δημιουργεί ένα Delegate που συσχετίζει το Click event του Button1 με τη Sub «Button1_Click». Εσωτερικά, η κλάση Button θα μπορούσε να έχει κώδικα σαν τον παρακάτω:&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Class&lt;/span&gt; Button&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Event&lt;/span&gt; Click(&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;as&lt;/span&gt; System.&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Object&lt;/span&gt;, &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;as&lt;/span&gt; System.EventArgs)&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Sub&lt;/span&gt; Something()&lt;br /&gt;        &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;RaiseEvent&lt;/span&gt; Click(&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Me&lt;/span&gt;, _e)&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;End&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Sub&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;End&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;Όταν εκτελείται το RaiseEvent, ουσιαστικά αυτό που γίνεται είναι να καλείται η Invoke μέθοδος του delegate!&lt;/P&gt;
&lt;P&gt;Αντί λοιπόν να κάνουμε διπλό κλικ και να γράψουμε κώδικα, μπορούμε να γράψουμε:&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Private&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Sub&lt;/span&gt; ClickHandler(&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;as&lt;/span&gt; System.&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Object&lt;/span&gt;, &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;as&lt;/span&gt; System.EventArgs)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;End&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;Και κατόπιν, σε οποιοδήποτε σημείο του προγράμματος&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;AddHandler&lt;/span&gt; Button1.Click, &lt;span style="color: Red;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;AddressOf&lt;/span&gt; ClickHandler&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;Εδώ δεν θα χρειαστεί να δηλώσουμε explicitly το delegate, θα το φτιάξει στο background η AddHandler. Αυτό μας δίνει τρομερά μεγάλη ευελιξία καθώς δεν είμαστε υποχρεωμένοι να ξέρουμε κατά το design-time ποια είναι τα objects για τα οποία θέλουμε να φτιάξουμε event handlers. Επίσης, μας επιτρέπει αν πάσα στιγμή να κάνουμε &lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;RemoveHandler&lt;/span&gt; Button1.Click, &lt;span style="color: Red;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;AddressOf&lt;/span&gt; ClickHandler &lt;/span&gt;&lt;/P&gt;
&lt;P&gt;και να σταματήσουμε να λαμβάνουμε events από το Button1 (απαραιτήτως κάνουμε RemoveHandler κατά το τέλος της ζωής του object στο οποίο έχουν γίνει τα AddHandler, αν δεν το έχουμε κάνει νωρίτερα). Για παράδειγμα, όταν δημιουργούμε ένα array από objects μπορεί κάποια από αυτά βάσει κριτηρίου να θέλουμε να μας ειδοποιήσουν για κάποιο event. Χωρίς delegates θα έπρεπε στον event handler να βάλουμε κώδικα του τύπου &lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;EM&gt;αν {object είναι κατάλληλο} τότε&lt;BR&gt;…&lt;BR&gt;τέλος&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Ενώ με τα delegates μπορούμε να βγάλουμε αυτόν τον κώδικα από τον event handler και να τον τοποθετήσουμε στο τμήμα που φτιάχνει τα objects και τα βάζει στο array&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;For&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Each&lt;/span&gt; cl &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;as&lt;/span&gt; Client &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;in&lt;/span&gt; aClients&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;If&lt;/span&gt; Client.Active &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Then&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;AddHandler&lt;/span&gt; Client.AddOrder, &lt;span style="color: Red;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;AddressOf&lt;/span&gt; ManageOrders&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;End&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;If&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;End&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;For&lt;/span&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;Έτσι ο κώδικας του event handler είναι πιο «καθαρός». Πέρα όμως από αυτό, ο παραπάνω κώδικας έχει κάτι το ιδιαίτερο. Κοιτάξτε τον καλά, το εξηγώ στη συνέχεια.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Το κερασάκι &lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Ήδη από τις beta της VB.NET η κοινότητα θορυβήθηκε από την απουσία των control arrays. Φυσικά, αυτά έλλειπαν διότι πλέον, λόγω delegates, δεν είναι υποχρεωτικό να υπάρχουν control arrays για να έχουμε μια ομάδα από controls στα οποία αντιστοιχεί κοινός κώδικας για κάποιο event. Πλέον, μπορούμε να πούμε:&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Private&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Sub&lt;/span&gt; ClickHandler(&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;As&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Object&lt;/span&gt;, &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;As&lt;/span&gt; System.EventArgs) &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Handles&lt;/span&gt; TextBox1.Click, RadioButton1.Click, CheckBox1.Click&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;End&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;Δηλαδή, διαφορετικά objects έχουν έναν event handler! Είναι το ίδιο σαν να λέω:&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Private&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Sub&lt;/span&gt; ClickHandler(&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;As&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Object&lt;/span&gt;, &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;As&lt;/span&gt; System.EventArgs) &lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;End&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;και &lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;AddHandler&lt;/span&gt; TextBox1.Click, &lt;span style="color: Red;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;AddressOf&lt;/span&gt; ClickHandler &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;AddHandler&lt;/span&gt; RadioButton1.Click, &lt;span style="color: Red;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;AddressOf&lt;/span&gt; ClickHandler&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;AddHandler&lt;/span&gt; CheckBox1.Click, &lt;span style="color: Red;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;AddressOf&lt;/span&gt; ClickHandler&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;Δηλαδή, πολλαπλά events σε έναν event handler. Για την ακρίβεια, θα μπορούσα να συσχετίσω οποιοδήποτε event στο sub ClickHandler αρκεί να έχει ίδιο signature με αυτό του sub. Απλά ενδέχεται να δυσκολέψει κάπως ο κώδικας του sub αν θα πρέπει να καταλαβαίνει ποιος τον κάλεσε και σε απάντηση ποιού event.&lt;/P&gt;
&lt;P&gt;Επίσης, θα μπορούσαμε να πούμε και το εξής:&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;AddHandler&lt;/span&gt; Button1.Click, &lt;span style="color: Red;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;AddressOf&lt;/span&gt; OneClass.ClickHandler&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;AddHandler&lt;/span&gt; Button1.Click, &lt;span style="color: Red;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;AddressOf&lt;/span&gt; TwoClass.ClickHandler&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;AddHandler&lt;/span&gt; Button1.Click, &lt;span style="color: Red;background-color: Transparent;font-family: Lucida Console;font-size: 11px;font-weight: normal;"&gt;AddressOf&lt;/span&gt; SomeClass.ClickHandler&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;Δηλαδή, ένα event σε πολλαπλούς event handlers! Το delegate που δημιουργείται εμμέσως για να υποστηρίξει αυτά τα AddHandler, ονομάζεται «Multicast Delegate» (κάνει inherit το MulticastDelegate class).&lt;/P&gt;
&lt;P&gt;Αυτή ήταν μια εισαγωγή στα delegates. Υπάρχουν πάρα πολλά που θα μπορούσε να πει κανείς γι αυτά καθώς χρησιμοποιούνται σε ασύγχρονα events, στο late binding, στo προγραμματισμό με threads, κλπ. Τέλος, υπάρχουν πολλά που θα μπορούσαμε να πούμε για το πώς δουλεύει το inheritance με τα delegates. &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description></item><item><title>Delegates</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/7316.aspx</link><pubDate>Fri, 25 Nov 2005 19:43:02 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:7316</guid><dc:creator>axaros</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/7316.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=72&amp;PostID=7316</wfw:commentRss><description>&lt;P&gt;Γεια χαρά σε όλους !!!&lt;BR&gt;Τι είναι τα delegates και πως δουλεύουν ;&lt;/P&gt;</description></item></channel></rss>