<?xml version="1.0" encoding="iso-8859-15"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"><channel><title>blogs.ASPItalia.com</title><link>http://blogs.aspitalia.com//az//</link><description>blogs.ASPItalia.com</description><language>it-it</language><copyright>1998-2012 ASPItalia.com/blogs.ASPItalia.com</copyright><generator>Generated by feed.ASPItalia.com 'Cortana' 2012.5.12</generator><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><sy:updateBase>1998-01-01T12:00+00:00</sy:updateBase><lastBuildDate>Wed, 08 Jul 2009 12:21:10 GMT</lastBuildDate><image><title>blogs.ASPItalia.com</title><url>http://gui.aspitalia.com/images/aspitalia/syndication.gif</url><link>http://blogs.aspitalia.com//az//</link></image><item><title>Disabilitare tutti i web control in una pagina.</title><link>http://blogs.aspitalia.com/az/post2522/Disabilitare-Web-Control-Pagina.aspx</link><pubDate>Wed, 08 Jul 2009 12:21:10 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2522" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Visto che mi serve spesso, ecco un po' di veloce codice:&lt;/p&gt; &lt;p&gt;&lt;em&gt;CallAllWebControl&amp;lt;Button&amp;gt;(this.Page, action =&amp;gt; action.Enabled = false); &lt;br /&gt;CallAllWebControl&amp;lt;TextBox&amp;gt;(this.Page, action =&amp;gt; action.Enabled = false);&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;public void CallAllWebControl&amp;lt;T&amp;gt;(Control controls, Action&amp;lt;T&amp;gt; method) where T:Control &lt;br /&gt;{ &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Action&amp;lt;Control, Action&amp;lt;T&amp;gt;&amp;gt; fun = null; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fun = (c, MethodX) =&amp;gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (c.GetType()==typeof(T)) MethodX((T)c); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; foreach (Control item in c.Controls) &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fun(item, method); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fun(controls, method); &lt;br /&gt;} &lt;/em&gt;&lt;/p&gt; &lt;p&gt;Utile anche nel caso volessi &lt;em&gt;check-are&lt;/em&gt; tutti i checkbox nella pagina:&lt;/p&gt; &lt;p&gt;&lt;em&gt;CallAllWebControl&amp;lt;CheckBox&amp;gt;(this.Page, action =&amp;gt; action.Checked = true);&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Non è ottimizzatissimo, ma fa bene il suo lavoro.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.0/" rel="tag"&gt;.NET Framework 3.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.5/" rel="tag"&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_4.0/" rel="tag"&gt;.NET Framework 4.0&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2522/Disabilitare-Web-Control-Pagina.aspx"&gt;&lt;em&gt;Disabilitare tutti i web control in una pagina&amp;amp;hellip;&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET4, .NET Framework, .NET Framework 3.0, .NET Framework 3.5, .NET Framework 4.0</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2522/Disabilitare-Web-Control-Pagina.aspx</guid><slash:comments>3</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2522/Disabilitare-Web-Control-Pagina.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2522.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2522</trackback:ping></item><item><title>C# 4.0 Beta 1, quello che io ho visto</title><link>http://blogs.aspitalia.com/az/post2507/CSharp-4.0-Beta-Visto.aspx</link><pubDate>Sun, 24 May 2009 18:33:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2507" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Giovedì ho trovato il tempo di installare sulla mia macchina la nuova versione di Visual Studio 2010 beta 1. Leggendo i vari documenti sulle novità, la mia curiosità è stata attratta dalle novità del linguaggio C# della version 4.0. Da quel che ho capito sono quattro le &lt;em&gt;novità&lt;/em&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Dynamic Typed Objects&lt;/li&gt;&lt;li&gt;Optional and Named Parameters&lt;/li&gt;&lt;li&gt;Improved COM Interoperability&lt;/li&gt;&lt;li&gt;Co/Contra-Variance&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Sui &lt;em&gt;dynamic&lt;/em&gt; ho avuto proprio una discussione sul fatto che la keywork &lt;em&gt;dynamic&lt;/em&gt; non centra nulla con &lt;em&gt;var&lt;/em&gt;. La dichiarazione di un oggetto come &lt;em&gt;dynamic&lt;/em&gt;, crea effettivamente un oggetto di tipo dinamico in runtime ed elaborato in late-binding, con tutti i problemi che ne derivano!&lt;/p&gt;&lt;p&gt;Scrivere queste linee di codice ora è perfettamente corretto:&lt;/p&gt;&lt;code&gt;dynamic az = &amp;quot;Andrea&amp;quot;;&lt;br /&gt;Console.WriteLine(az); // Andrea&lt;br /&gt;az = 14;&lt;br /&gt;az = 14 * 2;&lt;br /&gt;Console.WriteLine(az); // 28&lt;br /&gt;az = new System.Data.DataTable();&lt;br /&gt;Console.WriteLine(az.GetType()); // System.Data.DataTable&lt;/code&gt;&lt;p&gt;Ma questo nuovo oggetto è utilizzabile anche nelle dichiarazioni di metodi e altro:&lt;/p&gt;&lt;code&gt;Dynamic1(&amp;quot;aa&amp;quot;);&lt;br /&gt;Dynamic1(12);&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;static void Dynamic1(dynamic value)&lt;br /&gt;{&lt;br /&gt;&amp;#xa0;&amp;#xa0; if (value is string)&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; Console.WriteLine(value + &amp;quot; is a string!&amp;quot;);&lt;br /&gt;&amp;#xa0;&amp;#xa0; if (value is int)&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; Console.WriteLine(value + &amp;quot; is a int!&amp;quot;);&lt;br /&gt;}&lt;/code&gt;&lt;p&gt;Ma la potenzialità del &lt;em&gt;dynamic&lt;/em&gt; vanno ben oltre. E' possibile ora chiamare oggetti &lt;em&gt;COM &lt;/em&gt;in modo molto più semplice, ed è diventato anche banale caricare &lt;em&gt;runtime&lt;/em&gt; una &lt;em&gt;dll&lt;/em&gt; e utilizzarne i metodi. Per esempio, avevo questa classe in una dll esterna:&lt;/p&gt;&lt;code&gt;namespace TestDynamic&lt;br /&gt;{&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; public class Utilities&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; public string GetAll(string name)&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; return string.Format(&amp;quot;{0}: {1}&amp;quot;, name, DateTime.Now);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;}&lt;/code&gt;&lt;p&gt;Possiamo caricarla e utilizzarla con i &lt;em&gt;dynamic&lt;/em&gt; (senza &lt;em&gt;reference&lt;/em&gt;). Un esempio di codice che fa questo:&lt;/p&gt;&lt;code&gt;dynamic mya = Assembly.LoadFile(&amp;quot;../class.dll&amp;quot;);&lt;br /&gt;Type myaClassType = mya.GetType(&amp;quot;TestDynamic.Utilities&amp;quot;);&lt;br /&gt;dynamic myaDemoClassObj = Activator.CreateInstance(myaClassType);&lt;br /&gt;string val = myaDemoClassObj.GetAll(&amp;quot;az&amp;quot;);&lt;/code&gt;&lt;p&gt;Facile e comodo? Può essere, ma l'utilizzo del &lt;em&gt;dynamic &lt;/em&gt;non è immune da problemi. Innanzitutto prestazionale: come detto prima, tutto ciò che è &lt;em&gt;dynamic&lt;/em&gt; è elaborato in &lt;em&gt;runtime/late-binding&lt;/em&gt;, dunque con tutti i problemi di prestazioni che ne derivano. L'esempio&amp;#xa0;di codice qui sopra, se confrontato con un metodo tradizionale di loading di una dll e utilizzo del &lt;em&gt;reflector&lt;/em&gt; o, meglio, di &lt;em&gt;interfacce&lt;/em&gt;, perde su tutti i fronti. Secondo problema: Visual Studio 2010 non è in grado di fornici l'intellisense:&lt;/p&gt;&lt;p&gt;&lt;img align="baseline" alt="Dynamic in Visual Studio 2010 beta 1" src="http://blogs.aspitalia.com/img/andrewz/Immagini/dynamic.JPG" border="0" hspace="0" complete="true" complete="true" /&gt;&lt;/p&gt;&lt;p&gt;L'utilizzo dei parametri opzionali o dichiarandone il nome è una di quelle novità che ricordano tanto ciò che &lt;em&gt;Visual Basic&lt;/em&gt; offre da parecchio tempo:&lt;/p&gt;&lt;code&gt;public string MyMethod(int Id = 0, string Name = &amp;quot;AZ&amp;quot;)&lt;br /&gt;{&lt;br /&gt;...&lt;br /&gt;}&lt;/code&gt;&lt;p&gt;Che crea in automatico gli &lt;em&gt;overload&lt;/em&gt; del metodo passando ai parametri i valori di &lt;em&gt;default&lt;/em&gt; specificati:&lt;/p&gt;&lt;code&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; MyMethod();&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; MyMethod(1);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; MyMethod(1, &amp;quot;Andrea&amp;quot;);&lt;/code&gt;&lt;p&gt;E se nell'esempio sopra volessimo passare solo il parametro &lt;em&gt;Name&lt;/em&gt; e non l'&lt;em&gt;Id&lt;/em&gt;? Questo codice ci darebbe errore, perché si aspetta in ogni caso come primo parametro un &lt;em&gt;int&lt;/em&gt;:&lt;/p&gt;&lt;code&gt;MyMehotd(&amp;quot;Andrea&amp;quot;);&lt;/code&gt;&lt;p&gt;Una delle altre novità di &lt;em&gt;C# 4.0&lt;/em&gt;, è la possibilità di dichiarare oltre al valore anche il parametro a cui sarà assegnato:&lt;/p&gt;&lt;code&gt;MyMethod(Name: &amp;quot;Andrea&amp;quot;);&lt;br /&gt;MyMethod(Name: &amp;quot;Andrea&amp;quot;, Id: 1);&lt;/code&gt;&lt;p&gt;L'ultima novità, &lt;em&gt;Covariance&lt;/em&gt;&amp;#xa0;e &lt;em&gt;Contravariance&lt;/em&gt;. La covariance permette di trattare gli oggetti come il tipo da cui deriva. Per esempio, avendo le classi:&lt;/p&gt;&lt;code&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; public class First&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; public class Second : First&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;/code&gt;&lt;p&gt;Possiamo scrivere:&lt;/p&gt;&lt;code&gt;First[] coll = new Second[20];&lt;/code&gt;&lt;p&gt;Ma non possiamo in alcun modo utilizzare questa possibilità nel caso dei &lt;em&gt;generic&lt;/em&gt; essendo il C# a cui siamo abituati &lt;em&gt;invariant&lt;/em&gt;:&lt;/p&gt;&lt;code&gt;List&amp;lt;Second&amp;gt; xsecond = new List&amp;lt;Second&amp;gt;();&lt;br /&gt;List&amp;lt;First&amp;gt; xfirst = xsecond;&lt;br /&gt;&lt;br /&gt;Cannot implicitly convert type 'System.Collections.Generic.List&amp;lt;Test1.Second&amp;gt;' to 'System.Collections.Generic.IList&amp;lt;Test1.First&amp;gt;'.&lt;/code&gt;&lt;p&gt;Attualmente ci sono altri metodi per copiare un oggetto o una collection di oggetti (&lt;em&gt;cast&lt;/em&gt; o &lt;em&gt;Linq&lt;/em&gt;). Con la nuove versione di C#, abbiamo una nuova tecnica&amp;#xa0; ma, come scritto sopra, per ora è possibile solo con le &lt;em&gt;interfacce&lt;/em&gt; e &lt;em&gt;delegate&lt;/em&gt; modificare questo comportamento:&lt;/p&gt;&lt;code&gt;public class Other&amp;lt;T&amp;gt; where T : First // Or without constraint&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;public class Other2&amp;lt;T&amp;gt; : IOther2&amp;lt;T&amp;gt;&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;interface IOther2&amp;lt;out T&amp;gt;&lt;br /&gt;{&lt;br /&gt;}&lt;/code&gt;&lt;p&gt;Ora, grazie all'interfaccia (e la specifica del &lt;em&gt;generic T&lt;/em&gt; con &lt;em&gt;out&lt;/em&gt;), possiamo utilizzare anche gli oggetti derivati della nostra classe:&lt;/p&gt;&lt;code&gt;var xot2 = new Other2&amp;lt;Second&amp;gt;();&lt;br /&gt;IOther2&amp;lt;First&amp;gt; xot21 = xot2;&lt;/code&gt;&lt;p&gt;La keyword &lt;em&gt;out&lt;/em&gt; è utilizzata per specificare&amp;#xa0;gli oggetti in &lt;em&gt;output&lt;/em&gt;, mentre &lt;em&gt;in&lt;/em&gt; come è facilmente intuibile è utilizzabile come parametro &lt;em&gt;input&lt;/em&gt;&amp;#xa0;di metodi con i &lt;em&gt;delegate&lt;/em&gt;, eccole utilizzare entrambe con i &lt;em&gt;delegate&lt;/em&gt;:&lt;/p&gt;&lt;code&gt;delegate T Func1&amp;lt;out T&amp;gt;();&lt;br /&gt;delegate void Action1&amp;lt;in T&amp;gt;(T a);&lt;br /&gt;...&lt;br /&gt;// Covariance&lt;br /&gt;Func1&amp;lt;Second&amp;gt; secondx = () =&amp;gt; new Second();&lt;br /&gt;Func1&amp;lt;First&amp;gt; firstx = secondx;&lt;br /&gt;// Contravariance&lt;br /&gt;Action1&amp;lt;First&amp;gt; act1 = (ani) =&amp;gt; { Console.WriteLine(ani.ToString()); };&lt;br /&gt;Action1&amp;lt;Second&amp;gt; cat1 = act1;&lt;br /&gt;cat1(new Second());&lt;/code&gt;&lt;p&gt;Ho detto qualcosa di inesatto? E' facile che sia così: il mio studio sulle novità di questo linguaggio si basano su test e letture che il poco tempo libero attuale mi permette. Questa scusa mi lascia scevro di responsabilità? Se ne sono convinto io...&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_4.0/" rel="tag"&gt;.NET Framework 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Visual_Studio/" rel="tag"&gt;Visual Studio&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2507/CSharp-4.0-Beta-Visto.aspx"&gt;&lt;em&gt;C# 4.0 Beta 1, quello che io ho visto&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET4, .NET Framework, .NET Framework 4.0, Visual Studio</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2507/CSharp-4.0-Beta-Visto.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2507/CSharp-4.0-Beta-Visto.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2507.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2507</trackback:ping></item></channel></rss>
