<?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>Απ: code analysis</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/71754.aspx</link><pubDate>Fri, 14 Dec 2012 19:44:06 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:71754</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/71754.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=71754</wfw:commentRss><description>&lt;BLOCKQUOTE&gt;&lt;div&gt;&lt;img src="http://www.dotnetzone.gr/cs/Themes/default/images/icon-quote.gif"&gt; &lt;strong&gt;nikos123:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;Το datatable είναι fully managed, συνεπώς δεν χρειάζεται dispose.&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Δεν έχει καμμία σημασία αν κάποια κλάση χρησιμοποιεί μόνο Managed resources ή όχι, για το αν χρειάζεται το Dispose. Από τη στιγμή που μία κλάση υλοποιεί το IDisposable interface, σου λέει ότι ΧΡΕΙΑΖΕΤΑΙ να κάνεις Dispose διαφορετικά κάποια ακριβά resources θα δεσμευτούν για περισσότερη ώρα απ' ότι χρειάζεται.&amp;nbsp;Γι αυτό και ο compiler ειδοποιεί ότι υπάρχει ένα αντικείμενο, το οποίο έχει ειδοποιήσει ότι χρειάζεται Dispose, το οποίο όμως αφήνεται στην τύχη του.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Το .NET κάποια στιγμή θα εκτελέσει ένα garbage collection και θα μαζέψει το περιττό datatable, μέχρι εκείνη τη στιγμή όμως, το DataTable θα παραμένει στη μνήμη.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Ειδικά για το DataTable, αξίζει &lt;a href="http://stackoverflow.com/a/1603516/134204"&gt;αυτή η απάντηση&lt;/a&gt; στο StackOverflow που εξηγεί για ποιό λόγο το DataTable απαιτεί την Dispose.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Όσον αφορά τον ίδιο τον κώδικα, το warning ειδοποιεί για ένα άλλο πρόβλημα. Η παρακάτω γραμμή:&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;DataTable insdt &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; DataTable();
insdt &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; resultGV.DataSource &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;as&lt;/span&gt; DataTable;&lt;/span&gt;&lt;/pre&gt;δημιουργεί ένα DataTable και ΑΜΕΣΩΣ το πετάει, για να το αντικαταστήσει με ένα άλλο. Προφανώς, το πρώτο DataTable δεν γίνεται ποτέ Dispose.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Θα έπρεπε να είναι&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;DataTable insdt ;
insdt &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; resultGV.DataSource &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;as&lt;/span&gt; DataTable;&lt;/span&gt;&lt;/pre&gt;ή ακόμα καλύτερα&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;DataTable insdt =resultGV.DataSource &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;as&lt;/span&gt; DataTable;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Μήπως ο αρχικός κώδικας ήταν γραμμένος σε VB.NET? Εκεί μία μεταβλητή ορίζεται ως&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Dim&lt;/span&gt; insdt &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;As&lt;/span&gt; DataTable&lt;/span&gt;&lt;/pre&gt;οπότε μπορεί κάποιος να έβαλε κατά λάθος ένα New, μετά να έγινε το cast κλπ κλπ. Ακόμα και στην VB.NET όμως μπορείς να γράψεις σωστά την ίδια γραμμή:&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Dim&lt;/span&gt; insdt &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;As&lt;/span&gt; DataTable= &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;CType&lt;/span&gt;(resultGV.DataSource,DataTable)&lt;/span&gt;&lt;/pre&gt;Τέλος, το συγκεκριμένο cast θέλει λίγη προσοχή, καθώς το as επιστρέφει null αν αποτύχει το cast. Το αποτέλεσμα θα είναι να σκάσει ο κώδικας όταν θα προσπαθήσει να γράψει στο server.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Είναι προτιμότερο αντί για as να χρησιμοποιηθεί το παρακάτω:&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;DataTable insdt=(DataTable)resultGV.DataSource;&lt;/span&gt;&lt;/pre&gt;Το οποίο θα σκάσει λέγοντας ξεκάθαρα ότι το DataSource δεν είναι DataTable.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Εναλλακτικά θα πρέπει να μπει έλεγχος ότι το insdt δεν είναι null και να μην προχωρήσει το Bulk Import&lt;/div&gt;</description></item><item><title>Απ: code analysis</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/71751.aspx</link><pubDate>Fri, 14 Dec 2012 08:01:57 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:71751</guid><dc:creator>nikos123</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/71751.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=71751</wfw:commentRss><description>Το datatable είναι fully managed, συνεπώς δεν χρειάζεται dispose.&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;To NET δεν κάνει dispose από μόνο του.&lt;/div&gt;</description></item><item><title>code analysis</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/71750.aspx</link><pubDate>Fri, 14 Dec 2012 07:37:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:71750</guid><dc:creator>evagelos</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/71750.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=71750</wfw:commentRss><description>&lt;p&gt;Γεια σας παιδιά.&lt;/p&gt;&lt;p&gt;Εχω φτιάξει αυτήν την μεθοδο που λειτουργεί μια χαρα ή έτσι νομίζω τουλάχιστον.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;&lt;span style="color:black;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;        &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;private&lt;/span&gt; &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;void&lt;/span&gt; insData()
        {
            &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;if&lt;/span&gt; (resultGV.Rows.Count &amp;gt; 0)
            {

                DataTable insdt &lt;span style="color:red;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;=&lt;/span&gt; &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;new&lt;/span&gt; DataTable();

                insdt &lt;span style="color:red;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;=&lt;/span&gt; resultGV.DataSource &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;as&lt;/span&gt; DataTable;

                &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;using&lt;/span&gt; (SqlBulkCopy bulkCopy &lt;span style="color:red;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;=&lt;/span&gt;
                            &lt;span style="color:blue;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;new&lt;/span&gt; SqlBulkCopy(connection.ConnectionString))
                {
                    &lt;span style="color:green;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;// column mappings fyeid, un_custid, qty, val, code&lt;/span&gt;
                    bulkCopy.ColumnMappings.Add(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"id"&lt;/span&gt;, &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"id"&lt;/span&gt;);
                    bulkCopy.ColumnMappings.Add(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"code"&lt;/span&gt;, &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"code"&lt;/span&gt;);
                    bulkCopy.ColumnMappings.Add(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"descr"&lt;/span&gt;, &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"descr"&lt;/span&gt;);
                    bulkCopy.ColumnMappings.Add(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"catid1"&lt;/span&gt;, &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"catid1"&lt;/span&gt;);
                    bulkCopy.ColumnMappings.Add(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"cost1"&lt;/span&gt;, &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"cost1"&lt;/span&gt;);
                    bulkCopy.ColumnMappings.Add(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"vtcid"&lt;/span&gt;, &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"vtcid"&lt;/span&gt;);
                    bulkCopy.ColumnMappings.Add(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"grouptxt"&lt;/span&gt;, &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"grouptxt"&lt;/span&gt;);

                    bulkCopy.DestinationTableName &lt;span style="color:red;font-family:Courier New;font-size:11px;font-weight:normal;background-color:transparent;"&gt;=&lt;/span&gt; &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"material"&lt;/span&gt;;
                    bulkCopy.WriteToServer(insdt);
                }                
                MessageBox.Show(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Τέλος εξαγωγής"&lt;/span&gt;, &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Τέλος"&lt;/span&gt;, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Η ερώτησεις μου:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Βλέπετε κάποιο λάθος;&lt;/li&gt;&lt;li&gt;Στο code analysis μου βγάζει ότι δεν κάνω dispose το datateble μου. Και εδώ έχω τα ερωτήματά μου: Δεν πρέπει να το κάνει μονο του αυτό το .net; Τι θα "πρέπει" να κάνω;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Ευχαριστώ&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description></item></channel></rss>