<?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>.NET Framework</title><link>https://www.dotnetzone.gr:443/cs/forums/14/ShowForum.aspx</link><description>Θέματα για threading, remoting, reflection, exception handling, security, regex κλπ.</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: FxCop και IDisposable implementation warning</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/28528.aspx</link><pubDate>Wed, 11 Apr 2007 19:12:56 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:28528</guid><dc:creator>KelMan</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/28528.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=28528</wfw:commentRss><description>&lt;P&gt;Επίσης, στο site της IDesign έχει ένα πολύ ωραίο οδηγό Coding Standards Guidelines &amp;amp; Best Practices &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description></item><item><title>Απ: FxCop και IDisposable implementation warning</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/28516.aspx</link><pubDate>Wed, 11 Apr 2007 18:16:41 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:28516</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/28516.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=28516</wfw:commentRss><description>&lt;P&gt;Τα warnings που αφορούν typed datasets, typed datatables μπορείς να τα αγνοήσεις, εκτός κι αν έχεις πειράξει τον κώδικα τους και έχεις προσθέσει νέα πεδία. Τα warnings που αφορούν δικές σου κλάσεις θα πρέπει να τα διορθώσεις.&lt;/P&gt;
&lt;P&gt;Θα βρεις ένα καλό άρθρο για το IDisposable στο &lt;A href="http://www.codeproject.com/csharp/DestructorsInCs.asp"&gt;http://www.codeproject.com/csharp/DestructorsInCs.asp&lt;/A&gt;&amp;nbsp;και ένα template για τη σωστή υλοποίηση του στο &lt;A href="http://www.idesign.net/idesign/DesktopDefault.aspx?tabindex=-1&amp;amp;tabid=19&amp;amp;download=40"&gt;http://www.idesign.net/idesign/DesktopDefault.aspx?tabindex=-1&amp;amp;tabid=19&amp;amp;download=40&lt;/A&gt;&amp;nbsp;. Ο Juval Lowy, ο οποίος δουλεύει στην IDesign, έχει γράψει ένα πολύ καλό βιβλίο, το ".NET Components" της O' Reilly στο οποίο περιγράφει σε μεγάλη λεπτομέρεια το πως και το γιατί του IDisposeable.&lt;/P&gt;</description></item><item><title>Απ: FxCop και IDisposable implementation warning</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/28512.aspx</link><pubDate>Wed, 11 Apr 2007 17:53:34 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:28512</guid><dc:creator>entrodus</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/28512.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=28512</wfw:commentRss><description>Ευχαριστώ για την απάντηση-δοκίμιο. &lt;br&gt;Είναι λίγο μπερδεμένα ακόμα τα πράγματα... &lt;br&gt;&lt;br&gt;Για αρχή μάλλον βλέπω να αγνοώ τα μηνύματα, θα διαβάσω καμιά 30ρια φορές ακόμα την απάντηση σου... ψάχνω και κανα αρθράκι... και σιγά σιγά θα βγάλω την άκρη. &lt;br&gt;&lt;br&gt;</description></item><item><title>Απ: FxCop και IDisposable implementation warning</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/28445.aspx</link><pubDate>Wed, 11 Apr 2007 00:19:07 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:28445</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/28445.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=28445</wfw:commentRss><description>&lt;P&gt;Γενικά, το FxCop είναι φοβερό εργαλείο. Ειδικά στον έλεγχο για τον σωστό ορισμό του IDisposable κυριολεκτικά καταλαβαίνει τί κάνει ο κώδικας σου και σου βρίσκει τα λάθη. Το περίεργο είναι ότι μερικά από αυτά τα λάθη τα βρίσκει στον generated κώδικα των typed datases, services κλπ! &lt;/P&gt;
&lt;P&gt;Γενικά, η κλάση Dispose χρησιμεύει για να καθαρίζει είτε unmanaged είτε ακριβά resources, όπως ένα connection, ένα stream, μεγάλους πίνακες κλπ, τα οποία θέλεις να ελέγχεις πότε θα ελευθερωθούν. Επειδή όμως άλλο το dispose λόγω finalization και άλλο επειδή κάλεσες την dispose, χρειάζεσαι δύο overloads της dispose. Η μία παίρνει σαν παράμετρο το isDisposing που ειδοποιεί για το αν το dispose γίνεται λόγω finalization ή επειδή κάλεσες την Dispose. Η διαφορά είναι ότι όταν γίνεται finalization δεν ξέρεις αν τα πεδία της κλάσης έχουν υπαρκτά αντικείμενα ή έχουν ήδη γίνει finalize! Μπορεί π.χ. να πας εσύ να κάνεις dispose ένα stream και αυτό να έχει ήδη γίνει disposed. Γι αυτό, η Dispose(bool) έχει ένα if το οποίο καλεί την Dispose του κάθε πεδίου αν έχει τιμή true. Για τα unmanaged resources δεν ισχύει αυτό, και πάντα τα κλείνεις/σβήνεις έξω από το if. Πέρα από αυτό, η απλή Dispose() καλεί την Dispose(true) ενώ ο finalizer την Dispose(false).&lt;/P&gt;
&lt;P&gt;Άλλη σημαντική λεπτομέρεια, είναι ότι η Dispose(bool) πρέπει να είναι protected virtual για να μπορούν οι child κλάσεις να κάνουν override και να προσθέσουν τον δικό τους κώδικα για dispose. Τελευταία λεπτομέρεια, είναι ότι τελειώνοντας η Dispose() πρέπει να καλέσει την GC.SuppressFinalize, για να ειδοποιήσει το .NET ότι έχει ήδη γίνει το dispose, και να μην ξανακαλέσει τον finalizer. Τέλος, για να αποφευχθούν προβλήματα του στυλ καλώ δύο φορές την Dispose, η Dispose(bool) ελέγχει ένα πεδίο, το disposed ή _disposed ή όπως θέλεις να το πεις, σε true και τερματίζει αμέσως αν το βρει true. Αλλιώς, όταν τελειώσει το θέτει true.&lt;/P&gt;
&lt;P&gt;Και το FxCop τα ελέγχει όλα αυτά!&lt;/P&gt;
&lt;P&gt;Ο λόγος τώρα που σου βγάζει warnings σε κάποια generated datatables, services κλπ και δεν σου το βγάζει σε απλά datatables είναι ότι τα typed datatables ή τα services είναι ουσιαστικά απλές κλάσεις. Επειδή συνήθως αυτές οι κλάσεις δεν περιέχουν επιπλέον πεδία, ο generated κώδικας για το dispose δεν υλοποιεί όλες τις λεπτομέρεις. Το FxCop όμως δεν μπορεί να ξέρει αν η κλάση περιέχει πεδία που κρατάνε unmanaged ή ακριβά resources, γι αυτό σε ειδοποιεί. Μπορείς να αγνοήσεις αυτή την ειδοποίηση ή να τροποποιήσεις την Dispose των Datatable για να μην γκρινιάζει το FxCop.&lt;/P&gt;
&lt;P&gt;Είχα διαβάσει και εγώ αρκετά πράγματα για το πως φτιάχνει κανείς ένα σωστό Dispose, αλλά το κατάλαβα πραγματικά όταν άρχισα να διορθώνω τα warnings του FxCop. Δεν είναι υπερβολή να πω ότι το σωστό IDisposable το έμαθα από το FxCop!&lt;/P&gt;</description></item><item><title>FxCop και IDisposable implementation warning</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/28440.aspx</link><pubDate>Tue, 10 Apr 2007 23:40:02 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:28440</guid><dc:creator>entrodus</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/28440.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=28440</wfw:commentRss><description>Αφού με χαρά εντόπισα αυτό το απίστευτο εργαλειάκι (fxCop) που θα με βοηθήσει να κατανοήσω και να φτιάξω καλύτερα τον κώδικα μου, το έτρεξα και έπεσα πάνω σε αυτό το warning: &lt;br&gt;&lt;br&gt;"Types that declare disposable members should also implement &lt;br&gt;IDisposable. If the type does not own any unmanaged &lt;br&gt;resources, do not implement a finalizer on it."&lt;br&gt;Help: http://www.gotdotnet.com/team/fxcop/docs/rules.aspx?version=1.35&amp;amp;url=/Design/TypesThatOwnDisposableFieldsShouldBeDisposable.html &lt;br&gt;&lt;br&gt;&lt;br&gt;(Στον κώδικα&amp;nbsp; μου, μου χτυπάνε κάποια DataTables που έχω δηλώσει σε κάποιες κλάσεις. )&lt;br&gt;&lt;br&gt;Πρέπει όντως να κάνω implement το IDisposable? Έχει δηλαδή unmanaged resources το DataTable (?!?) και αν ναι, πως κλείνουν?&lt;br&gt;Στο παράδειγμα του fxCop έχει FileStream και απλώς τα κάνει Close. &lt;br&gt;&lt;br&gt;Εντομεταξύ, το fxCop γενικώς είναι "σωστό" σαν εργαλείο?&lt;br&gt;Προσπάθησα να αντιγράψω τη λογική αυτή με τα DataTables σε ένα μικρότερο project για να κάνω τις δοκιμές μου, αλλά το fxCop δεν μου χτύπησε warning για dispose.</description></item></channel></rss>