<?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//matteo//</link><description>blogs.ASPItalia.com</description><language>it-it</language><copyright>1998-2013 ASPItalia.com/blogs.ASPItalia.com</copyright><generator>Generated by feed.ASPItalia.com 'Cortana' 2013.6.5</generator><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><sy:updateBase>1998-01-01T12:00+00:00</sy:updateBase><lastBuildDate>Wed, 17 Feb 2010 22:38:00 GMT</lastBuildDate><image><title>blogs.ASPItalia.com</title><url>http://gui.aspitalia.com/images/aspitalia/syndication.gif</url><link>http://blogs.aspitalia.com//matteo//</link></image><item><title>Enumeratori: flags and extensions</title><link>http://blogs.aspitalia.com/matteo/post2593/Enumeratori-Flags-And-Extensions.aspx</link><pubDate>Wed, 17 Feb 2010 22:38:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2593" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Può capitare di avere la necessità di utilizzare un'enumerazione come insieme di bit, ovvero come un elenco di elementi generato in modo combinato. Un esempio concreto di questo utilizzo potrebbe essere la gestione di una proprietà "Permission" che definisca quali operazioni (lettura, creazione, modifica, cancellazione, ecc.) è autorizzato a compiere un utente. Per poter gestire le diverse autorizzazioni con un unico enumeratore dobbiamo semplicemente aggiungere all'enumeratore l'&lt;a href="http://msdn.microsoft.com/it-it/library/system.flagsattribute.aspx"&gt;attributo Flags&lt;/a&gt; ed avere l'accortezza di esplicitare i valori come potenze di 2 (1, 2, 4, 8, 16, 32, ecc. o nell'equivalente esadecimale 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, ecc.) per consentire le operazioni bit per bit (AND, OR e XOR) evitando sovrapposizioni:&lt;/p&gt; &lt;p&gt;0: 0000 &lt;br /&gt;1: 0001 &lt;br /&gt;2: 0010 &lt;br /&gt;4: 0100 &lt;br /&gt;8: 1000 &lt;br /&gt;e così via.&lt;/p&gt; &lt;p&gt;Il nostro enumeratore sarà dunque:&lt;/p&gt; &lt;code&gt;[Flags] &lt;br /&gt;public enum Permission &lt;br /&gt;{ &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; None = 0x0, &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Read = 0x1, &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Execute = 0x2, &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Create = 0x4, &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Modify = 0x8, &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Delete = 0x10, &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Special = 0x20, &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; FullControl = Read | Execute | Create | Modify | Delete | Special &lt;br /&gt;}&lt;/code&gt; &lt;p&gt;Si noti la presenza di un valore predefinito - None = 0, che è sempre buona norma definire - e la dichiarazione di un valore combinato - FullControl pari all'insieme di tutte le autorizzazioni disponibili, combinate tramite OR; in modo analogo potremo definire le permission dei singoli utenti, ad esempio:&lt;/p&gt; &lt;code&gt;account.Permission = Permission.Read | Permission.Execute;&lt;/code&gt; &lt;p&gt;Saremo in grado di verificare se l'utente è autorizzato ad effettuare un determinato tipo di operazione mediante un confronto in AND:&lt;/p&gt; &lt;code&gt;bool canRead = (account.Permission &amp;amp; Permission.Read) != Permission.None;&lt;/code&gt; &lt;p&gt;Possiamo inoltre sfruttare i metodi di estensioni del Framework (3.5 o superiore, necessitano un riferimento a System.Core.dll) per centralizzare questo confronto ed esporlo direttamente attraverso l'enumeratore:&lt;/p&gt; &lt;code&gt;public static class PermissionExtensions &lt;br /&gt;{ &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public static bool HasPermission(this Permission permission, Permission permissionToCheck) &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return (permission &amp;amp; permissionToCheck) != Permission.None; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;br /&gt;}&lt;/code&gt; &lt;p&gt;Così da avere:&lt;/p&gt; &lt;code&gt;bool canRead = account.Permission.HasPermission(Permission.Read);&lt;/code&gt; &lt;p&gt;HTH&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.5/" rel="tag"&gt;.NET Framework 3.5&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/matteo/post2593/Enumeratori-Flags-And-Extensions.aspx"&gt;&lt;em&gt;Enumeratori: flags and extensions&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Matteo Casati</dc:creator><category>.NET, .NET Framework, .NET Framework 3.5</category><guid isPermaLink="true">http://blogs.aspitalia.com/matteo/post2593/Enumeratori-Flags-And-Extensions.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/matteo/post2593/Enumeratori-Flags-And-Extensions.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS2593.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2593</trackback:ping></item><item><title>.NET Framework 4.0 beta 2: Visual Studio 2010</title><link>http://blogs.aspitalia.com/matteo/post2551/.NET-Framework-4.0-Beta-2-Visual-Studio-2010.aspx</link><pubDate>Mon, 19 Oct 2009 19:23:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2551" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;A distanza di &lt;a href="http://blogs.aspitalia.com/matteo/post2500/.net-framework-4.0-beta-1-visual-studio-2010.aspx"&gt;5 mesi dall'uscita della beta 1&lt;/a&gt; è disponibile (da oggi per gli abbonati MSDN e da mercoledì 21 ottobre per tutti) il download della &lt;strong&gt;beta 2&lt;/strong&gt; che preclude al rilascio finale di &lt;strong&gt;&lt;a href="http://www.microsoft.com/visualstudio/it-it/products/2010/default.mspx"&gt;Visual Studio 2010&lt;/a&gt;&lt;/strong&gt;, previsto per il 22 marzo 2010 con la RTM probabilmente verso la fine di quest'anno.&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.aspitalia.com/img/m.casati/netframework4.0beta2visualstudio2010_1482c/vs2010-logo_2.gif"&gt;&lt;img title="logo di visual studio 2010" border="0" alt="logo di visual studio 2010" src="http://blogs.aspitalia.com/img/m.casati/netframework4.0beta2visualstudio2010_1482c/vs2010-logo_thumb.gif" width="255" height="109" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Rispetto alla beta 1 sono state migliorate performance e stabilità; tra le novità i modelli di progetto e gli strumenti di debug per &lt;strong&gt;SharePoint&lt;/strong&gt;, il supporto per lo sviluppo di applicazioni per &lt;strong&gt;Windows 7&lt;/strong&gt;, i nuovi &lt;strong&gt;Windows Azure Tools&lt;/strong&gt; e la presenza di un designer per &lt;strong&gt;Silverlight&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.hanselman.com/blog/visualstudio2010beta2.aspx"&gt;Scott Hanselman&lt;/a&gt; ci mostra in anteprima lo splash screen della beta 2, caratterizzato da un design accattivante ed in linea con lo stile del neo rinnovato portale &lt;a href="http://msdn.microsoft.com/it-it/default.aspx"&gt;MSDN&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Per quanto riguarda le diverse versioni disponibili, attraverso il sito &lt;a href="http://www.microsoft.com/presspass/press/2009/oct09/10-19vsfinalstretchpr.mspx"&gt;Microsoft PressPass&lt;/a&gt;, è stata annunciata la semplificazione della linea di prodotto a tre versioni principali di Visual Studio 2010:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Microsoft Visual Studio 2010 &lt;strong&gt;Ultimate&lt;/strong&gt; con MSDN, la suite completa di strumenti per la gestione dell'intero ciclo di vita dell'applicazione, dalla progettazione alla distribuzione.&lt;/li&gt; &lt;li&gt;Microsoft Visual Studio 2010 &lt;strong&gt;Premium&lt;/strong&gt; con MSDN, un set completo di strumenti per lo sviluppo di applicazioni scalabili e di alta qualità&lt;/li&gt; &lt;li&gt;Microsoft Visual Studio 2010 &lt;strong&gt;Professional&lt;/strong&gt; con MSDN, lo strumento di base essenziale per gli sviluppatori.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Team Foundation Server&lt;/strong&gt; sarà incluso in tutte le versioni di Visual Studio 2010: &lt;strong&gt;TFS Basics&lt;/strong&gt;, con un'installazione semplice e semplificata, è lo strumento ideale per piccoli team che necessitano solo delle funzionalità principali come il controllo del codice sorgente, bug tracking ed automazione delle build e può essere eseguito sia su computer server che client.&lt;/p&gt; &lt;p&gt;Gli abbonamenti MSDN saranno inclusi nell'acquisto delle suddette versioni di Visual Studio e la versione Professional sarà disponibile anche senza abbonamento; per la corrispondenza tra le varie versioni è possibile consultare il documento &lt;a href="http://www.microsoft.com/presspass/newsroom/developer/factsheets/vs2010packagingfs.docx"&gt;Visual Studio 2010 Packaging Fact Sheet&lt;/a&gt; (.docx, 554KB)&lt;/p&gt; &lt;p&gt;Per maggiori informazioni sulle altre tecnologie all'interno del .NET Framework 4.0 si può fare riferimento al &lt;a href="http://www.aspitalia.com/focuson/1126/visual-studio-2010-.net-framework-4.0-beta-data-release.aspx"&gt;nostro speciale&lt;/a&gt;.&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/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_4.0/" rel="tag"&gt;ASP.NET 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/SharePoint/" rel="tag"&gt;SharePoint&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Silverlight/" rel="tag"&gt;Silverlight&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Visual_Studio/" rel="tag"&gt;Visual Studio&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_7/" rel="tag"&gt;Windows 7&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Client/" rel="tag"&gt;Windows Client&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/XAML/" rel="tag"&gt;XAML&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/matteo/post2551/.NET-Framework-4.0-Beta-2-Visual-Studio-2010.aspx"&gt;&lt;em&gt;.NET Framework 4.0 beta 2: Visual Studio 2010&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Matteo Casati</dc:creator><category>.NET, .NET Framework, .NET Framework 4.0, ASP.NET, ASP.NET 4.0, SharePoint, Silverlight, Visual Studio, Windows 7, Windows Client, XAML</category><guid isPermaLink="true">http://blogs.aspitalia.com/matteo/post2551/.NET-Framework-4.0-Beta-2-Visual-Studio-2010.aspx</guid><slash:comments>2</slash:comments><wfw:comment>http://blogs.aspitalia.com/matteo/post2551/.NET-Framework-4.0-Beta-2-Visual-Studio-2010.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS2551.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2551</trackback:ping></item><item><title>.NET Framework 4.0 beta 1: Visual Studio 2010 e Training Kit disponibili per tutti</title><link>http://blogs.aspitalia.com/matteo/post2503/.NET-Framework-4.0-Beta-1-Visual-Studio-2010-Training.aspx</link><pubDate>Thu, 21 May 2009 07:25:06 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2503" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Come preannunciato nel &lt;a href="http://blogs.aspitalia.com/matteo/post2500/.net-framework-4.0-beta-1-visual-studio-2010.aspx"&gt;post precedente&lt;/a&gt;, il &lt;a href="http://msdn.microsoft.com/it-it/netframework/dd819232(en-us).aspx"&gt;download di Visual Studio 2010 beta 1&lt;/a&gt; è ora disponibile per tutti; inoltre anche il &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;familyid=752cb725-969b-4732-a383-ed5740f02e93#tm"&gt;Training Kit su Visual Studio 2010 e il .NET Framework 4&lt;/a&gt; è stato aggiornato alla beta 1.&lt;/p&gt; &lt;p&gt;Maggiori informazioni sul blog del team MSDN Italia &lt;a href="http://blogs.msdn.com/italy/archive/2009/05/20/visual-studio-2010-beta-1-disponibile-il-download-per-tutti.aspx"&gt;qui&lt;/a&gt; e &lt;a href="http://blogs.msdn.com/italy/archive/2009/05/20/visual-studio-2010-and-net-framework-4-training-kit.aspx"&gt;qui&lt;/a&gt; e, ovviamente, sul &lt;a href="http://netfx4.winfxitalia.com/"&gt;mini-sito in ASPItalia&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Buon download a tutti :-)&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/ASPItalia.com/" rel="tag"&gt;ASPItalia.com&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/matteo/post2503/.NET-Framework-4.0-Beta-1-Visual-Studio-2010-Training.aspx"&gt;&lt;em&gt;.NET Framework 4.0 beta 1: Visual Studio 2010 e Training Kit disponibili per tutti&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Matteo Casati</dc:creator><category>.NET, .NET Framework, .NET Framework 4.0, ASPItalia.com, Visual Studio</category><guid isPermaLink="true">http://blogs.aspitalia.com/matteo/post2503/.NET-Framework-4.0-Beta-1-Visual-Studio-2010-Training.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/matteo/post2503/.NET-Framework-4.0-Beta-1-Visual-Studio-2010-Training.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS2503.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2503</trackback:ping></item><item><title>.NET Framework 4.0 beta 1: Visual Studio 2010</title><link>http://blogs.aspitalia.com/matteo/post2500/.NET-Framework-4.0-Beta-1-Visual-Studio-2010.aspx</link><pubDate>Mon, 18 May 2009 15:13:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2500" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Finalmente è terminato il conto alla rovescia per la beta 1 della nuova versione di Visual Studio: il download è disponibile a partire da ora per tutti gli abbonati MSDN e (probabilmente) tra un&amp;#xa0; paio di giorni anche per. tutti gli altri!&lt;/p&gt;&lt;p&gt;L'uso del framework .NET 4.0, un'interfaccia utente migliorata e semplificata, il pieno supporto a Silverlight, il nuovo motore di Intellisense per JavaScript e la modalità di messa online rapida &amp;quot;One Click Deployment&amp;quot; saranno sicuramente le prime cose notate da chi utilizza ASP.NET. Ma le novità non finiscono certo qui:&lt;/p&gt;&lt;p&gt;Visual Studio 2010, rispetto alle versioni precedenti, abbraccia maggiormente l'intero ciclo di vita dell'applicazione (ALM - Application Lifecycle Management); non è più quindi uno strumento ad uso pressoché esclusivo degli sviluppatori ma è un valido tool anche per architetti, database administrators, tester e project manager; alcune delle nuove visualizzazioni introdotte sono proprio in questo senso, come ad esempio &amp;quot;Architecture Explorer&amp;quot; o &amp;quot;Test Impact View&amp;quot;.&lt;/p&gt;&lt;p&gt;Per quanto riguarda la parte di &lt;strong&gt;progettazione architetturale&lt;/strong&gt; viene fornito pieno supporto al design &lt;a href="http://en.wikipedia.org/wiki/unified_modeling_language"&gt;UML&lt;/a&gt;, quindi senza più bisogno di ricorrere a strumenti esterni (finalmente si potrà dire addio a Visio!) per realizzare diagrammi come use-case, activity o sequence. Abbiamo inoltre la possibilità di documentare in modo ottimale la soluzione evidenziando i livelli applicativi e le loro correlazioni grazie ad &amp;quot;Architecture Layer Diagram&amp;quot;, di approcciare lo sviluppo sia in modalità &amp;quot;bottom-to-top&amp;quot; che &amp;quot;top-to-bottom&amp;quot; grazie al reverse engineer ed il supporto dell'IDE al &lt;a href="http://en.wikipedia.org/wiki/parallel_programming_model"&gt;Parallel Programming&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;La parte di &lt;strong&gt;testing&lt;/strong&gt; viene decisamente potenziata, fornendo ad esempio la possibilità di identificare ed eseguire solo i test correlati ad una certa parte di codice o, grazie allo strumento stand-alone &amp;quot;Microsoft Test Runner Tool&amp;quot; di avere un'esperienza di test notevolmente migliorata con la cattura di snapshot e screenshot per la riproduzione dei bug rilevati.&lt;/p&gt;&lt;p&gt;Per i &lt;strong&gt;project manager&lt;/strong&gt; (ma non solo) le novità più grandi e gradite saranno certamente l'integrazione con Project Server e le nuove funzionalità di schedulazione tramite Excel secondo la metodologia &lt;a href="http://en.wikipedia.org/wiki/agile_software_development"&gt;Agile&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Per gli sviluppatori &lt;strong&gt;&lt;a href="http://www.microsoft.com/sharepoint/"&gt;SharePoint&lt;/a&gt;&lt;/strong&gt; ci sono poi dei miglioramenti notevoli a livello di integrazione e funzionalità.&lt;/p&gt;&lt;p&gt;Altre novità salienti di Visual Studio 2010 sono poi l'introduzione del supporto a &lt;a href="http://www.microsoft.com/windows/windows-7/"&gt;Windows 7&lt;/a&gt;, alla piattaforma cloud &lt;a href="http://www.microsoft.com/azure/"&gt;Microsoft Windows Azure&lt;/a&gt; e l'integrazione con i database Oracle e IBM DB2.&lt;/p&gt;&lt;p&gt;Maggiori informazioni e le informazioni per il download sono disponibili nel nostro mini-sito dedicato al &lt;a href="http://netfx4.winfxitalia.com/"&gt;.NET Framework 4.0&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Buon download a tutti e. happy coding!&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/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_4.0/" rel="tag"&gt;ASP.NET 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Visual_Studio/" rel="tag"&gt;Visual Studio&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Azure/" rel="tag"&gt;Windows Azure&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/matteo/post2500/.NET-Framework-4.0-Beta-1-Visual-Studio-2010.aspx"&gt;&lt;em&gt;.NET Framework 4.0 beta 1: Visual Studio 2010&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Matteo Casati</dc:creator><category>.NET, .NET Framework, .NET Framework 4.0, ASP.NET, ASP.NET 4.0, Visual Studio, Windows Azure</category><guid isPermaLink="true">http://blogs.aspitalia.com/matteo/post2500/.NET-Framework-4.0-Beta-1-Visual-Studio-2010.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/matteo/post2500/.NET-Framework-4.0-Beta-1-Visual-Studio-2010.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS2500.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2500</trackback:ping></item><item><title>L&amp;#39;ordine dei parametri in alcune classi del framework</title><link>http://blogs.aspitalia.com/matteo/post2365/Lordine-Parametri-Classi-Framework.aspx</link><pubDate>Thu, 21 Aug 2008 16:47:14 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2365" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;...è deciso in modo casuale???&lt;/p&gt; &lt;p&gt;Qualcuno mi spiega perché &lt;a href="http://msdn.microsoft.com/en-us/library/sxykka64.aspx"&gt;ArgumentException(string, string)&lt;/a&gt; vuole prima il messaggio e poi il nome del parametro mentre, ad esempio, &lt;a href="http://msdn.microsoft.com/en-us/library/k8a0dfcy.aspx"&gt;ArgumentNullException(string, string)&lt;/a&gt; e &lt;a href="http://msdn.microsoft.com/en-us/library/wx2cdec8.aspx"&gt;ArgumentOutOfRangeException(string, string)&lt;/a&gt; funzionano al contrario (prima il nome del parametro e poi il messaggio?&lt;/p&gt; &lt;p&gt;Certe cose proprio non le capisco.&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/matteo/post2365/Lordine-Parametri-Classi-Framework.aspx"&gt;&lt;em&gt;L&amp;#39;ordine dei parametri in alcune classi del framework&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Matteo Casati</dc:creator><category>.NET</category><guid isPermaLink="true">http://blogs.aspitalia.com/matteo/post2365/Lordine-Parametri-Classi-Framework.aspx</guid><slash:comments>1</slash:comments><wfw:comment>http://blogs.aspitalia.com/matteo/post2365/Lordine-Parametri-Classi-Framework.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS2365.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2365</trackback:ping></item><item><title>The Developer Highway Code</title><link>http://blogs.aspitalia.com/matteo/post2364/The-Developer-Highway-Code.aspx</link><pubDate>Tue, 19 Aug 2008 12:19:18 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2364" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;A corollario dei miei due articoli sulla sicurezza delle applicazioni ASP.NET pubblicati in gennaio (&amp;quot;&lt;a href="http://www.aspitalia.com/articoli/asp.net2/aspnet-security.aspx"&gt;Realizzare applicazioni ASP.NET sicure - Prima parte&lt;/a&gt;&amp;quot; e &amp;quot;&lt;a href="http://www.aspitalia.com/articoli/asp.net2/aspnet-security-2.aspx"&gt;Realizzare applicazioni ASP.NET sicure - Seconda parte&lt;/a&gt;&amp;quot;) segnalo la possibilità di scaricare &lt;strong&gt;gratuitamente&lt;/strong&gt; da &lt;a href="http://msdn.microsoft.com/en-gb/default.aspx"&gt;MSDN UK&lt;/a&gt; la versione digitale - e-book - dell'ottimo (seppur datato) &amp;quot;&lt;strong&gt;The Developer Highway Code&lt;/strong&gt;&amp;quot; di Paul Maher and Alex Mackman.&lt;/p&gt; &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-gb/security/aa473878.aspx"&gt;&lt;img height="243" alt="the developer highway code" src="http://blogs.aspitalia.com/img/m.casati/developerhighwaycode_bffb/the_developer_highway_code%20_5.jpg" width="174" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;L'ebook è disponibile all'indirizzo &lt;a href="http://msdn.microsoft.com/en-gb/security/aa473878.aspx"&gt;&lt;strong&gt;http://msdn.microsoft.com/en-gb/security/aa473878.aspx&lt;/strong&gt;&lt;/a&gt; (sia in formato PDF che XPS) ed è un aggiornamento della &lt;a href="http://www.amazon.com/developer-highway-code-paul-maher/dp/1905707584"&gt;copia edita da Microsft Press&lt;/a&gt; nel 2006.&lt;/p&gt; &lt;p&gt;è possibile scegliere di scaricare la versione completa (circa 7 MB per il PDF) oppure ogni singola sezione:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Part 1 - Security Engineering &lt;/li&gt; &lt;li&gt;Part 2 - Checklists and Question Lists &lt;/li&gt; &lt;li&gt;Part 3 - What's New for Security in the .NET Framework v2.0 &lt;/li&gt; &lt;li&gt;Part 4 - Microsoft Patterns &amp;amp; Practices Security Resources &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Buona lettura a tutti.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/matteo/post2364/The-Developer-Highway-Code.aspx"&gt;&lt;em&gt;The Developer Highway Code&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Matteo Casati</dc:creator><category>.NET, ASP.NET</category><guid isPermaLink="true">http://blogs.aspitalia.com/matteo/post2364/The-Developer-Highway-Code.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/matteo/post2364/The-Developer-Highway-Code.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS2364.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2364</trackback:ping></item><item><title>RollingList&amp;lt;T&amp;gt;</title><link>http://blogs.aspitalia.com/matteo/post2355/RollingListT.aspx</link><pubDate>Fri, 08 Aug 2008 14:34:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2355" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Nel &lt;a href="http://blogs.aspitalia.com/matteo/post2352/Semplice-MA-Apparenza-Collection-Generica.aspx"&gt;post precedente&lt;/a&gt; ho parlato di come utilizzare le classi di base del framework per realizzare una collection con le seguenti caratteristiche:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;all'inserimento di un nuovo elemento questo viene posizionato all'inizio della lista (i più recenti verranno visualizzati per primi) &lt;/li&gt;

  &lt;li&gt;la lista deve contenere al massimo &lt;em&gt;n&lt;/em&gt; elementi: l'inserimento di un nuovo elemento, raggiunto il limite &lt;em&gt;n&lt;/em&gt;, deve prevedere la rimozione dell'elemento più vecchio presente nella lista (ovvero quello inserito da più tempo) &lt;/li&gt;

  &lt;li&gt;garantire ottime performance &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="http://forum.aspitalia.com/forum/post/328680/Semplice-MA-Apparenza-Collection-Generica.aspx"&gt;Il commento di rsaccav&lt;/a&gt;&lt;/strong&gt; mi ha fatto convinto ad implementare una collezione generica &amp;quot;&lt;em&gt;from scratch&lt;/em&gt;&amp;quot;, così da colmare il vuoto lasciato in System.Collection.Generic.&lt;/p&gt;

