<?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.5.16</generator><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><sy:updateBase>1998-01-01T12:00+00:00</sy:updateBase><lastBuildDate>Thu, 14 Apr 2011 23:29:11 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>Il mio MIX 2011</title><link>http://blogs.aspitalia.com/matteo/post2696/MIX-2011.aspx</link><pubDate>Thu, 14 Apr 2011 23:29:11 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2696" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;A differenza di &lt;a href="http://blogs.aspitalia.com/daniele/"&gt;Daniele&lt;/a&gt; io il &lt;a href="http://visitmix.com/"&gt;MIX&lt;/a&gt; me lo guarda con calma da casa: vuoi mettere il risparmio di tempo, denaro ed energie?&amp;#160; E poi Las Vegas è una città così noiosa.&lt;/p&gt; &lt;p&gt;Va beh, invidia a parte, su &lt;a href="http://channel9.msdn.com/events/MIX/MIX11/"&gt;Channel9&lt;/a&gt; possiamo rivedere con calma tutte le sessioni e c'è veramente l'imbarazzo della scelta!&lt;/p&gt; &lt;p&gt;Personalmente ho deciso di iniziare a filtrare i contenuti usando i tag: &lt;strong&gt;CSS3, HTML5, Internet Explorer,&amp;#160; JavaScript, jQuery e Web API&lt;/strong&gt; ma anche così mi sa che mi devo prendere qualche giorno di ferie per vedere tutto (e meno male che alcune registrazioni non sono ancora disponibili).&lt;/p&gt; &lt;p&gt;Per ora nella mia TODO list ci sono:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://channel9.msdn.com/Events/MIX/MIX11/HTM01"&gt;50 Performance Tricks to Make Your HTML5 Web Sites Faster&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://channel9.msdn.com/Events/MIX/MIX11/HTM14"&gt;HTML5 for Silverlight Developers&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://channel9.msdn.com/Events/MIX/MIX11/HTM11"&gt;IE 10 Platform Preview 1: The Future of Adaptive Web Design&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://channel9.msdn.com/Events/MIX/MIX11/HTM10"&gt;Hot from the Labs: HTML5 WebSockets&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://channel9.msdn.com/Events/MIX/MIX11/HTM06"&gt;JavaScript: The Language&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://channel9.msdn.com/Events/MIX/MIX11/EXT19"&gt;Microformats and Semantic Markup&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://channel9.msdn.com/Events/MIX/MIX11/HTM18"&gt;Hacking with the F12 Developer Tools&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://channel9.msdn.com/Events/MIX/MIX11/HTM03"&gt;Deep Dive Into HTML5 &amp;lt;canvas&amp;gt;&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://channel9.msdn.com/Events/MIX/MIX11/HTM09"&gt;The View of the World Depends on the Glasses I Wear&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Veramente tanta, tanta roba. Sia per quantità che per qualità.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/CSS/" rel="tag"&gt;CSS&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/HTML5/" rel="tag"&gt;HTML5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/JavaScript/" rel="tag"&gt;JavaScript&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/jQuery/" rel="tag"&gt;jQuery&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/MIX11/" rel="tag"&gt;MIX11&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/matteo/post2696/MIX-2011.aspx"&gt;&lt;em&gt;Il mio MIX 2011&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>HTML5, CSS, JavaScript, jQuery, MIX11</category><guid isPermaLink="true">http://blogs.aspitalia.com/matteo/post2696/MIX-2011.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/matteo/post2696/MIX-2011.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS2696.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2696</trackback:ping></item><item><title>Un concorso per applicazioni in HTML5 che mette in palio pi&amp;#249; di 40.000 $ in premi</title><link>http://blogs.aspitalia.com/matteo/post2688/Concorso-Applicazioni-HTML5-Mette-Palio-40.000-Premi.aspx</link><pubDate>Wed, 02 Mar 2011 18:21:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2688" border="0" style="width:1px; height:1px;" /&gt;
&lt;p&gt;Una cosa è sicura: HTML5 (con le tecnologie ad esso correlate come CSS3, SVG, le nuove API JavaScript, ecc.) e le caratteristiche dei nuovi browser hanno alzato di molto l'asticella di cosa sia possibile fare nativamente sul Web senza ricorrere a plug-in. Sinceramente ad oggi, potendo tralasciare la necessità di mantenere la compatibilità con i vecchi browser e applicazioni multimediali molto spinte, faccio fatica ad immaginare qualcosa che richieda ancora Flash o similari (non faccio nomi, tanto si capisce!)&lt;/p&gt; &lt;p&gt;Questa convinzione a quanto pare non è solo mia &lt;img alt="Sorriso" src="http://blogs.aspitalia.com/img/m.casati/windows-live-writer/html5-dev-unplugged_1073c/wlemoticon-smile_2.png" /&gt; visto che &amp;quot;&lt;a href="http://www.microsoft.com"&gt;qualcuno&lt;/a&gt;&amp;quot; ha deciso di lanciare una sfida alle applicazioni native mettendo in palio premi per un valore complessivo di oltre 40.000 $, a partire da un viaggio a Las Vegas completamente spesato (volo e hotel) per il &lt;a href="http://futureofwebapps.com/las-vegas-2011/"&gt;FOWA&lt;/a&gt; + 9.000 $ in contanti per il primo classificato,5.000 $ in contanti per i vincitori nelle categorie &amp;quot;giochi&amp;quot; e &amp;quot;musica&amp;quot;, tablet PC, laptop e Xbox con Kinect.&lt;/p&gt; &lt;p&gt;Per partecipare la regola è semplicissima: inviare un'applicazione HTML5 che sembri un'applicazione nativa senza fare uso di plug-in e funzionante su IE9 RC e sulle ultime versioni beta di Firefox e Chrome.&lt;/p&gt; &lt;p&gt;Se siete interessati al concorso o curiosi di vedere cosa ne uscirà, segnatevi questo link: &lt;a href="http://www.beautyoftheweb.com/#/unplugged/"&gt;http://www.beautyoftheweb.com/#/unplugged/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/HTML5/" rel="tag"&gt;HTML5&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/matteo/post2688/Concorso-Applicazioni-HTML5-Mette-Palio-40.000-Premi.aspx"&gt;&lt;em&gt;Un concorso per applicazioni in HTML5 che mette in palio pi&amp;#249; di 40.000 $ in premi&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>HTML5</category><guid isPermaLink="true">http://blogs.aspitalia.com/matteo/post2688/Concorso-Applicazioni-HTML5-Mette-Palio-40.000-Premi.aspx</guid><slash:comments>9</slash:comments><wfw:comment>http://blogs.aspitalia.com/matteo/post2688/Concorso-Applicazioni-HTML5-Mette-Palio-40.000-Premi.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS2688.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2688</trackback:ping></item><item><title>Internet Explorer 9 &amp;#232; in RC</title><link>http://blogs.aspitalia.com/matteo/post2684/Internet-Explorer-RC.aspx</link><pubDate>Thu, 10 Feb 2011 20:22:09 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2684" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Come già &lt;a href="http://www.aspitalia.com/focuson/1203/Disponibile-Download-Release-Candidate-Internet-Explorer-9.0.aspx"&gt;annunciato&lt;/a&gt; nel pomeriggio, Microsoft ha rilasciato la &lt;strong&gt;Release Candidate di Internet Explorer 9&lt;/strong&gt; e la corrispondente &lt;a href="http://ie.microsoft.com/testdrive/info/downloads/"&gt;Platform Preview&lt;/a&gt; (versione 8), ovvero la versione "light" del browser (senza la UI completa) che ne permette l'installazione side-by-side con una versione precedente.&lt;/p&gt; &lt;p&gt;Rispetto alle beta si è raggiunta una buona stabilità e sono stati raggiunti praticamente tutti gli obiettivi prefissati. In particolare il team di sviluppo di IE9 si è manifestatamente concentrato su 3 aspetti fondamentali: aderenza agli &lt;strong&gt;standard&lt;/strong&gt;, &lt;strong&gt;performance&lt;/strong&gt; e &lt;strong&gt;sicurezza&lt;/strong&gt;; i dettagli e le considerazioni principali sono ampiamente illustrate nel post "&lt;a href="http://blogs.msdn.com/b/ie/archive/2011/02/10/acting-on-feedback-ie9-release-candidate-available-for-download.aspx"&gt;Acting on Feedback: IE9 Release Candidate Available for Download&lt;/a&gt;" su &lt;a href="http://blogs.msdn.com/b/ie/"&gt;IEBlog&lt;/a&gt; e riprese sul &lt;a href="http://blogs.msdn.com/b/italy/archive/2011/02/10/internet-explorer-9-rc-disponibile-per-il-download-standard-velocit-224-e-sicurezza.aspx"&gt;blog del team di MSDN Italia&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Per quanto riguarda l'interoperabilità e gli standard, personalmente mi fa piacere che sia stato aggiunto il supporto alle&lt;strong&gt; API di geolocalizzazione&lt;/strong&gt;, ai &lt;strong&gt;tag semantici&lt;/strong&gt; e&amp;#160; alle&lt;strong&gt; trasformazioni 2D di CSS3&lt;/strong&gt;, oltre all'allineamento con le variazioni delle&lt;strong&gt; specifiche di HTML5&lt;/strong&gt; del W3C.&lt;/p&gt; &lt;p&gt;Il &lt;strong&gt;nuovo motore JavaScript Chakra&lt;/strong&gt; ha una velocità sorprendente, tanto che nel test "&lt;a href="http://webkit.org/perf/sunspider/sunspider.html"&gt;WebKit SunSpider&lt;/a&gt;" IE9 RC risulta non solo più veloce del 35% rispetto alla beta, ma anche di Chrome (WOW!)&lt;/p&gt; &lt;p&gt;&lt;strong&gt;ActiveX Filtering&lt;/strong&gt; (per il blocco di tutti gli ActiveX), &lt;strong&gt;Tracking Protection&lt;/strong&gt; (per impedire il tracciamento delle informazioni di navigazione) e &lt;strong&gt;InPrivate browsing&lt;/strong&gt; assicurano poi un livello di protezione elevato.&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.aspitalia.com/img/m.casati/windows-live-writer/ie9-rc-release-candidate_106bf/ie9rc-screenshot_2.png"&gt;&lt;img title="ie9rc-screenshot" border="0" alt="ie9rc-screenshot" src="http://blogs.aspitalia.com/img/m.casati/windows-live-writer/ie9-rc-release-candidate_106bf/ie9rc-screenshot_thumb.png" width="604" height="490" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Rispetto alle versioni precedenti, IE9 è stato profondamente rinnovato anche dal punto dell'&lt;strong&gt;interfaccia utente&lt;/strong&gt;, al fine di migliorarne l'&lt;strong&gt;usabilità&lt;/strong&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;la UI è "minimalista", lasciando così la maggior parte dello spazio alla visualizzazione della pagina web vera e propria (a questo serve un browser, no?);&lt;/li&gt; &lt;li&gt;il pulsante "back" (probabilmente il più usato durante la navigazione) è stato messo in particolare evidenza (anche se personalmente non mi piace molto l'effetto grafico, ma questo è un giudizio estetico assolutamente soggettivo);&lt;/li&gt; &lt;li&gt;è presente un'unica casella di testo per l'inserimento dell'indirizzo e per la ricerca, decisamente pratica da utilizzare anche grazie ai suggerimenti istantanei corredati da anteprima (comunque disabilitabile contestualmente così da garantire la propria privacy);&lt;/li&gt; &lt;li&gt;la barra delle schede aperte (tabs) può essere posizionata sia a fianco della barra degli indirizzi che in una nuova riga (questa è una delle novità della RC rispetto alle versioni beta);&lt;/li&gt; &lt;li&gt;è possibile "staccare" una scheda creando una nuova finestra oppure spostarla da una finestra all'altra;&lt;/li&gt; &lt;li&gt;è possibile "pinnare" (ancorare un elemento alla barra di Windows 7) una scheda, un gruppo di tab aperti e anche link presenti nelle pagine.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Insomma, tutta un'altra cosa rispetto ad IE8, tanto da. non sembrare neanche Internet Explorer :-) &lt;br /&gt;Per scoprire tutte le altre novità (e sono veramente tante!) e &lt;strong&gt;provare IE9 RC&lt;/strong&gt; non resta che visitare &lt;a href="http://www.beautyoftheweb.com/"&gt;http://www.beautyoftheweb.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/CSS/" rel="tag"&gt;CSS&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows/" rel="tag"&gt;Windows&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/Windows_Vista/" rel="tag"&gt;Windows Vista&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/XHTML/" rel="tag"&gt;XHTML&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/matteo/post2684/Internet-Explorer-RC.aspx"&gt;&lt;em&gt;Internet Explorer 9 &amp;amp;egrave; in RC&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>Misc, CSS, Windows, Windows 7, Windows Client, Windows Vista, XHTML</category><guid isPermaLink="true">http://blogs.aspitalia.com/matteo/post2684/Internet-Explorer-RC.aspx</guid><slash:comments>5</slash:comments><wfw:comment>http://blogs.aspitalia.com/matteo/post2684/Internet-Explorer-RC.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS2684.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2684</trackback:ping></item><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>Windows Mobile 6.5: HTC Touch2</title><link>http://blogs.aspitalia.com/matteo/post2557/Windows-Mobile-6.5-HTC-Touch2.aspx</link><pubDate>Thu, 29 Oct 2009 17:20:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2557" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Da una decina di giorni sono un &amp;quot;&lt;em&gt;fortunato&lt;/em&gt;&amp;quot; possessore di un &lt;a href="http://www.htc.com/it/product/touch2/overview.html"&gt;HTC Touch2&lt;/a&gt;, uno dei primissimi dispositivi con &lt;a href="http://www.microsoft.com/windowsmobile/it-it/default.mspx"&gt;Windows Mobile 6.5&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;Il telefono in sé non è male: piccolo, leggero, relativamente economico (stiamo comunque parlando di 300 ¤), seppur con alcune limitazioni note (il display non è certo il massimo, così come la fotocamera) di cui ero conscio già prima dell'acquisto. Le vere sorprese sono però arrivate solo dopo: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Nei primi giorni di utilizzo ho dovuto rimuovere la batteria ben 3 volte! La domanda che mi faccio è: ma com'è che sugli &lt;a href="http://www.apple.com/iphone/"&gt;iPhone&lt;/a&gt; la batteria nemmeno si può staccare???&lt;/li&gt;&lt;li&gt;Le operazioni che non richiedono il pennino si contano sulle dita di una mano (ironia della sorte, quelle stesse dita che non si possono usare per fare altro!) sfiorando in alcuni casi il paradosso: situazioni in cui l'interfaccia principale ha zone sensibili al tocco microscopiche ma con menu contestuali touch friendly così da richiedere lo scroll&lt;/li&gt;&lt;li&gt;Domenica scorsa, al termine del periodo estivo, siamo tornati all'ora solare e. sorpresa: il dispositivo non si è accorto di nulla! Questa è regressione!!!&lt;/li&gt;&lt;li&gt;Le opzioni di &amp;quot;snoozing&amp;quot; degli appuntamenti e della sveglia in Windows Mobile non mi ha mai soddisfatto al 100% (averla come in Outlook, ovvero con la possibilità di definire il nuovo avviso rispetto alla scadenza non sarebbe male!) ma adesso che le opzioni sono diventate ZERO è veramente inaccettabile! &lt;/li&gt;&lt;li&gt;Il &lt;a href="http://www.windowsmarketplace.com/"&gt;Marketplace&lt;/a&gt; per Windows Phone (WOW, che nome innovativo! Il prossimo passo quale sarà? wPhone???) è di una tristezza deprimente: rispetto all'Apple Store sembra il deserto dei tartari.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Ok, alcune cose sono colpa dell'interfaccia TouchFLO di HTC però non ci siamo proprio!&lt;/p&gt;&lt;p&gt;Dopo anni di assoluta fedeltà, temo che questo sarà l'ultimo telefono Windows-based :-(&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Windows_Phone/" rel="tag"&gt;Windows Phone&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/matteo/post2557/Windows-Mobile-6.5-HTC-Touch2.aspx"&gt;&lt;em&gt;Windows Mobile 6.5: HTC Touch2&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>Misc, Windows Phone</category><guid isPermaLink="true">http://blogs.aspitalia.com/matteo/post2557/Windows-Mobile-6.5-HTC-Touch2.aspx</guid><slash:comments>4</slash:comments><wfw:comment>http://blogs.aspitalia.com/matteo/post2557/Windows-Mobile-6.5-HTC-Touch2.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS2557.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2557</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>Google Chrome</title><link>http://blogs.aspitalia.com/matteo/post2380/Google-Chrome.aspx</link><pubDate>Wed, 03 Sep 2008 13:29:10 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2380" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;La notizia del rilascio di un browser targato Google è ormai nota, anche se sono passate circa 24 ore dai &lt;a href="http://googleblog.blogspot.com/2008/09/fresh-take-on-browser.html"&gt;primi rumors ufficiali&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Dalla &lt;a href="http://www.google.com/chrome/"&gt;pagina di download&lt;/a&gt; viene presentato come &amp;quot;&lt;em&gt;un browser progettato per rendere più &lt;strong&gt;veloce&lt;/strong&gt;, &lt;strong&gt;facile&lt;/strong&gt; e &lt;strong&gt;sicuro&lt;/strong&gt; l'uso del Web con un &lt;strong&gt;design minimo&lt;/strong&gt; che &lt;strong&gt;non intralcia la navigazione&lt;/strong&gt;.&lt;/em&gt;&amp;quot;&lt;/p&gt; &lt;p&gt;Provandolo, seppur in modo decisamente sommario, ho cercato di verificare le &amp;quot;promesse&amp;quot; fatte:&lt;/p&gt; &lt;h3&gt;Veloce&lt;/h3&gt; &lt;p&gt;Niente di più vero: semplicemente impressionante! &lt;br /&gt;Voto: 9&lt;/p&gt; &lt;h3&gt;Facile&lt;/h3&gt; &lt;p&gt;In che senso? Ci sono browser &amp;quot;difficili&amp;quot;? Se tralasciamo le funzionalità avanzata (che l'utente &amp;quot;normale&amp;quot; semplicemente ignora) hanno 4 bottoni in croce e una barra degli indirizzi... &lt;br /&gt;Voto: n.a.&lt;/p&gt; &lt;h3&gt;Sicuro&lt;/h3&gt; &lt;p&gt;Sì, come no?! Ci sono volute ben.. poche ore per trovare la &lt;a href="http://blogs.zdnet.com/security/?p=1843"&gt;prima falla&lt;/a&gt;! Ok, è un bug noto e di facile risoluzione però... &lt;br /&gt;Voto: 4&lt;/p&gt; &lt;h3&gt;Design minimo&lt;/h3&gt; &lt;p&gt;Su questo niente da dire. Resta da valutare se si tratta di un &amp;quot;pro&amp;quot; o di un &amp;quot;contro&amp;quot;. IMHO è decisamente &lt;strong&gt;troppo &lt;/strong&gt;minimal. &lt;br /&gt;Voto: 4&lt;/p&gt; &lt;h3&gt;Non intralcia la navigazione&lt;/h3&gt; &lt;p&gt;Vedi quanto detto per &amp;quot;Facile&amp;quot;: sembra una frase messa lì a caso per completare il periodo. &lt;br /&gt;Voto: n.a.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Personalmente aggiungerei qualche altro aggettivo:&lt;/p&gt; &lt;h3&gt;Povero&lt;/h3&gt; &lt;p&gt;Mancano un sacco di funzionalità ormai basilari, presenti da anni in tutti gli altri browser: supporto RSS, anteprima di stampa, zoom, ecc.&lt;/p&gt; &lt;p&gt;Voto: 4&lt;/p&gt; &lt;h3&gt;Efficiente&lt;/h3&gt; &lt;p&gt;L'aspetto a mio avviso più interessante è l'isolamento dei singoli tab che dovrebbe garantire un'ottima stabilità.&lt;/p&gt; &lt;p&gt;Voto: 9&lt;/p&gt; &lt;h3&gt;Approssimativo&lt;/h3&gt; &lt;p&gt;Alcuni dettagli sembrano buttati lì con poca cura, come la scelta di alcuni termini (specie in italiano): &amp;quot;Roba da smanettoni&amp;quot;, &amp;quot;Statistiche per nerd&amp;quot;, ecc. &lt;br /&gt;Senza contare dettagli implementativi come &amp;quot;Inspect element&amp;quot;. In teoria identica alla versione presente in Safari, soffre di una serie di problemi e sviste considerevoli: manca la localizzazione, il dock alla finestra principale non funziona, lo stile grafico non è coerente (alcuni testi non sono leggibili perché in bianco su sfondo bianco), la visualizzazione delle risorse richiede un reload della pagina, ecc.&lt;/p&gt; &lt;h3&gt;Prematuro&lt;/h3&gt; &lt;p&gt;Al di là della mancanza di versioni per OS diversi da Windows, mancano plugin, skin e un sacco di altre cose che potrebbero invogliare l'utente a fare il salto. Sicuramente arriveranno ma al momento si può giusto tenere sott'occhio il prodotto in attesa di una versione &amp;quot;vera&amp;quot;.&lt;/p&gt; &lt;p&gt;Voto: n.a.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h2&gt;Conclusioni&lt;/h2&gt; &lt;p&gt;Ok, è una &amp;quot;beta&amp;quot;, quindi è presto per dare un giudizio (sebbene Google ci abbia abituato ad avere prodotti decisamente funzionanti anche in beta). &lt;br /&gt;Su molte cose ha però toppato e l'ha fatto in modo ingenuo: due anni di sviluppo e non hanno trovato un paio di giorni per sistemare qualche dettaglio?&lt;/p&gt; &lt;p&gt;In compenso l'engine sembra ottimo: basato sul migliore a disposizione (&lt;a href="http://webkit.org/"&gt;WebKit&lt;/a&gt;), velocissimo ed efficiente.&lt;/p&gt; &lt;p&gt;Resta la domanda del &amp;quot;&lt;strong&gt;perché&lt;/strong&gt;&amp;quot; Google ha deciso di riaprire quella &lt;em&gt;browser war&lt;/em&gt; che speravamo di esserci lasciati alle spalle. Al momento l'ipotesi che mi sembra più plausibile è &lt;a href="http://weblogs.asp.net/guybarrette/archive/2008/09/03/google-chrome-random-thoughts.aspx"&gt;quella fatta da Guy Barrette&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Resta il fatto che c'è un nuovo player da considerare e, vista da sviluppatore, un altro browser con cui fare i conti (grrrrrr!!!!): infatti ufficialmente quel che funziona su Safari &lt;em&gt;dovrebbe&lt;/em&gt; andare anche su Chrome; il condizionale è d'obbligo, tant'è che ad esempio una libreria come &lt;a href="http://cow.neondragon.net/stuff/reflection/"&gt;Reflection.js&lt;/a&gt; già non funziona...&lt;/p&gt; &lt;p&gt;Voi che ne pensate?&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/matteo/post2380/Google-Chrome.aspx"&gt;&lt;em&gt;Google Chrome&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>Misc</category><guid isPermaLink="true">http://blogs.aspitalia.com/matteo/post2380/Google-Chrome.aspx</guid><slash:comments>27</slash:comments><wfw:comment>http://blogs.aspitalia.com/matteo/post2380/Google-Chrome.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS2380.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2380</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>Grazie ASPItalia!</title><link>http://blogs.aspitalia.com/matteo/post2328/ASPItalia.aspx</link><pubDate>Wed, 16 Jul 2008 15:11:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2328" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Un grazie enorme a &lt;a title="Daniele" href="http://blogs.aspitalia.com/daniele/"&gt;Daniele&lt;/a&gt;. Lui sa perché!&lt;/p&gt;&lt;p&gt;&lt;em&gt;(chiedo scusa per l'OT e per la cripticità del messaggio ma... quando ci vuole ci vuole)&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/10annidi/" rel="tag"&gt;10annidi&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/Off_Topic/" rel="tag"&gt;Off Topic&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/matteo/post2328/ASPItalia.aspx"&gt;&lt;em&gt;Grazie ASPItalia!&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>Misc, 10annidi, ASPItalia.com, Off Topic</category><guid isPermaLink="true">http://blogs.aspitalia.com/matteo/post2328/ASPItalia.aspx</guid><slash:comments>1</slash:comments><wfw:comment>http://blogs.aspitalia.com/matteo/post2328/ASPItalia.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS2328.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2328</trackback:ping></item></channel></rss>