<?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>WinForms</title><link>https://www.dotnetzone.gr:443/cs/forums/12/ShowForum.aspx</link><description>Θέματα για rich client / windows εφαρμογές, σε οποιαδήποτε γλώσσα (VB.NET, C#, managed C++, κ.α.)</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: Singleton Form</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/10080.aspx</link><pubDate>Fri, 24 Feb 2006 20:58:22 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:10080</guid><dc:creator>ToyMaker</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/10080.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=12&amp;PostID=10080</wfw:commentRss><description>Αυτό το description μπορεί να βοηθήσει:&lt;br&gt;http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcn7/html/vaconFinalizeDestructors.asp</description></item><item><title>Απ: Singleton Form</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/9809.aspx</link><pubDate>Fri, 17 Feb 2006 13:10:27 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:9809</guid><dc:creator>infoCENTER</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/9809.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=12&amp;PostID=9809</wfw:commentRss><description>Μπορεί και να είναι αυτο που λες pkanavos. να έχω παρανοήσει το όλο θέμα, να έχω αντικαταστήσει τα θολά σημεία με δικές μου υποθέσεις και θεωρίες οι οποίες μέχρι στιγμής να βγαίνανε και στην πράξη και τελικά ο σκόπελος singleton να έχει φανερώσει την αρχική αδυναμία στην πλήρη κατανόηση του όλου θέματος και να μην μπορώ να το δεχτώ. Μπορεί να είναι και αυτό...&lt;br&gt;&lt;br&gt;Ίσως το ερώτημα να είναι και λίγο φιλοσοφικό όπως ανέφερε ο KelMan για το αν θα έπρεπε ή όχι να γίνετε αυτό η εκείνο. Στη συγκεκριμένη περίπτωση αυτό που συζητάμε. Σημασία όμως δεν έχει το τι θα μπορούσε αλλά το τι γίνεται και πως το αντιλαμβανόμαστε αυτό.&lt;br&gt;&lt;br&gt;Ευχαριστώ και πάλι όλους για το χρόνο τους.</description></item><item><title>Απ: Singleton Form</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/9799.aspx</link><pubDate>Fri, 17 Feb 2006 04:09:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:9799</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/9799.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=12&amp;PostID=9799</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN style="mso-ansi-language: EL"&gt;&lt;FONT size=3&gt;&lt;FONT face="Times New Roman"&gt;Εδώ έχει γίνει μία συνηθισμένη παρανόηση. Ο infocenter έχει κάνει μια εσφαλμένη αρχική υπόθεση βασισμένη σε κάποια συμπεριφορά που παρατήρησε και προσπαθεί να προσαρμόσει όσα διαβάζει και όσα παρατηρεί σε αυτή. Το αποτέλεσμα είναι όσα παρατηρεί να φαίνονται αντιφατικά ή ακατανόητα. &lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN style="mso-ansi-language: EL"&gt;&lt;o:p&gt;&lt;FONT face="Times New Roman" size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN style="mso-ansi-language: EL"&gt;&lt;FONT size=3&gt;&lt;FONT face="Times New Roman"&gt;Έχω πάθει κι εγώ το ίδιο πράγμα άπειρες φορές. Προσπαθώντας να καταλάβω βιαστικά ένα περίπλοκο θέμα, κάνω λανθασμένες υποθέσεις οι οποίες με βασανίζουν αφάνταστα μέχρι να ξεκολλήσω. Αν δεν καταλάβω ποια είναι η εσφαλμένη αρχική υπόθεση, δεν υπάρχει περίπτωση να ξεκολλήσω. Δεν πάνε να μου το λένε και να μου το εξηγούνε όλοι. Προσπαθώντας να προσαρμόσω όσα παρατηρώ στη δική μου εσφαλμένη λογική, καταλήγω μονίμως σε αδιέξοδα.&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN style="mso-ansi-language: EL"&gt;&lt;FONT size=3&gt;&lt;FONT face="Times New Roman"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Το λάθος μου είναι ότι προσπαθώ να παρακάμψω τη διαδικασία εκμάθησης που απαιτείται για κάθε περίπλοκο θέμα και να μπω κατευθείαν στις λεπτομέρειες. Έτσι όμως χάνω τις βάσεις και αναγκάζομαι να τις υποκαταστήσω με υποθέσεις.&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN style="mso-ansi-language: EL"&gt;&lt;o:p&gt;&lt;FONT face="Times New Roman" size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face="Times New Roman"&gt;&lt;SPAN style="mso-ansi-language: EL"&gt;Στη συγκεκριμένη περίπτωση, η εσφαλμένη υπόθεση είναι ότι η &lt;/SPAN&gt;&lt;SPAN&gt;Dispose&lt;/SPAN&gt;&lt;SPAN style="mso-ansi-language: EL"&gt; &lt;/SPAN&gt;&lt;SPAN style="mso-ansi-language: EL"&gt;έχει κάποια ειδική σημασία για το &lt;/SPAN&gt;&lt;SPAN&gt;runtime&lt;/SPAN&gt;&lt;SPAN style="mso-ansi-language: EL"&gt; &lt;/SPAN&gt;&lt;SPAN style="mso-ansi-language: EL"&gt;και μάλιστα, ότι μπορεί να καταστρέψει ένα &lt;/SPAN&gt;&lt;SPAN&gt;object&lt;/SPAN&gt;&lt;SPAN style="mso-ansi-language: EL"&gt; &lt;/SPAN&gt;&lt;SPAN&gt;instance&lt;/SPAN&gt;&lt;SPAN style="mso-ansi-language: EL"&gt;. Επίσης λανθασμένη είναι η υπόθεση ότι για να προσθέσεις μια κλάση &lt;/SPAN&gt;&lt;SPAN&gt;Dispose&lt;/SPAN&gt;&lt;SPAN style="mso-ansi-language: EL"&gt; &lt;/SPAN&gt;&lt;SPAN style="mso-ansi-language: EL"&gt;σε μία κλάση πρέπει να κάνεις &lt;/SPAN&gt;&lt;SPAN&gt;implement&lt;/SPAN&gt;&lt;SPAN style="mso-ansi-language: EL"&gt; &lt;/SPAN&gt;&lt;SPAN style="mso-ansi-language: EL"&gt;το &lt;/SPAN&gt;&lt;SPAN&gt;IDisposable&lt;/SPAN&gt;&lt;SPAN style="mso-ansi-language: EL"&gt;. Η εσφαλμένη υπόθεση βασίστηκε στον τρόπο που έχουν υλοποιηθεί οι μέθοδοι της κλάσης &lt;/SPAN&gt;&lt;SPAN&gt;Form&lt;/SPAN&gt;&lt;SPAN style="mso-ansi-language: EL"&gt;. &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN style="mso-ansi-language: EL"&gt;&lt;o:p&gt;&lt;FONT face="Times New Roman" size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN style="mso-ansi-language: EL"&gt;&lt;FONT size=3&gt;&lt;FONT face="Times New Roman"&gt;Η μόνη λύση που έχω βρει σε τέτοιες περιπτώσεις είναι να απορρίψω όσο μπορώ τις βιαστικές υποθέσεις που έχω κάνει και να αρχίσω να διαβάζω από την αρχή για το θέμα που με απασχολεί, προσπαθώντας να μπω στη λογική του θέματος, όχι να προσαρμόσω το θέμα στη δικιά μου λογική. &lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN style="mso-ansi-language: EL"&gt;&lt;o:p&gt;&lt;FONT face="Times New Roman" size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face="Times New Roman"&gt;&lt;SPAN style="mso-ansi-language: EL"&gt;Στη&lt;/SPAN&gt; &lt;SPAN style="mso-ansi-language: EL"&gt;συγκεκριμένη&lt;/SPAN&gt; &lt;SPAN style="mso-ansi-language: EL"&gt;περίπτωση&lt;/SPAN&gt; &lt;SPAN style="mso-ansi-language: EL"&gt;θα&lt;/SPAN&gt; &lt;SPAN style="mso-ansi-language: EL"&gt;πρότεινα&lt;/SPAN&gt; &lt;SPAN style="mso-ansi-language: EL"&gt;στον&lt;/SPAN&gt; &lt;SPAN&gt;infocenter &lt;/SPAN&gt;&lt;SPAN style="mso-ansi-language: EL"&gt;να&lt;/SPAN&gt; &lt;SPAN style="mso-ansi-language: EL"&gt;διαβάσει&lt;/SPAN&gt; &lt;SPAN style="mso-ansi-language: EL"&gt;το&lt;/SPAN&gt; &lt;SPAN&gt;«&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconFinalizeDispose.asp"&gt;Implementing Finalize and Dispose to Clean Up Unmanaged Resources&lt;/A&gt;». &lt;/SPAN&gt;&lt;SPAN style="mso-ansi-language: EL"&gt;Ειδικά στο τέλος, αναφέρει: &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face="Times New Roman"&gt;&lt;SPAN&gt;&lt;EM&gt;«You should consider not allowing an object to be usable after its Dispose method has been called. Recreating an object that has already been disposed is a difficult pattern to implement.».&lt;/EM&gt; &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="mso-ansi-language: EL"&gt;Είναι στην επιλογή του προγραμματιστή μιας κλάσης να την γράψει ώστε να μην χρησιμοποιείται μετά από την κλήση της &lt;/SPAN&gt;&lt;SPAN&gt;Dispose&lt;/SPAN&gt;&lt;SPAN style="mso-ansi-language: EL"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN style="mso-ansi-language: EL"&gt;&lt;o:p&gt;&lt;FONT face="Times New Roman" size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face="Times New Roman"&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="mso-ansi-language: EL"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;</description></item><item><title>Απ: Singleton Form</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/9795.aspx</link><pubDate>Fri, 17 Feb 2006 02:21:45 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:9795</guid><dc:creator>KelMan</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/9795.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=12&amp;PostID=9795</wfw:commentRss><description>&lt;P&gt;Να αποσαφηνίσουμε και κάτι ακόμα... Ο JIT Compiler δεν έχει καμία σχέση με την όλη ιστορία. Δουλειά του είναι να μετατρέπει τον MSIL κώδικα σε machine κώδικα και αυτό συμβαίνει την πρώτη φορά που τρέχει ένα assembly καθώς και σε κάποιες άλλες ειδικές περιπτώσεις. Ό,τι κουβεντιάζουμε εδώ (Garbage Collection, κλπ), είναι καθαρά functionality του CLR. Έτσι λοιπόν, το "Cannot access a disposed object." δεν είναι μήνυμα που βγάζει ο JIT Compiler. Όταν εμφανιστεί αυτό το μήνυμα, έχει ήδη τρέξει και έχει τελειώσει ο JIT Compiler.&lt;/P&gt;
&lt;P&gt;Τέλος κάτι άλλο: Μην συγχέεις γενικά τη συμπεριφορά όλων των objects στο θέμα του dispose με το πως συμπεριφέρονται οι φόρμες. Οι φόρμες είναι μεν objects που προέρχονται από κλάσεις αλλά έχουν implemented λογική στο Dispose function. Αυτή η λογική βρίσκεται στη base κλάση System.Windows.Forms.Form, οπότε βρίσκεται σε όλες τις φόρμες που κατασκευάζεις. &lt;/P&gt;
&lt;P&gt;Η λογική της Dispose των φορμών είναι ότι άπαξ και γίνουν dispose δεν πρέπει να ξαναχρησιμοποιηθούν, δηλαδή από τη στιγμή που έχουν καθαριστεί τα unmanaged resources δεν έχει νόημα να ξαναχρησιμοποιηθούν παρά μόνο αν φτιαχτεί νέο instance τους. Αν για παράδειγμα, έχεις ανοίξει ένα log file και γράφεις μέσα πράγματα και το κλείσεις με τη Dispose, θα πρέπει να φτιάξεις νέο instance για να ξαναδημιουργηθεί αυτό το log file.&lt;BR&gt;Έτσι λοιπόν, μιας και δεν μπορεί η φόρμα εκ των πραγμάτων να φύγει από τη μνήμη (μιας και αυτό θα το κάνει ο GC) κρατάει το αν έχει γίνει Dispose εσωτερικά σε ένα boolean member που λέγεται Disposed και εμφανίζει exception αν πας να τις χρησιμοποιήσεις "παράνομα".&lt;/P&gt;
&lt;P&gt;Άρα λοιπόν, αν θέλεις να ελέγξεις αν μπορείς να χρησιμοποιήσεις μια φόρμα, θα πρέπει να πεις&lt;/P&gt;
&lt;P&gt;&amp;nbsp;If someForm Is Nothing OrElse someForm.IsDisposed Then...&lt;/P&gt;
&lt;P&gt;Αρχικά δηλαδή ελέγχεις αν υπάρχει το instance και κατόπιν αν δεν είναι Disposed. To IsDisposed πάλι είναι ένα property που δεν το βρίσκεις πάντοτε σε όλες τις κλάσεις παρά μόνο αν το έχει φτιάξει ο κατασκευαστής τους. &lt;/P&gt;
&lt;P&gt;Για να κλείσουμε, όταν ανοίγεις μια φόρμα με τη μέθοδο Show, και κατόπιν την κλείνεις με τη Close ή πατώντας το "X" τότε η φόρμα γίνεται αυτόματα Disposed ενώ όταν την ανοίγεις με ShowDialog όχι και γι αυτό στη δεύτερη περίπτωση είναι δική σου ευθύνη να καλέσεις τη Dispose.&lt;/P&gt;
&lt;P&gt;Άρα λοιπόν, το θέμα δεν είναι τι περιμένεις εσύ (από φιλοσοφικής άποψης) ότι πρέπει ή δεν πρέπει να γίνεται στο managed περιβάλλον, αλλά το τι συμβαίνει στη πραγματικότητα από αυτούς που έχουν φτιάξει τη κλάση System.Windows.Forms.Form&lt;/P&gt;</description></item><item><title>Απ: Singleton Form</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/9791.aspx</link><pubDate>Fri, 17 Feb 2006 01:33:12 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:9791</guid><dc:creator>infoCENTER</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/9791.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=12&amp;PostID=9791</wfw:commentRss><description>Όπως έγραψα στις 14/2 αυτή την στιγμή διαβάζω με σκοπό να αποσαφηνίσω το συγκεκριμένο θέμα που έχει προκύψει πρωτίστος για μένα και για όσους ενδιαφέρονται να μπαίνουν σε τόση λεπτομέρεια... &lt;br&gt;&lt;br&gt;Επίσης είναι ευπρόσδεκτες όλες οι γνώμες και προτάσεις σας αλλά όλα αυτά δεν χρειάζεται να τα γράψω φυσικά....&lt;br&gt;&lt;br&gt;PKanavos. Συμφωνώ σε αυτό που λες σχετικά με την ονομασία της Dispose, θα μπορούσε να λέγεται όπως είπες, άλλωστε αυτό δεν έχει σημασία από την στιγμή που κάνει Implement το IDisposable. &lt;br&gt;&lt;br&gt;Επίσης ανέφερες ότι είναι κατά σύμβαση μία ονομασία που δίνουμε σε μία ρουτίνα όταν θέλουμε να καταστρέψουμε ένα αντικείμενο. Αντικείμενο ενοοείς instance; Μεταβλητή; Τι άλλο; Και λέγοντας να καταστρέψει σε τι βαθμό;&lt;br&gt;&lt;br&gt;Επίσης έγραψες πως αν κληθεί η Dispose δεν καταστρέφεται κανένα instance και μπορεί να χησιμοποιηθεί άνετα μετά. Χμ... τότε γιατί ο JIT Compiler βάζει μήνυμα λάθους "Cannot access a disposed object."; Άλλωστε αυτό είναι ένα εύκολο παράδειγμα που μπορεί να δοκιμάσει ο καθένας για να δει το συγκεκριμένο μήνυμα. &lt;br&gt;&lt;br&gt;Ένα άλλο σοβαρότερο ακόμα θέμα. Η Dispose μπορεί να ακυρώσει να εκτελεστεί η Finalize με την εντολή System.GC.SuppressFinalize. Έχοντας λοιπόν υπ'όψιν το σημείο αυτό και γνωρίζοντας την χρησιμότητα τις Finalize, καταλαβαίνουμε πως τελικά η Dispose μπορεί να κάνει κάτι παραπάνω από ένα cleanup μιας class, από την μεριά της εφαρμογής και όχι από την παρουσία στη μνήμη του συστήματος.  Θυμηθήτε το μήνυμα του Compiler και την δυνατότητα να καλεί την παραπάνω εντολή που έγραψα.&lt;br&gt;&lt;br&gt;Έπειδή η συζήτηση έχει ανάψει για τα καλά θέλω σε αυτό το σημείο για άλλη μία φορά να σας αναφέρω τον αρχικό μου προβληματισμό για να μην οδηγηθεί η συζήτηση σε άλλα συμπεράσματα και χάσουμε το αρχικό ερώτημα, προβληματισμό.&lt;br&gt;&lt;br&gt;Προσωπικά σε ένα managed περιβάλλον θα περίμενα η μεταβλητή ή μεταβλητές που δείχνουν πάνω σε ένα instance classes όταν αυτό το instance δεν μπορεί να χρησιμοποιηθεί άλλο από την εφαρμογή να δείχνουν σε nothing και όχι σε ένα instance που δεν μπορεί να χρησιμοποηθεί άλλο απο την εφαρμογή. &lt;br&gt;&lt;br&gt;Η πρόταση κλειδί είναι που δεν μπορεί το συγκεκριμένο instance να χρησιμοποιηθεί άλλο από την εφαρμογή. Θυμηθήτε το μήνυμα του compiler.&lt;br&gt;&lt;br&gt;Για να απαντηθεί αυτή η ερώτηση θα πρέπει να γνωρίζουμε τι κάνει η Dispose τι κάνει ο GC πότε και σε ποια φάση καταστρέφεται το instance classes ή δεν είναι διαθέσιμο για την εφαρμογή και μετά θα σταματήσουμε εκεί. Θα ήθελα να ακούσω όμως και την προσωπική σας γνώμη πάνω στον προβληματισμό μου με επιχειρήματα όμως. Και πιστεύω αυτό κάνετε...&lt;br&gt;&lt;br&gt;Κάποια από αυτά που γράφω Aris θα τα βρεις και μέσα στο link που μου έστειλες.&lt;br&gt;&lt;br&gt;Ευχαριστώ και πάλι όλους για τις απαντήσεις τους και τον χρόνο που διαθέσανε, γνωρίζοντας πόσο πολύτιμος είναι.</description></item><item><title>Απ: Singleton Form</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/9776.aspx</link><pubDate>Thu, 16 Feb 2006 18:59:43 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:9776</guid><dc:creator>Aris</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/9776.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=12&amp;PostID=9776</wfw:commentRss><description>&lt;P&gt;Ο ΠΚ το έθεσε πολύ σωστά. Θα πρότεινα το&amp;nbsp;&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnguinet/html/drguinet4_update.asp"&gt;http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnguinet/html/drguinet4_update.asp&lt;/A&gt; (MSDN Lib VS2003) για μιά αναλυτική περιγραφή.&lt;/P&gt;
&lt;P&gt;Το σημαντικό είναι το #4&lt;/P&gt;
&lt;P&gt;Αρης&lt;/P&gt;</description></item><item><title>Απ: Singleton Form</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/9763.aspx</link><pubDate>Thu, 16 Feb 2006 09:04:47 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:9763</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/9763.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=12&amp;PostID=9763</wfw:commentRss><description>Εδώ έχουν μπλέξει αρκετά τα πράγματα για το τί είναι και τί κάνει η Dispose, τί είναι η shared μεταβλητή και ποιός καταστρέφει ποιόν και πότε.&lt;br&gt;&lt;br&gt;1. Η μέθοδος Dispose δεν έχει ΚΑΜΜΙΑ ΕΙΔΙΚΗ ΣΗΜΑΣΙΑ! Θα μπορούσε άνετα να λέγετε Tsalampardoprakopoulopitomethodos και θα δούλευε το ίδιο καλά. Είναι το όνομα που δίνουμε κατά σύμβαση σε μια μέθοδο η οποία περιέχει τον κώδικα που θέλουμε να τρέξει όταν καταστρέφεται ένα αντικείμενο. Για να κληθεί, θα πρέπει να γράψουμε εμείς κώδικα. Το runtime καλεί ΜΟΝΟ την Finalize αυτόματα. ΔΕΝ ΕΧΕΙ ΔΙΑΦΟΡΑ αν καλούμε την Init ή την Dispose ή την Close ή οποιαδήποτε άλλη μέθοδο. Για το runtime είναι όλα το ίδιο. &lt;br&gt;    Οι κλάσεις που γράφουμε δεν έχουν ορισμένη καμμία μέθοδο Dispose. Είναι μια μέθοδος που γράφει ο συγγραφέας της κλάσης. Αν κληθεί η Dispose, δεν καταστρέφεται κανένα instance και μπορεί να χρησιμοποιηθεί άνετα μετά. &lt;br&gt;&lt;br&gt;2. Την Finalize δεν μπορούμε να την καλέσουμε για να προκαλέσουμε την καταστροφή ενός αντικειμένου. Καλείται μόνο από το ίδιο το runtime όταν εκτελείται η διαδικασία καταστροφής ενός instance. Συνεπώς, δεν γίνεται να καταστρέψουμε ένα αντικείμενο με το χέρι και κατά συνέπεια δεν πρόκειται ποτέ να υπάρχουν references σε κατεστραμμένα αντικείμενα.&lt;br&gt;&lt;br&gt;3. Ο ΜΟΝΟΣ ΤΡΟΠΟΣ να καταστρέψεις ένα αντικείμενο είναι να καθαρίσεις όλα τα reference σε αυτό. Έτσι, μια shared μεταβλητή που δείχνει στο instance ενός αντικειμένου το κρατάει στη ζωή μέχρι να καθαριστεί και αυτή. ΔΕΝ ΓΙΝΕΤΑΙ να δείχνει μια shared μεταβλητή σε ήδη κατεστραμμένο αντικείμενο.&lt;br&gt;&lt;br&gt;4. Το initialization των shared variables γίνεται όταν δημιουργείται το πρώτο instance ενός class ή όταν καλείται για πρώτη φορά μια shared μέθοδος. Τα περιεχόμενα των shared variables δεν καθαρίζονται αυτόματα παρά μόνο όταν κλείνει η εφαρμογή που τα δημιούργησε, καθώς δεν υπάρχει τρόπος να "καταστρέψεις" μία κλάση, μόνο τα instance της.&lt;br&gt;&lt;br&gt;</description></item><item><title>Απ: Singleton Form</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/9724.aspx</link><pubDate>Wed, 15 Feb 2006 22:44:32 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:9724</guid><dc:creator>infoCENTER</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/9724.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=12&amp;PostID=9724</wfw:commentRss><description>Aris δεν θα συμφωνήσω μαζί σου. Ο JIT Compiler κάνει αρκετά άλλα πράγματα που κοστίζουν σε χρόνο. Άλλα αρκετά σημαντικά και άλλα όχι. &lt;br&gt;&lt;br&gt;Όπως και να έχει παιδιά σας ευχαριστώ για τον χρόνο σας και για την αναταπόκρισή σας.</description></item><item><title>Απ: Singleton Form</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/9680.aspx</link><pubDate>Wed, 15 Feb 2006 07:19:48 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:9680</guid><dc:creator>Aris</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/9680.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=12&amp;PostID=9680</wfw:commentRss><description>&lt;P&gt;Η μεταβλητή αυτή δεν ζει στον χώρο στο heap που ζουν οι instance-level μεταβλητές. Ζει εκεί που είναι το class definition (απλοποιημένα). Η Dispose θα "καθαρίσει" (θα μαρκάρει σαν ελεύθερο) τον χώρο στο heap. Δεν μπορεί όμως να καθαρίσει το class definition.&lt;/P&gt;
&lt;P&gt;Αυτό που θα μπορούσες να υποθέσεις είναι ότι το περιβάλλον θα μηδένιζε τον pointer (περισσότερο με handle = pointer to pointer μοιάζει). Αλλά, αυτό θα κόστιζε σε χρόνο. Οπότε, εάν έχεις ανάγκη μηδενισμού, το κάνεις μόνος σου. &lt;img src="/cs/emoticons/emotion-1.gif" alt="Smile [:)]" /&gt;&lt;/P&gt;
&lt;P&gt;Άρης&lt;/P&gt;</description></item><item><title>Απ: Singleton Form</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/9668.aspx</link><pubDate>Tue, 14 Feb 2006 22:47:15 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:9668</guid><dc:creator>infoCENTER</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/9668.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=12&amp;PostID=9668</wfw:commentRss><description>Προς axaros. Αυτό που προτείνεις δεν συμβαδίζει με την φιλοφοφία των MDI εφαρμογών. Οπότε δεν θα το σχολιάσω παρακάτω. &lt;br&gt;&lt;br&gt;Προς Aris. Συμφωνώ σε αυτό που λες σε γενικές όμως γραμμές. Η Shared μεταβλητή δείχνει σε ένα instance μιας κλάσσης. Οπότε αν αυτό το instance καταργηθεί τότε η shared μεταβλητή δείχνει στο πουθενά. Σχετικά με την dispose που δημιουργήθηκε το θέμα. Είμαι σε μία φάση διαβάσματος για να καταλάβω ακριβώς τι γίνεται για αυτό και δεν έχω απαντήση ακόμα. Η γνώμη μου μέχρι τώρα (και προφανώς εσφαλμένη) ήταν ότι με την dispose είναι σαν να λες στην εφαρμογή καθάρισα με αυτό το Instance και δεν θέλω να το χρησιμοποιήσω άλλο. Οπότε για την εφαρμογή το συγκεκριμένο Instance έχει τελειώσει άσχετα αν δεν έχει καθαρίσει απο την μνήμη. Άλλωστε για κάντε dispose ένα instance κλάσσης και προσπαθήστε μετά να το χρησιμοποιείσεται. Θα πάρετε error. Οπότε σκέφθηκα (και προφανώς εσφαλμένα) ότι το .ΝΕΤ θα έβαζε σε όλους τους pointers που αναφέρονται σε αυτό το Instance την τιμή Nothing (αν μπορεί να θεωρηθεί τιμή) Να μην αφήνει δηλαδή ξεχασμένες μεταβλητές στον κώδικά μου που να αναφέρονται σε άκυρα πράγματα. &lt;br&gt;&lt;br&gt;Εγώ πάντος θα περίμενα μία τέτοια συμπεριφορά από ένα managed περιβάλλον. Τελικά από ότι φαίνεται δεν το έπιασα σωστά μου φαίνεται όμως περίεργο αυτό είναι όλο...</description></item><item><title>Απ: Singleton Form</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/9657.aspx</link><pubDate>Tue, 14 Feb 2006 18:26:45 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:9657</guid><dc:creator>Aris</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/9657.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=12&amp;PostID=9657</wfw:commentRss><description>&lt;P&gt;Η static (shared) μεταβλητή σου &lt;U&gt;είναι κοινή για όλα τα instances&lt;/U&gt;. &lt;/P&gt;
&lt;P&gt;Το γεγονός ότι "σκότωσες" ένα, δεν σημαίνει οτι αυτή η μεταβλητή δεν μπορεί να χρησιμοποιείται και από άλλα (που, στην περίπτωσή σου δεν υπάρχουν). Επομένως, γιατί πρέπει ο GC να το κάνει null (nothing); Αυτό θα έπρεπε να το κάνεις σε δική σου Dispose(). Προφανώς, το διαχειριζόμενο περιβάλλον εκτέλεσης (managed execution environment &lt;img src="/cs/emoticons/emotion-1.gif" alt="Smile [:)]" /&gt;) δεν ξέρει ότι υλοποιείς το singleton pattern ...&lt;/P&gt;
&lt;P&gt;Άρης&lt;/P&gt;</description></item><item><title>Απ: Singleton Form</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/9656.aspx</link><pubDate>Tue, 14 Feb 2006 18:25:27 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:9656</guid><dc:creator>axaros</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/9656.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=12&amp;PostID=9656</wfw:commentRss><description>Και γιατί δεν την σηκώνεις modally: &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;Dim fCustomersList as New CustomersGridViewForm &lt;BR&gt;&lt;BR&gt;With fCustomersList&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;STRONG&gt;.showDialog(Me)&lt;/STRONG&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Dispose&lt;BR&gt;End with &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;</description></item><item><title>Απ: Singleton Form</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/9320.aspx</link><pubDate>Tue, 07 Feb 2006 03:43:19 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:9320</guid><dc:creator>KelMan</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/9320.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=12&amp;PostID=9320</wfw:commentRss><description>&lt;P&gt;&lt;BLOCKQUOTE&gt;&lt;table width="85%"&gt;&lt;tr&gt;&lt;td class="txt4"&gt;&lt;img src="/cs/Themes/default/images/icon-quote.gif"&gt;&amp;nbsp;&lt;strong&gt;infoCENTER wrote:&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="quoteTable"&gt;&lt;table width="100%"&gt;&lt;tr&gt;&lt;td valign="top" class="txt4"&gt;Έχω μία shared μεταβλητή μέσα σε μία class. Η μεταβλητή αυτή είναι ένας pointer που δείχνει στο instance του class. Κάνω την class dispose. Για την εφαρμογή το συγκεκριμένο instance έχει τελειώσει. Ο pointer της μεταβλητής γιατί εξακολουθεί και δείχνει σε μία περιοχή δεδομένων που δεν είναι προσβάσιμη από την εφαρμογή όπως δείχνει το μήνυμα του compiler; Σε ένα managed περιβάλλον δεν θα έπρεπε να δείχνει σε Nothing; Γιατί πρέπει να το γράψω εγώ; &lt;BR&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/BLOCKQUOTE&gt;&lt;/P&gt;
&lt;P&gt;Μιλάμε για την Dispose γιατί μάλλον έχεις παρεξηγήσει τη χρήση της. Αυτό που προσπαθώ να σου εξηγήσω είναι ότι&amp;nbsp;όταν λές obj.Dispose δεν συνεπάγεται ότι το κάνεις nothing. Απλά κάνεις cleanup. Για παράδειγμα, αν έχεις ανοίξει ένα αρχείο - οποιονδήποτε unmanaged πόρο - το κάνεις release. Είναι ευθύνη του developer να γράψει κώδικα μέσα στην Dispose και μάλιστα υπάρχουν συγκεκριμένα guidelines που πρέπει να ακολουθήσει για να είναι σωστός ο κώδικας αυτός.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description></item><item><title>Απ: Singleton Form</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/9317.aspx</link><pubDate>Tue, 07 Feb 2006 03:23:09 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:9317</guid><dc:creator>infoCENTER</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/9317.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=12&amp;PostID=9317</wfw:commentRss><description>Παιδιά ξεφύγαμε. Έχουμε δώσει το βάρος στην Dispose. Δεν είναι εκεί το πρόβλημα. Το ξαναλέω. θα μπορούσε το mInstance=Nothing να ήταν στο Closed event της φόρμας. Θα μιλούσαμε για το closed event; &lt;br&gt;&lt;br&gt;Ίσως να φταίω και εγώ που δεν μπορώ να σας δώσω πιο λεπτομερειακά τον όλο προβληματισμό μου αλλά διαβάζοντας προσεχτικά τα posts μου ίσως να μπορέσετε να καταλάβετε τελικά τι εννοώ. &lt;br&gt;&lt;br&gt;Έχω μία shared μεταβλητή μέσα σε μία class. Η μεταβλητή αυτή είναι ένας pointer που δείχνει στο instance του class. Κάνω την class dispose. Για την εφαρμογή το συγκεκριμένο instance έχει τελειώσει. Ο pointer της μεταβλητής γιατί εξακολουθεί και δείχνει σε μία περιοχή δεδομένων που δεν είναι προσβάσιμη από την εφαρμογή όπως δείχνει το μήνυμα του compiler; Σε ένα managed περιβάλλον δεν θα έπρεπε να δείχνει σε Nothing; Γιατί πρέπει να το γράψω εγώ; &lt;br&gt;&lt;br&gt;Δεν μπορώ να το πω πιο απλά. Συγνώμη.</description></item><item><title>Απ: Singleton Form</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/9316.aspx</link><pubDate>Tue, 07 Feb 2006 02:25:15 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:9316</guid><dc:creator>KelMan</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/9316.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=12&amp;PostID=9316</wfw:commentRss><description>&lt;P&gt;&lt;BLOCKQUOTE&gt;&lt;table width="85%"&gt;&lt;tr&gt;&lt;td class="txt4"&gt;&lt;img src="/cs/Themes/default/images/icon-quote.gif"&gt;&amp;nbsp;&lt;strong&gt;infoCENTER wrote:&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="quoteTable"&gt;&lt;table width="100%"&gt;&lt;tr&gt;&lt;td valign="top" class="txt4"&gt;Απο εκεί και πέρα όμως όταν κάνω dispose από την μεριά της εφαρμογής είναι σαν να λέω τελείωσα με αυτό το instance. Άρα θα έπρεπε το .Net ΜΟΝΟ του να βρει ποια άλλα references έχουν γίνει σε αυτό το instance και να τα θέσει Nothing. Αντί να υπάρχουν άστοχοι όπως γράφω pointers. Από εκεί και πέρα δεν το κάνει. Περιμένει απο εμάς να το κάνει και να γράψουμε mInstance=Nothing. &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/BLOCKQUOTE&gt;&lt;/P&gt;
&lt;P&gt;H Dispose χρησιμοποιείται συνήθως για να κάνουμε release τα unmanaged resources (window handles, files, etc). Δηλαδή, όταν λέω objectX.Dispose δεν σημαίνει ότι το Framework θα κάνει κάτι. Εξαρτάται από το τι κώδικας υπάρχει μέσα στην Dispose. Αν ο developer που την έφτιαξε, κάνει Nothing κάποια objects τότε παύουν να υπάρχουν. &lt;/P&gt;
&lt;P&gt;&lt;BLOCKQUOTE&gt;&lt;table width="85%"&gt;&lt;tr&gt;&lt;td class="txt4"&gt;&lt;img src="/cs/Themes/default/images/icon-quote.gif"&gt;&amp;nbsp;&lt;strong&gt;infoCENTER wrote:&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="quoteTable"&gt;&lt;table width="100%"&gt;&lt;tr&gt;&lt;td valign="top" class="txt4"&gt;Όσο για τον GC ας κανονίσει αυτός πότε θα καθαρίσει την μνήμη. &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/BLOCKQUOTE&gt;&lt;/P&gt;
&lt;P&gt;Θα καθαρίσει τη μνήμη όταν δεν έχει άλλη διαθέσιμη ή τον καλέσουμε εμείς (πράγμα που γενικώς δεν θα πρέπει να κάνουμε).&lt;BR&gt;&lt;BR&gt;&lt;BLOCKQUOTE&gt;&lt;table width="85%"&gt;&lt;tr&gt;&lt;td class="txt4"&gt;&lt;img src="/cs/Themes/default/images/icon-quote.gif"&gt;&amp;nbsp;&lt;strong&gt;infoCENTER wrote:&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="quoteTable"&gt;&lt;table width="100%"&gt;&lt;tr&gt;&lt;td valign="top" class="txt4"&gt;Κάποια στιγμή θα το κάνει, τότε η mInstance τι τιμή θα έχει; Που θα δείχνει; Τότε θα τεθεί σε Nothing; Ή θα δείχνει σε μία περιοχή μνήμης χωρίς δεδομένα; &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/BLOCKQUOTE&gt;&lt;BR&gt;&lt;BR&gt;Οποιαδήποτε στιγμή τρέξω το statement mInstance=Nothing, πλέον παύω να έχω reference στο mInstance object, άσχετα αν υπάρχει ακόμα στη μνήμη ή όχι - αν θές άσχετα αν έχει τρέξει ο GC ή όχι. Ένα reference δεν υπάρχει ποτέ περίπτωση να δείξει σε περιοχή μνήμης που δεν έχει δεδομένα.&lt;/P&gt;</description></item></channel></rss>