&lt;p&gt;Con estrema fantasia l'ho battezzata &lt;strong&gt;RollingList&amp;lt;T&amp;gt;&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Il principio è piuttosto semplice: la lista si basa su un &lt;strong&gt;array con dimensione fissa&lt;/strong&gt; pari al limite di elementi da conservare (&lt;strong&gt;Capacity&lt;/strong&gt;; la proprietà deve essere impostata nel costruttore o comunque *prima* dell'inserimento del primo elemento) associato ad un &lt;strong&gt;cursore&lt;/strong&gt; (backward) che definisce la posizione di inserimento/sostituzione e che consente di enumerare gli elementi nell'ordine corretto.&lt;/p&gt;

&lt;p&gt;Il codice completo della classe:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;using System; 
    &lt;br /&gt;using System.Collections; 

    &lt;br /&gt;using System.Threading; 

    &lt;br /&gt;

    &lt;br /&gt;public class RollingList&amp;lt;T&amp;gt; : ICollection 

    &lt;br /&gt;{&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private int _cursor; 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private int _size; 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private int _capacity; 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private T[] _items;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private object _syncRoot;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public RollingList(int capacity) 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Capacity = capacity;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 

    &lt;br /&gt;&lt;/code&gt;&lt;code&gt;
    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int Capacity 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _capacity; } 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (value &amp;lt;= 0) 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new ArgumentOutOfRangeException(&amp;quot;value&amp;quot;, &amp;quot;Capacity must be greater than zero&amp;quot;); 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (_capacity &amp;gt; 0) 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new ArgumentException(&amp;quot;Capacity has just been defined&amp;quot;, &amp;quot;value&amp;quot;); 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _capacity = value; 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _items = new T[_capacity]; 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _cursor = (_capacity - 1); 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp; &lt;br /&gt;

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void Add(T item) 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (_capacity &amp;lt;= 0) 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new NotSupportedException(&amp;quot;Capacity is not greater than zero&amp;quot;); 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _items[_cursor--] = item; 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (_size &amp;lt; _capacity) 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _size++; 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (_cursor &amp;lt; 0) 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _cursor = (_capacity - 1); 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; &lt;br /&gt;

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void Clear() 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Array.Clear(_items, 0, _size); 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _size = 0; 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _cursor = (_capacity - 1); 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; &lt;br /&gt;

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public T[] ToArray() 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; T[] destinationArray = new T[_size];&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (_size == 0) 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return destinationArray; 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int cursorPosition = (_cursor + 1 == _capacity) ? 0 : _cursor + 1; 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Array.Copy(_items, cursorPosition, destinationArray, 0, (_capacity - cursorPosition)); 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (_size == _capacity &amp;amp;&amp;amp; cursorPosition &amp;gt; 0) 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Array.Copy(_items, 0, destinationArray, (_capacity - cursorPosition), cursorPosition); 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return destinationArray; 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 

    &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void CopyTo(Array array, int index) 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Array.Copy(ToArray(), 0, array, index, _size); 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; &lt;br /&gt;

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int Count 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _size; } 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; &lt;br /&gt;

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public bool IsSynchronized 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return false; } 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; &lt;br /&gt;

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public object SyncRoot 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (_syncRoot == null) 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Interlocked.CompareExchange(ref _syncRoot, new object(), null); 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return _syncRoot; 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; &lt;br /&gt;

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IEnumerator GetEnumerator() 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ToArray().GetEnumerator(); 

    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 

    &lt;br /&gt;}&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;Questa implementazione è sicuramente migliorabile (ad esempio, oltre a &lt;em&gt;ICollection&lt;/em&gt; potrebbe essere utile implementare l'interfaccia &lt;em&gt;ICollection&amp;lt;T&amp;gt;&lt;/em&gt;, supportare la serializzazione, ecc.) ma è decisamente preferibile rispetto all'uso di Stack&amp;lt;T&amp;gt;, Queue&amp;lt;T&amp;gt; o LinkedList&amp;lt;T&amp;gt; in quanto:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&amp;nbsp;&lt;strong&gt;semplifica il codice di inserimento&lt;/strong&gt; di elementi (le operazioni di IN/OUT al raggiungimento della capacità massima definita sono gestite dalla collection stessa, quindi non richiedono codice di controllo aggiuntivo) &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;semplifica la lettura&lt;/strong&gt; grazie ad una corretta enumerazione nativa degli elementi &lt;/li&gt;

  &lt;li&gt;permette di avere &lt;strong&gt;performance notevolmente più elevate&lt;/strong&gt;: &lt;/li&gt;
&lt;/ol&gt;
&lt;code&gt;// 
  &lt;br /&gt;// RollingList performance test 

  &lt;br /&gt;// 

  &lt;br /&gt;int capacity = 10000; 

  &lt;br /&gt;int max = 1000000000; 

  &lt;br /&gt;DateTime start = DateTime.Now; 

  &lt;br /&gt;RollingList&amp;lt;int&amp;gt; list = new RollingList&amp;lt;int&amp;gt;(capacity); 

  &lt;br /&gt;for (int i = 1; i &amp;lt;= max; i++) 

  &lt;br /&gt;{ 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.Add(i); 

  &lt;br /&gt;} 

  &lt;br /&gt;foreach (int item in list) 

  &lt;br /&gt;{ 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // do something with &amp;quot;item&amp;quot; 

  &lt;br /&gt;} 

  &lt;br /&gt;Console.WriteLine(&amp;quot;RollingList: max={0} -&amp;gt; {1}&amp;quot;, 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; max.ToString(&amp;quot;#,###&amp;quot;), 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DateTime.Now.Subtract(start)); &lt;/code&gt;

&lt;p&gt;Produce: &lt;/p&gt;

&lt;p&gt;RollingList: max=1.000.000.000 -&amp;gt; 00:00:11.5610000&lt;/p&gt;

&lt;p&gt;Ovvero un tempo di esecuzione che è circa &lt;strong&gt;un terzo&lt;/strong&gt; rispetto a Queue&amp;lt;T&amp;gt;!!!&lt;/p&gt;

&lt;p&gt;HTH&lt;/p&gt;
&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/matteo/post2355/RollingListT.aspx"&gt;&lt;em&gt;RollingList&amp;lt;T&amp;gt;&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Matteo Casati</dc:creator><category>.NET</category><guid isPermaLink="true">http://blogs.aspitalia.com/matteo/post2355/RollingListT.aspx</guid><slash:comments>9</slash:comments><wfw:comment>http://blogs.aspitalia.com/matteo/post2355/RollingListT.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS2355.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2355</trackback:ping></item><item><title>Una semplice (ma solo in apparenza) collection generica</title><link>http://blogs.aspitalia.com/matteo/post2352/Semplice-MA-Apparenza-Collection-Generica.aspx</link><pubDate>Thu, 31 Jul 2008 13:54:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2352" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Nel progetto (Web) a cui sto lavorando è stata richiesta la visualizzazione di una lista di elementi con le seguenti caratteristiche:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;i nuovi elementi devono essere inseriti all'inizio dell'elenco (i più recenti verranno visualizzati per primi) &lt;/li&gt;

  &lt;li&gt;la lista deve contenere al massimo &lt;em&gt;n&lt;/em&gt; elementi: l'inserimento di un nuovo elemento, raggiunto il limite &lt;em&gt;n&lt;/em&gt;, deve prevedere la rimozione dell'elemento più vecchio presente nella lista (ovvero quello inserito da più tempo) &lt;/li&gt;

  &lt;li&gt;l'aggiunta di nuovi elementi è corposa (centinaia di insert al secondo per tutto il ciclo di vita dell'applicazione) &lt;/li&gt;

  &lt;li&gt;il limite del numero massimo di elementi che devono essere mantenuti nella lista (&lt;em&gt;n&lt;/em&gt;) è relativamente basso (&amp;lt; 10.000) &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In pratica, definito un limite di 3 elementi e immaginando l'accodamento dei primi 5 interi in ordine crescente (1, 2, 3, 4 e 5) il risultato atteso è:&lt;/p&gt;
1 

&lt;br /&gt;2 1 

&lt;br /&gt;3 2 1 

&lt;br /&gt;4 3 2 

&lt;br /&gt;5 4 3 

&lt;p&gt;Ho pensato che sia una cosa semplicissima da realizzare in .NET sfruttando le classi in System.Collection.Generic ma... quale usare? Il framework prevede infatti:&lt;/p&gt;

&lt;h3&gt;List&amp;lt;T&amp;gt; &lt;/h3&gt;

&lt;p&gt;Lista generica, non utilizzabile allo scopo in quanto non è possibile inserire elementi in posizioni specifiche ma solo &amp;quot;to the end of the List(T)&amp;quot;.&lt;/p&gt;

&lt;p&gt;In realtà sarebbe possibile effettuare l'inserimento all'inizio della lista effettuando uno shift di tutti gli elementi ma le performance sarebbero improponibili!&lt;/p&gt;

&lt;h3&gt;Stack&amp;lt;T&amp;gt;&lt;/h3&gt;

&lt;p&gt;è letteralmente un insieme di elementi &amp;quot;impilati&amp;quot;; possiamo vederlo come una vaschetta portadocumenti sulla scrivania in cui vengono aggiunte delle pratiche (Push) semplicemente appoggiandole sopra e con l'impiegato che le processa che prende (Pop) il primo foglio che trova in cima alla pigna. Non assolve dunque allo scopo in quanto rimuove gli elementi più &amp;quot;nuovi&amp;quot; anziché quelli più &amp;quot;vecchi&amp;quot;.&lt;/p&gt;

&lt;p&gt;In pratica il seguente codice:&lt;/p&gt;
&lt;code&gt;int capacity = 3; 
  &lt;br /&gt;int max = 5; 

  &lt;br /&gt;Stack&amp;lt;int&amp;gt; list = new Stack&amp;lt;int&amp;gt;(capacity); 

  &lt;br /&gt;for (int i = 1; i &amp;lt;= max; i++) 

  &lt;br /&gt;{ 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (list.Count &amp;gt;= capacity) 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.Pop(); 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.Push(i); 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (var item in list) 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.Write(&amp;quot;{0} &amp;quot;, item); 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(); 

  &lt;br /&gt;}&lt;/code&gt; 

&lt;p&gt;Produce:&lt;/p&gt;

&lt;p&gt;1 
  &lt;br /&gt;2 1 

  &lt;br /&gt;3 2 1 

  &lt;br /&gt;4 2 1 

  &lt;br /&gt;5 2 1&lt;/p&gt;

&lt;p&gt;Non ci siamo.&lt;/p&gt;

&lt;h3&gt;Queue&amp;lt;T&amp;gt;&lt;/h3&gt;

&lt;p&gt;è appunto una &amp;quot;coda&amp;quot; dove il primo elemento inserito (Enqueue) è anche il primo a venire rimosso (Dequeue); l'analogia che mi viene in mente è quella delle macchine ferme al casello dell'autostrada: il primo arrivato sarà anche il primo a superare la barriera. Questa collection assolve per metà allo scopo garantendo il corretto meccanismo di in/out ma ha il contro di presentare l'enumerazione degli elementi in ordine inverso rispetto a quanto richiesto (scorrendo la collection ottengo prima gli elementi più &amp;quot;vecchi&amp;quot; e poi quelli più &amp;quot;nuovi&amp;quot;)&lt;/p&gt;

&lt;p&gt;In pratica il seguente codice:&lt;/p&gt;
&lt;code&gt;int capacity = 3; 
  &lt;br /&gt;int max = 5; 

  &lt;br /&gt;Queue&amp;lt;int&amp;gt; list = new Queue&amp;lt;int&amp;gt;(capacity); 

  &lt;br /&gt;for (int i = 1; i &amp;lt;= max; i++) 

  &lt;br /&gt;{ 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (list.Count &amp;gt;= capacity) 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.Dequeue(); 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.Enqueue(i); 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (var item in list) 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.Write(&amp;quot;{0} &amp;quot;, item); 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(); 

  &lt;br /&gt;}&lt;/code&gt; 

&lt;p&gt;Produce:&lt;/p&gt;

&lt;p&gt;1 
  &lt;br /&gt;1 2 

  &lt;br /&gt;1 2 3 

  &lt;br /&gt;2 3 4 

  &lt;br /&gt;3 4 5&lt;/p&gt;

&lt;p&gt;Non ci siamo ancora ma manca poco :-)&lt;/p&gt;

&lt;h3&gt;LinkedList&amp;lt;T&amp;gt;&lt;/h3&gt;

&lt;p&gt;Si tratta di un elenco con doppio collegamento; espone metodi per l'inserimento di nuovi elementi sia all'inizio dell'elenco (AddFirst) che alla fine (AddLast) che in posizioni intermedie (AddAfter e AddBefore), sia per la rimozione (RemoveFirst, RemoveLast, Remove), dandoci la massima flessibilità possibile. In pratica possiamo immaginare questa collection come un trenino giocattolo: possiamo aggiungere o togliere vagoni da entrambe le estremità del convoglio in modo del tutto indifferente.&lt;/p&gt;

&lt;p&gt;In pratica il seguente codice:&lt;/p&gt;
&lt;code&gt;int capacity = 3; 
  &lt;br /&gt;int max = 5; 

  &lt;br /&gt;LinkedList&amp;lt;int&amp;gt; list = new LinkedList&amp;lt;int&amp;gt;(); 

  &lt;br /&gt;for (int i = 1; i &amp;lt;= max; i++) 

  &lt;br /&gt;{ 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (list.Count &amp;gt;= capacity) 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.RemoveLast(); 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.AddFirst(i); 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (var item in list) 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.Write(&amp;quot;{0} &amp;quot;, item); 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(); 

  &lt;br /&gt;}&lt;/code&gt; 

&lt;p&gt;Produce:&lt;/p&gt;

&lt;p&gt;1 
  &lt;br /&gt;2 1 

  &lt;br /&gt;3 2 1 

  &lt;br /&gt;4 3 2 

  &lt;br /&gt;5 4 3&lt;/p&gt;

&lt;p&gt;Missione compiuta? Sembrerebbe di sì.&lt;/p&gt;

&lt;p&gt;Per scrupolo ho fatto un piccolo test di performance, aspettandomi prestazioni simili per Queue e LinkedList:&lt;/p&gt;
&lt;code&gt;// 
  &lt;br /&gt;// Performance test configuration 

  &lt;br /&gt;// 

  &lt;br /&gt;DateTime start; 

  &lt;br /&gt;int[] results; 

  &lt;br /&gt;int capacity = 10000; 

  &lt;br /&gt;int max = 1000000000; 

  &lt;br /&gt;

  &lt;br /&gt;// 

  &lt;br /&gt;// LinkedList performance test 

  &lt;br /&gt;// 

  &lt;br /&gt;start = DateTime.Now; 

  &lt;br /&gt;LinkedList&amp;lt;int&amp;gt; list = new LinkedList&amp;lt;int&amp;gt;(); 

  &lt;br /&gt;for (int i = 1; i &amp;lt;= max; i++) 

  &lt;br /&gt;{ 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (list.Count &amp;gt;= capacity) 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.RemoveLast(); 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.AddFirst(i); 

  &lt;br /&gt;} 

  &lt;br /&gt;results = new int[list.Count]; 

  &lt;br /&gt;list.CopyTo(results, 0); 

  &lt;br /&gt;foreach (int item in results) 

  &lt;br /&gt;{ 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // do something with &amp;quot;item&amp;quot; 

  &lt;br /&gt;} 

  &lt;br /&gt;Console.WriteLine(&amp;quot;LinkedList: max={0} -&amp;gt; {1}&amp;quot;, 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; max.ToString(&amp;quot;#,###&amp;quot;), 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DateTime.Now.Subtract(start)); 

  &lt;br /&gt;

  &lt;br /&gt;// 

  &lt;br /&gt;// Queue performance test 

  &lt;br /&gt;// 

  &lt;br /&gt;start = DateTime.Now; 

  &lt;br /&gt;results = null; 

  &lt;br /&gt;Queue&amp;lt;int&amp;gt; queue = new Queue&amp;lt;int&amp;gt;(capacity); 

  &lt;br /&gt;for (int i = 1; i &amp;lt;= max; i++) 

  &lt;br /&gt;{ 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (queue.Count &amp;gt;= capacity) 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; queue.Dequeue(); 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; queue.Enqueue(i); 

  &lt;br /&gt;} 

  &lt;br /&gt;results = queue.ToArray(); 

  &lt;br /&gt;foreach (int item in results) 

  &lt;br /&gt;{ 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // do something with &amp;quot;item&amp;quot; 

  &lt;br /&gt;} 

  &lt;br /&gt;Console.WriteLine(&amp;quot;Queue: max={0} -&amp;gt; {1}&amp;quot;, 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; max.ToString(&amp;quot;#,###&amp;quot;), 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DateTime.Now.Subtract(start));&lt;/code&gt; 

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Sebbene questo tipo di misurazione sia piuttosto &amp;quot;spannometrico&amp;quot;, il risultato (per un miliardo di inserimenti a fronte di una lista con al più 10.000 items) mi ha lasciato basito:&lt;/p&gt;

&lt;p&gt;LinkedList: max=1.000.000.000 -&amp;gt; 00:01:17.6770000 
  &lt;br /&gt;Queue: max=1.000.000.000 -&amp;gt; 00:00:30.4030000&lt;/p&gt;

&lt;p&gt;Ovvero LinkedList richiede circa 2.5 volte il tempo necessario a Queue!&lt;/p&gt;

&lt;h3&gt;Conclusioni&lt;/h3&gt;

&lt;p&gt;Sebbene LinkedList&amp;lt;T&amp;gt; faccia il suo &amp;quot;sporco lavoro&amp;quot; lo fa... &lt;strong&gt;troppo lentamente!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Alla fine ho dunque optato per l'utilizzo di Queue&amp;lt;T&amp;gt; con l'aggiunta di poche righe di codice per leggere in modo inverso il contenuto enumerato della lista:&lt;/p&gt;
&lt;code&gt;Queue&amp;lt;int&amp;gt; queue = new Queue&amp;lt;int&amp;gt;(capacity); 
  &lt;br /&gt;// (codice omesso) 

  &lt;br /&gt;List&amp;lt;int&amp;gt; temp = new List&amp;lt;int&amp;gt;(queue.ToArray()); 

  &lt;br /&gt;temp.Reverse(); 

  &lt;br /&gt;results = temp.ToArray(); 

  &lt;br /&gt;foreach (int item in results) 

  &lt;br /&gt;{ 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // do something with &amp;quot;item&amp;quot; 

  &lt;br /&gt;}&lt;/code&gt; 

&lt;p&gt;Infatti il numero di elementi mantenuti nella coda è decisamente troppo basso - meno di 10.000 - per risultare influenti le operazioni di copia in una List e di reverse della lista, anche se molto probabilmente questa porzione di codice potrebbe essere migliorata :-)&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;PS 1: qualcuno avrà notato l'assenza di acronimi come FIFO (first-in, first-out), LIFO (last-in, first-out), ecc. 
  &lt;br /&gt;Sono stati volutamente omessi perché il significato di &amp;quot;primo&amp;quot; e &amp;quot;ultimo&amp;quot; mi è risultato, leggendo qua e là sul Web, interpretato in modo non del tutto univoco (si riferisce all'ordine di inserimento? alla posizione che assume l'elemento nella collection? ad altro?)&lt;/p&gt;

&lt;p&gt;PS 2: un doveroso grazie a &lt;a href="http://blogs.aspitalia.com/ricciolo/"&gt;Cristian&lt;/a&gt; e a &lt;a href="http://blogs.aspitalia.com/nostromo/"&gt;Marco&lt;/a&gt; che mi hanno &lt;strike&gt;supportato&lt;/strike&gt; sopportato in questa ricerca&lt;/p&gt;
&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/matteo/post2352/Semplice-MA-Apparenza-Collection-Generica.aspx"&gt;&lt;em&gt;Una semplice (ma solo in apparenza) collection generica&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Matteo Casati</dc:creator><category>.NET</category><guid isPermaLink="true">http://blogs.aspitalia.com/matteo/post2352/Semplice-MA-Apparenza-Collection-Generica.aspx</guid><slash:comments>15</slash:comments><wfw:comment>http://blogs.aspitalia.com/matteo/post2352/Semplice-MA-Apparenza-Collection-Generica.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS2352.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2352</trackback:ping></item><item><title>IDictionary e la serializzazione in XML</title><link>http://blogs.aspitalia.com/matteo/post2330/IDictionary-Serializzazione-XML.aspx</link><pubDate>Thu, 17 Jul 2008 12:37:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2330" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Chi lavora con i Web Service si sarà accorto che le strutture chiave/valore (Hashtable, Dictionary generici o specializzati, ecc.), non implementando l'interfaccia &lt;a title="IXmlSerializable" href="http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable.aspx"&gt;IXmlSerializable&lt;/a&gt; risultano &amp;quot;intrasportabili&amp;quot;.&lt;/p&gt;&lt;p&gt;Qualcuno ci ha anche &lt;a href="http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=95599"&gt;provato a chiedere a Microsoft&lt;/a&gt; di modificare questo comportamento ma la risposta è stata &amp;quot;Won't fix&amp;quot;... La motivazione? Semplice: &amp;quot;&lt;em&gt;Unfortunately, we cannot change Dictionary&amp;lt;K,V&amp;gt; to implement IXmlSerializable since it is located in the mscorlib assembly that cannot reference System.Xml.dll.&lt;/em&gt;&amp;quot;&lt;/p&gt;&lt;p&gt;In realtà creare un Dictionary generico serializzabile in XML è piuttosto semplice: basta creare una classe &amp;quot;SerializableDictionary&amp;quot; che derivi da Dictionary&amp;lt;TKey, TValue&amp;gt; e implementi IXmlSerializable, serializzando - per ogni KeyValuePair contenuto nella collection di base - sia la chiave che il valore.&lt;/p&gt;&lt;p&gt;Ho fatto due implementazioni: la prima serializza le chiavi e i valori in Base64, la seconda in XML.&lt;/p&gt;&lt;h3&gt;KeyValuePair in Base64&lt;/h3&gt;&lt;p&gt;using System;&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Xml;&lt;br /&gt;using System.Xml.Schema;&lt;br /&gt;using System.Xml.Serialization;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Runtime.Serialization.Formatters;&lt;br /&gt;using System.Runtime.Serialization.Formatters.Binary; &lt;/p&gt;&lt;p&gt;[Serializable]&lt;br /&gt;public class SerializableDictionary&amp;lt;TKey, TValue&amp;gt; : Dictionary&amp;lt;TKey, TValue&amp;gt;, IXmlSerializable&lt;br /&gt;{&lt;br /&gt;    #region IXmlSerializable Members &lt;/p&gt;&lt;p&gt;    private const string NS = &amp;quot;&amp;quot;;&lt;br /&gt;    private const string XML_ITEM_NODE_NAME = &amp;quot;item&amp;quot;;&lt;br /&gt;    private const string XML_KEY_ATTRIBUTE_NAME = &amp;quot;key&amp;quot;;&lt;br /&gt;    private const string XML_VALUE_ATTRIBUTE_NAME = &amp;quot;value&amp;quot;; &lt;/p&gt;&lt;p&gt;    public XmlSchema GetSchema()&lt;br /&gt;    {&lt;br /&gt;        return null;&lt;br /&gt;    } &lt;/p&gt;&lt;p&gt;    public void WriteXml(XmlWriter w)&lt;br /&gt;    {&lt;br /&gt;        foreach (TKey key in Keys)&lt;br /&gt;        {&lt;br /&gt;            TValue value = this[key];&lt;br /&gt;            w.WriteStartElement(XML_ITEM_NODE_NAME, NS);&lt;br /&gt;            w.WriteElementString(XML_KEY_ATTRIBUTE_NAME, NS, ToBase64(key));&lt;br /&gt;            w.WriteElementString(XML_VALUE_ATTRIBUTE_NAME, NS, ToBase64(value));&lt;br /&gt;            w.WriteEndElement();&lt;br /&gt;        }&lt;br /&gt;    } &lt;/p&gt;&lt;p&gt;    public void ReadXml(XmlReader r)&lt;br /&gt;    {&lt;br /&gt;        r.Read();&lt;br /&gt;        r.MoveToContent();&lt;br /&gt;        while (r.NodeType != XmlNodeType.EndElement)&lt;br /&gt;        {&lt;br /&gt;            r.ReadStartElement(XML_ITEM_NODE_NAME, NS);&lt;br /&gt;            TKey key = FromBase64&amp;lt;TKey&amp;gt;(r.ReadElementString(XML_KEY_ATTRIBUTE_NAME, NS));&lt;br /&gt;            TValue value = FromBase64&amp;lt;TValue&amp;gt;(r.ReadElementString(XML_VALUE_ATTRIBUTE_NAME, NS));&lt;br /&gt;            r.ReadEndElement();&lt;br /&gt;            r.MoveToContent();&lt;br /&gt;            Add(key, value);&lt;br /&gt;        }&lt;br /&gt;    } &lt;/p&gt;&lt;p&gt;    #endregion &lt;/p&gt;&lt;p&gt;    #region Base64 Serialization &lt;/p&gt;&lt;p&gt;    private static string ToBase64(object value)&lt;br /&gt;    {&lt;br /&gt;        using (MemoryStream stream = new MemoryStream())&lt;br /&gt;        {&lt;br /&gt;            BinaryFormatter formatter = new BinaryFormatter();&lt;br /&gt;            formatter.AssemblyFormat = FormatterAssemblyStyle.Simple;&lt;br /&gt;            formatter.Serialize(stream, value);&lt;br /&gt;            byte[] buffer = stream.ToArray();&lt;br /&gt;            return Convert.ToBase64String(buffer, 0, buffer.Length, Base64FormattingOptions.None);&lt;br /&gt;        }&lt;br /&gt;    } &lt;/p&gt;&lt;p&gt;    public static T FromBase64&amp;lt;T&amp;gt;(string base64)&lt;br /&gt;    {&lt;br /&gt;        byte[] buffer = Convert.FromBase64String(base64);&lt;br /&gt;        using (MemoryStream stream = new MemoryStream(buffer))&lt;br /&gt;        {&lt;br /&gt;            BinaryFormatter formatter = new BinaryFormatter();&lt;br /&gt;            formatter.AssemblyFormat = FormatterAssemblyStyle.Simple;&lt;br /&gt;            return (T)formatter.Deserialize(stream);&lt;br /&gt;        }&lt;br /&gt;    } &lt;/p&gt;&lt;p&gt;    #endregion&lt;br /&gt;} &lt;/p&gt;&lt;h3&gt;KeyValuePair in XML&lt;/h3&gt;&lt;p&gt;using System;&lt;br /&gt;using System.Xml;&lt;br /&gt;using System.Xml.Schema;&lt;br /&gt;using System.Xml.Serialization;&lt;br /&gt;using System.Collections.Generic; &lt;/p&gt;&lt;p&gt;[Serializable]&lt;br /&gt;public class SerializableDictionary&amp;lt;TKey, TValue&amp;gt; : Dictionary&amp;lt;TKey, TValue&amp;gt;, IXmlSerializable&lt;br /&gt;{&lt;br /&gt;    #region IXmlSerializable Members &lt;/p&gt;&lt;p&gt;    private const string NS = &amp;quot;&amp;quot;;&lt;br /&gt;    private const string XML_ITEM_NODE_NAME = &amp;quot;item&amp;quot;;&lt;br /&gt;    private const string XML_KEY_NODE_NAME = &amp;quot;key&amp;quot;;&lt;br /&gt;    private const string XML_VALUE_NODE_NAME = &amp;quot;value&amp;quot;; &lt;/p&gt;&lt;p&gt;    public XmlSchema GetSchema()&lt;br /&gt;    {&lt;br /&gt;        return null;&lt;br /&gt;    }&lt;br /&gt;    public void ReadXml(XmlReader reader)&lt;br /&gt;    {&lt;br /&gt;        XmlSerializer ks = new XmlSerializer(typeof(TKey));&lt;br /&gt;        XmlSerializer vs = new XmlSerializer(typeof(TValue));&lt;br /&gt;        bool wasEmpty = reader.IsEmptyElement;&lt;br /&gt;        reader.Read();&lt;br /&gt;        if (wasEmpty)&lt;br /&gt;            return;&lt;br /&gt;        while (reader.NodeType != XmlNodeType.EndElement)&lt;br /&gt;        {&lt;br /&gt;            reader.ReadStartElement(XML_ITEM_NODE_NAME, NS);&lt;br /&gt;            reader.ReadStartElement(XML_KEY_NODE_NAME, NS);&lt;br /&gt;            TKey key = (TKey)ks.Deserialize(reader);&lt;br /&gt;            reader.ReadEndElement();&lt;br /&gt;            reader.ReadStartElement(XML_VALUE_NODE_NAME, NS);&lt;br /&gt;            TValue value = (TValue)vs.Deserialize(reader);&lt;br /&gt;            reader.ReadEndElement();&lt;br /&gt;            Add(key, value);&lt;br /&gt;            reader.ReadEndElement();&lt;br /&gt;            reader.MoveToContent();&lt;br /&gt;        }&lt;br /&gt;        reader.ReadEndElement();&lt;br /&gt;    } &lt;/p&gt;&lt;p&gt;    public void WriteXml(XmlWriter writer)&lt;br /&gt;    {&lt;br /&gt;        XmlSerializer ks = new XmlSerializer(typeof(TKey));&lt;br /&gt;        XmlSerializer vs = new XmlSerializer(typeof(TValue));&lt;br /&gt;        foreach (TKey key in Keys)&lt;br /&gt;        {&lt;br /&gt;            writer.WriteStartElement(XML_ITEM_NODE_NAME, NS);&lt;br /&gt;            writer.WriteStartElement(XML_KEY_NODE_NAME, NS);&lt;br /&gt;            ks.Serialize(writer, key);&lt;br /&gt;            writer.WriteEndElement();&lt;br /&gt;            writer.WriteStartElement(XML_VALUE_NODE_NAME, NS);&lt;br /&gt;            TValue value = this[key];&lt;br /&gt;            vs.Serialize(writer, value);&lt;br /&gt;            writer.WriteEndElement();&lt;br /&gt;            writer.WriteEndElement();&lt;br /&gt;        }&lt;br /&gt;    } &lt;/p&gt;&lt;p&gt;    #endregion&lt;br /&gt;} &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;A voi la scelta :-)&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/Web_Service/" rel="tag"&gt;Web Service&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/XML/" rel="tag"&gt;XML&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/matteo/post2330/IDictionary-Serializzazione-XML.aspx"&gt;&lt;em&gt;IDictionary e la serializzazione in XML&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Matteo Casati</dc:creator><category>.NET, .NET Framework, Web Service, XML</category><guid isPermaLink="true">http://blogs.aspitalia.com/matteo/post2330/IDictionary-Serializzazione-XML.aspx</guid><slash:comments>5</slash:comments><wfw:comment>http://blogs.aspitalia.com/matteo/post2330/IDictionary-Serializzazione-XML.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS2330.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2330</trackback:ping></item><item><title>3-Tier, 3-Layer e MVC: ma sono la stessa cosa?</title><link>http://blogs.aspitalia.com/matteo/post2318/3Tier-3Layer-MVC-Cosa.aspx</link><pubDate>Thu, 10 Jul 2008 15:46:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2318" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Questa riflessione parte dalla domanda di un utente nel forum:&lt;/p&gt;&lt;cite&gt;&amp;quot;&lt;a href="http://forum.aspitalia.com/forum/post/326672/Domanda-Analogie-MVC-Threetier.aspx"&gt;Domanda: Analogie tra MVC e Three-tier&lt;/a&gt; - Sono troppe e a me sembra che l'uno possa sostituire l'altro.. ma quanto sbaglio?&amp;quot;&lt;/cite&gt; &lt;p&gt;Ho l'impressione che questa perplessità sia parecchio diffusa e che, più in generale, ci sia parecchia confusione quando si parla di software architecture: spero che questo post possa chiarire un po' meglio alcuni concetti.&lt;/p&gt;&lt;p&gt;Iniziamo definendo, in termini strettamente lessicali, cosa si intende per &amp;quot;3-Tier&amp;quot;, dato che la stessa Wikipedia non è affatto chiara nè precisa (sia in &lt;a href="http://it.wikipedia.org/wiki/Architettura_three-tier"&gt;italiano&lt;/a&gt; che in &lt;a href="http://en.wikipedia.org/wiki/Three-tier_%28computing%29"&gt;inglese&lt;/a&gt;) contribuendo ad aumentare la confusione.&lt;/p&gt;&lt;h2&gt;Architettura 3-Tier (o n-Tier)&lt;/h2&gt;&lt;p&gt;Letteralmente si parla di &amp;quot;architetture a 3 o più livelli&amp;quot; per definire un modello che fornisca una &lt;b&gt;separazione fisica&lt;/b&gt; dell'applicazione; in pratica si dice che un'applicazione può essere erogata usando un'infrastruttura complessa e diversificata, tipicamente usando più server, ciascuno dedicato ad una funzionalità specifica (fron-end, middleware, back-end, ecc.)&lt;br /&gt;Una spiegazione più dettagliata di questo modello distributivo è disponibile sul sito &amp;quot;Microsoft patterns &amp;amp; practices Developer Center&amp;quot;: &lt;a href="http://msdn.microsoft.com/en-us/library/ms978694.aspx"&gt;Three-Tiered Distribution&lt;/a&gt;&lt;/p&gt;&lt;p&gt;In pratica ritengo che si dovrebbe parlare di &amp;quot;tier&amp;quot; in riferimento a qualcosa di &amp;quot;sistemistico&amp;quot;, e non per architettura software in senso stretto.&lt;/p&gt;&lt;h2&gt;Architettura 3-Layer (o n-Layer)&lt;/h2&gt;&lt;p&gt;Le architetture a 3 strati (o più: il &amp;quot;3&amp;quot; è entrato nella concezione comune in quanto rappresenta la stratificazione più semplice ed utilizzata) sono un modello di organizzazione del codice applicativo basato sulla separazione delle funzionalità logiche. Tipicamente avremo:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Presentation (PL)&lt;/b&gt;: la visualizzazione dei dati e, più in generale, la rappresentazione dei controlli (forms, controlli di input, labels, ecc.) necessari per l'interfaccia utente &lt;/li&gt;&lt;li&gt;&lt;b&gt;Business Logic (BLL)&lt;/b&gt;: rappresenta la parte principale dell'applicazione, definendo il &lt;b&gt;domain model&lt;/b&gt; dell'applicazione, ovvero le entità (ad esempio: fattura, cliente, ecc.), le loro relazioni e le logiche applicative. Non deve contenere contenere alcun riferimento a come i dati saranno presentati all'utente o a come verranno salvati &lt;/li&gt;&lt;li&gt;&lt;b&gt;Data Access (DAL)&lt;/b&gt;: contiene tutto quello che concerne la persistenza dei dati (database, tabelle, record, file system, ecc.) &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Questo tipo di architettura ha principalmente il vantaggio di fornire una &lt;b&gt;separazione logica&lt;/b&gt; così da aumentarne la manutenibilità, la scalabilità ed il riutilizzo.&lt;br /&gt;Una spiegazione più dettagliata di questo tipo di architettura è disponibile sul sito &amp;quot;Microsoft patterns &amp;amp; practices Developer Center&amp;quot;: &lt;a href="http://msdn.microsoft.com/en-us/library/ms978689.aspx"&gt;Three-Layered Services Application&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;Model-View-Controller (MVC)&lt;/h2&gt;&lt;p&gt;Questo pattern, introdotto solo di recente nel mondo .NET ma diffuso da tempo in altri ambienti, fornisce un modello per strutturare in modo organizzato le funzionalità relative alla UI e orchestrare l'accesso agli altri strati applicativi (BLL e DAL):&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Model&lt;/b&gt;: è l'insieme dei componenti che mantengono lo &amp;quot;stato&amp;quot;: i dati e i metodi per accedervi. In pratica costituisce la logica applicativa o - IMHO preferibilmente - l'accesso al layer (separato) di BL &lt;/li&gt;&lt;li&gt;&lt;b&gt;View&lt;/b&gt;: deputato alla visualizzazione vera e propria dell'interfaccia utente per la presentazione dei dati &lt;/li&gt;&lt;li&gt;&lt;b&gt;Controller&lt;/b&gt;: gestisce le interazioni dell'utente con l'applicazione (tipicamente intercettando e gestendo gli eventi e gli input dell'utente), mediante accesso al Model e definendo la View corrispondente da presentare &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;MVC non contraddice quindi il modello 3-Layer, semplicemente è una delle possibili implementazioni di questo tipo di architettura; da un certo punto di vista possiamo addirittura vedere MVC come un'estensione dell'architettura a 3 strati, in quanto porta una separazione logica ulteriore nel livello di presentation.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;MVC è dunque un'alternativa ai Web Forms di ASP.NET&lt;/strong&gt; e, come tale, ha vantaggi e svantaggi. &lt;/p&gt;&lt;p&gt;Per quanto mi riguarda (non ne faccio mistero: il modello a forms ASP.NET non mi è mai piaciuto per tanti motivi) MVC ha solo vantaggi :-)&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/Architettura/" rel="tag"&gt;Architettura&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/matteo/post2318/3Tier-3Layer-MVC-Cosa.aspx"&gt;&lt;em&gt;3-Tier, 3-Layer e MVC: ma sono la stessa cosa?&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Matteo Casati</dc:creator><category>.NET, .NET Framework, Architettura, ASP.NET</category><guid isPermaLink="true">http://blogs.aspitalia.com/matteo/post2318/3Tier-3Layer-MVC-Cosa.aspx</guid><slash:comments>1</slash:comments><wfw:comment>http://blogs.aspitalia.com/matteo/post2318/3Tier-3Layer-MVC-Cosa.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS2318.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2318</trackback:ping></item><item><title>Anonymous Methods e collection generiche</title><link>http://blogs.aspitalia.com/matteo/post1851/Anonymous-Methods-Collection-Generiche.aspx</link><pubDate>Tue, 21 Nov 2006 17:26:06 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1851" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Tutto quello che ci serve sapere per &lt;a title="managing collections with functors" href="http://dotnetslackers.com/community/blogs/simoneb/archive/2006/08/20/367.aspx"&gt;lavorare con le collection generiche usando anonymous methods&lt;/a&gt;; purtroppo è in lingua inglese... ma se insistiamo tutti insieme magari &lt;a title="simoneb's blog" href="http://dotnetslackers.com/community/blogs/simoneb/"&gt;Simone&lt;/a&gt; lo traduce e lo posta anche sul &lt;a href="http://blogs.ugidotnet.org/simone%20busoli"&gt;suo blog italiano&lt;/a&gt; o su &lt;a title="guru4.net" href="http://www.guru4.net/"&gt;GURU4.net&lt;/a&gt; ;-)&lt;/p&gt; &lt;p&gt;L'articolo è un po' datato ma - per chi non l'avesse ancora visto - credo valga la pena spendere 10 minuti per risparmiare qualche ora al momento del bisogno :-)&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_2.0/" rel="tag"&gt;.NET Framework 2.0&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/matteo/post1851/Anonymous-Methods-Collection-Generiche.aspx"&gt;&lt;em&gt;Anonymous Methods e collection generiche&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Matteo Casati</dc:creator><category>.NET, .NET Framework, .NET Framework 2.0</category><guid isPermaLink="true">http://blogs.aspitalia.com/matteo/post1851/Anonymous-Methods-Collection-Generiche.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/matteo/post1851/Anonymous-Methods-Collection-Generiche.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS1851.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1851</trackback:ping></item><item><title>Generare documenti Office via ASP.NET</title><link>http://blogs.aspitalia.com/matteo/post1811/Generare-Documenti-Office-ASP.NET.aspx</link><pubDate>Tue, 31 Oct 2006 11:37:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1811" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Quasi tutti noi abbiamo (almeno una volta, confessate!) avuto la necessità di creare nelle nostre applicazioni web funzionalità di esportazione dei dati in formato Exel o di generazione di documenti Word, trovandoci inevitabilmente a fare i conti con le difficoltà del caso (Office sul server? E chi ce l'ha???) &lt;/p&gt;&lt;p&gt;Il vecchio formato binario in uso da 10 anni in Office era infatti decisamente troppo complesso per essere manipolato fuori dalla suite di Microsoft (ok, le versioni 2000 e 2003 hanno introdotto la possibilità di creare documenti in formato XML ma è un po' un &amp;quot;optional&amp;quot; e con diverse limitazioni)&lt;/p&gt;&lt;p&gt;Però...&lt;/p&gt;&lt;p&gt;Se tra gli importanti e sostanziosi cambiamenti introdotti con &lt;strong&gt;Office 2007&lt;/strong&gt; quello più evidente è la nuova interfaccia grafica, quello più interessante è il cambiamento del &lt;strong&gt;formato dei documenti&lt;/strong&gt;: ora finalmente possiamo dire addio alle difficoltà di manipolazione dei documenti Office da codice e Ted Pattison, su MSDN Magazine di Novembre 2006 ci illustra quanto diventa semplice lavorare con Office usando .NET: &lt;a title="server-side generation of word 2007 docs" href="http://msdn.microsoft.com/msdnmag/issues/06/11/basicinstincts/default.aspx"&gt;Server-Side Generation of Word 2007 Docs&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Happy (office documents) programming!&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/matteo/post1811/Generare-Documenti-Office-ASP.NET.aspx"&gt;&lt;em&gt;Generare documenti Office via ASP.NET&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Matteo Casati</dc:creator><category>.NET</category><guid isPermaLink="true">http://blogs.aspitalia.com/matteo/post1811/Generare-Documenti-Office-ASP.NET.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/matteo/post1811/Generare-Documenti-Office-ASP.NET.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS1811.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1811</trackback:ping></item><item><title>Internet Explorer 7 - disponibile la RC1</title><link>http://blogs.aspitalia.com/matteo/post1717/Internet-Explorer-Disponibile-RC1.aspx</link><pubDate>Fri, 25 Aug 2006 08:07:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1717" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;IE7 è finalmente giunto alla prima RC (Release Candidate), come annunciato sul &lt;a title="IEBlog" href="http://blogs.msdn.com/ie/default.aspx" target="_blank"&gt;blog del team&lt;/a&gt;: &lt;a title="IE7 RC1" href="http://blogs.msdn.com/ie/archive/2006/08/24/715752.aspx" target="_blank"&gt;Internet Explorer 7 Release Candidate Now Available&lt;/a&gt;. Nel post originale sono spiegate le variazioni.&lt;/p&gt;&lt;p&gt;La prima cosa che salta all'occhio sono le &lt;a title="Installation Changes in IE7 Release Candidate" href="http://blogs.msdn.com/ie/archive/2006/08/24/714977.aspx" target="_blank"&gt;Installation Changes in IE7 Release Candidate&lt;/a&gt; per cui non sarà più necessario rimuovere manualmente eventuali versioni precedenti (beh, ad ogni modo un paio di reboot non ve li toglie nessuno!)&lt;/p&gt;&lt;p&gt;Unico problema da me riscontrato: al termine dell'installazione non era più visibile la &amp;quot;Quick Start Toolbar&amp;quot; nella barra di Windows; niente di grave insomma :-)&lt;/p&gt;&lt;p&gt;Dimenticavo il link diretto per il download (gratuito, previa autenticazione della copia di Windows) di &lt;a title="Download IE7 RC1" href="http://www.microsoft.com/ie/" target="_blank"&gt;IE7 RC1&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;Enjoy!&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/matteo/post1717/Internet-Explorer-Disponibile-RC1.aspx"&gt;&lt;em&gt;Internet Explorer 7 - disponibile la RC1&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Matteo Casati</dc:creator><category>.NET</category><guid isPermaLink="true">http://blogs.aspitalia.com/matteo/post1717/Internet-Explorer-Disponibile-RC1.aspx</guid><slash:comments>3</slash:comments><wfw:comment>http://blogs.aspitalia.com/matteo/post1717/Internet-Explorer-Disponibile-RC1.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS1717.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1717</trackback:ping></item><item><title>Quanti motivi ci sono per passare a Visual Studio 2005?</title><link>http://blogs.aspitalia.com/matteo/post1529/Motivi-Passare-Visual-Studio-2005.aspx</link><pubDate>Thu, 23 Mar 2006 10:43:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1529" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Più di 400.&lt;/p&gt;&lt;p&gt;Non ci credete? &lt;br /&gt;Allora guardate qua: &lt;a href="http://www.400plusdifferences.com/"&gt;http://www.400plusdifferences.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/matteo/post1529/Motivi-Passare-Visual-Studio-2005.aspx"&gt;&lt;em&gt;Quanti motivi ci sono per passare a Visual Studio 2005?&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Matteo Casati</dc:creator><category>.NET</category><guid isPermaLink="true">http://blogs.aspitalia.com/matteo/post1529/Motivi-Passare-Visual-Studio-2005.aspx</guid><slash:comments>3</slash:comments><wfw:comment>http://blogs.aspitalia.com/matteo/post1529/Motivi-Passare-Visual-Studio-2005.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS1529.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1529</trackback:ping></item><item><title>Internet Explorer 7 Beta 2 Preview disponibile per il download</title><link>http://blogs.aspitalia.com/matteo/post1448/Internet-Explorer-Beta-Preview-Disponibile-Download.aspx</link><pubDate>Tue, 31 Jan 2006 21:18:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1448" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Come annunciato in Microsoft in occasione di &amp;quot;ISV Community Days&amp;quot; (che meriterebbe almeno un post per ogni argomento trattato, da Windows Workflow Foundation a Communication Foundation, passando da Windows Presentation Foundation, insomma: tutto quello che è &lt;a title="WinFX" href="http://msdn.microsoft.com/winfx/" target="_blank"&gt;WinFX&lt;/a&gt;.... ma aspettiamo &lt;a title="WinFXItalia.com" href="http://www.winfxitalia.com/" target="_blank"&gt;WinFXItalia.com&lt;/a&gt; che è meglio!) da questa sera è disponibile per il download &lt;a title="Internet Explorer 7 Beta 2 Preview" href="http://www.microsoft.com/windows/ie/ie7/default.mspx" target="_blank"&gt;Internet Explorer 7 Beta 2 Preview&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;Ho appena scaricato il setup (11.2 MB)... procedo con l'installazione e vi faccio sapere :-)&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/matteo/post1448/Internet-Explorer-Beta-Preview-Disponibile-Download.aspx"&gt;&lt;em&gt;Internet Explorer 7 Beta 2 Preview disponibile per il download&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Matteo Casati</dc:creator><category>.NET</category><guid isPermaLink="true">http://blogs.aspitalia.com/matteo/post1448/Internet-Explorer-Beta-Preview-Disponibile-Download.aspx</guid><slash:comments>1</slash:comments><wfw:comment>http://blogs.aspitalia.com/matteo/post1448/Internet-Explorer-Beta-Preview-Disponibile-Download.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS1448.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1448</trackback:ping></item></channel></rss>