Inside .NET http://blogs.ugidotnet.org/rucka/category/Inside .NET.aspx Inside .NET it-IT Gianluca Carucci Subtext Version 2.6.0.0 Un ragionamento portato un po' all'estremo... http://blogs.ugidotnet.org/rucka/archive/2005/02/24/11379.aspx <p>Il <a href="http://blogs.ugidotnet.org/dinoes/archive/2005/02/24/11376.aspx">post </a>di <a href="http://blogs.ugidotnet.org/dinoes/">Dino Esposito</a> mi ha suscitato una riflessione.  A mio avviso l'idea dello Script CallBacks è molto bella ma è credo sia l'ennesimo modo per girare attorno a un problema. </p> <p>A mio avviso il web, data la sua natura stateless e disconnessa,  non è nato per offrire una piattaforma dove far girare applicazioni che hanno bisogno di mantenere uno state ed effettuare operazioni complesse. I linguaggi di scripting e asp.net sono riusciti a portare e sfruttare all'estremo le potenzialità del web. Il punto del ragionamento è: vale veramente la pena storpiare una tecnologia a tal punto invece di crearne una ad hoc? </p> <p>Credo che la Microsoft con Longhorn, Avalon e Indigo stanno andando verso questa direzione offrendo un unico modello per costruire applicazioni distribute facilmente installabili  (e scusate la ripetizione, distribuibili). Il futuro sarà veramente quello di inglobare le applicazioni tradizionali (winform) e quelle web sotto un unico modello eliminando di fatto il web? E' anche vero che, nonostante sia tutto molto bello e affascinante, ha un tragico problema. Il modello offerto da Longhorn non è multipiattaforma (per ovvie ragioni) e questo potrebbe essere un grosso freno verso l'evoluzione vista nel senso sopra citato. Chi vincerà tra tecnologia e diffusione?</p><div style="margin: 0px; padding: 0px; display: inline;" contenteditable="false" class="wlWriterSmartContent">Technorati tags: <a rel="tag" href="http://technorati.com/tags/Ajax">Ajax</a>, <a rel="tag" href="http://technorati.com/tags/Esposito">Esposito</a></div><img src="http://blogs.ugidotnet.org/rucka/aggbug/11379.aspx" width="1" height="1" /> Gianluca Carucci http://blogs.ugidotnet.org/rucka/archive/2005/02/24/11379.aspx Thu, 24 Feb 2005 12:16:00 GMT http://blogs.ugidotnet.org/rucka/archive/2005/02/24/11379.aspx#feedback 2 http://blogs.ugidotnet.org/rucka/comments/commentRss/11379.aspx Nuovamente un Quiz Sharp http://blogs.ugidotnet.org/rucka/archive/2004/10/20/4489.aspx <P>Prendiamo questo&nbsp;Snippet di codice:<BR></P> <P><FONT color=#0000ff>using</FONT> System; <BR><FONT color=#0000ff>using</FONT> System.Runtime.Remoting; <BR><FONT color=#0000ff>using</FONT> System.Reflection; <BR><FONT color=#0000ff>using</FONT> System.Threading; <BR><BR><FONT color=#000080>namespace</FONT> AppDomTest <BR>{ <BR>&nbsp; <FONT color=#0000ff>public class</FONT> InvokeMethod <BR>&nbsp; { <BR>&nbsp;&nbsp;&nbsp; <FONT color=#0000ff>public static void</FONT> Main( String[] argv ) <BR>&nbsp;&nbsp;&nbsp; { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AppDomainSetup info = <FONT color=#0000ff>new</FONT> AppDomainSetup(); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AppDomain dom = AppDomain.CreateDomain("RemoteDomain", null, info); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Foo f = dom.CreateInstance("AppDomTest", "AppDomTest.Foo").Unwrap() as Foo; <BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;Foo f2 = <FONT color=#0000ff>new</FONT> Foo(); <BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;Foo f3 = <FONT color=#0000ff>new</FONT> Foo(); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f3.PrintCounter(); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AppDomain.Unload(dom); <BR>&nbsp;&nbsp;&nbsp;&nbsp; Console.Read(); <BR>&nbsp;&nbsp;&nbsp; } <BR>&nbsp; } <BR>&nbsp;<FONT color=#0000ff> public class</FONT> Foo : MarshalByRefObject <BR>&nbsp; { <BR>&nbsp;&nbsp;&nbsp;<FONT color=#0000ff> private static</FONT> int _ci = 0; <BR>&nbsp;&nbsp;&nbsp; <FONT color=#0000ff>public</FONT> Foo() <BR>&nbsp;&nbsp; { <BR>&nbsp;&nbsp;&nbsp;&nbsp; _ci++; <BR>&nbsp;&nbsp; } <BR>&nbsp;&nbsp;<FONT color=#0000ff> public void</FONT> PrintCounter() <BR>&nbsp; { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine("Counter is {0}", _ci); <BR>&nbsp;&nbsp; } <BR>&nbsp; } <BR>}</P> <P>Cosa viene a visualizzato?</P> <UL> <LI><STRONG>A</STRONG>. Counter is 1</LI> <LI><STRONG>B</STRONG>. Counter is 2</LI> <LI><STRONG>C</STRONG>. Counter is 3</LI></UL> <P>&nbsp;</P><img src="http://blogs.ugidotnet.org/rucka/aggbug/4489.aspx" width="1" height="1" /> Gianluca Carucci http://blogs.ugidotnet.org/rucka/archive/2004/10/20/4489.aspx Wed, 20 Oct 2004 18:46:00 GMT http://blogs.ugidotnet.org/rucka/archive/2004/10/20/4489.aspx#feedback 3 http://blogs.ugidotnet.org/rucka/comments/commentRss/4489.aspx NotSupportedException e NotImplementedException http://blogs.ugidotnet.org/rucka/archive/2004/07/30/409.aspx Che differenza c'&#232; tra queste due eccezioni? Chi meglio di <A href="http://blogs.msdn.com/brada/">Brad Abrams </A>pu&#242; <A href="http://blogs.msdn.com/brada/archive/2004/07/29/201354.aspx">spiegarcelo</A>!<img src="http://blogs.ugidotnet.org/rucka/aggbug/409.aspx" width="1" height="1" /> Gianluca Carucci http://blogs.ugidotnet.org/rucka/archive/2004/07/30/409.aspx Fri, 30 Jul 2004 10:26:00 GMT http://blogs.ugidotnet.org/rucka/archive/2004/07/30/409.aspx#feedback http://blogs.ugidotnet.org/rucka/comments/commentRss/409.aspx Enumeration bug? http://blogs.ugidotnet.org/rucka/archive/2004/07/28/407.aspx <P>Oggi mi sono imbattuto in una possibile anomalia delle enumerazioni. Consideriamo una enum dichiarata cos&#236;:</P> <P>public enum MyEnum { <BR><BR>Val0 = 0, <BR>Val10 = 10, <BR>Val2, <BR>Val3 = 7, <BR>Val11 = 11<BR>} <BR><BR>Un possible frammento di codice che usa l'enum pu&#242; essere il seguente:<BR>.....<BR>MyEnum p = MyEnum .Val11;<BR>int i = (int) p;<BR>Console.WriteLine("MyEnum : {0}, i: {1}", p, i);<BR>p = MyEnum .Val2; <BR>i = (int)p; <BR>Console.WriteLine("MyEnum : {0}, i: {1}", p, i); <BR><BR>Cosa viene visualizzato a video? E' naturale aspettarsi di trovare le seguenti righe: <BR><BR>"MyEnum : Val11, i: 11"<BR>"MyEnum : Val2, i: 2"<BR><BR>Invece inaspettatamente a video sar&#224; stampato:<BR>"MyEnum : Val11, i: 11"<BR>"MyEnum : Val11, i: 11"<BR><BR>Dopo una discussione con i sempre attenti <A href="http://www.ugidotnet.org/7322.blog">Adrian </A>e  <A href="http://loluyede.blogspot.com/">Lawrence</A> la risposta &#232; stata data direttamente <A href="http://msdn.microsoft.com/vcsharp/team/language/default.aspx">dalle specifiche di C#</A>. I punti chiave si trovano nel paragrafo 1.10 e nel paragrafo 14.3.<BR>1.10: "When an enum member declaration does not explicitly specify a value, the member is given the value zero (if it is the first member in the enum type) or the value of the textually preceding enum member plus one."<BR><BR>Questo elemento della specifica spiega perch&#232; a Val2 viene associato il valore 11. Ma che senso ha? Pi&#249; avanti nelle specifiche sono fornite ulterori spiegazioni:<BR>14.3: "Multiple enum members may share the same associated value".<BR><BR>Quindi ricapitolando le enumerazioni possono avere membri con valori equivalenti ma non possono esserci due membri con lo stesso nome (esattamente come le define in c/c++). In definitiva il membro Val2 &#232; solo un alias del membro Val10. Ora quadra tutto, ma rimane ancora una cosa in sospeso....<BR><BR>Enumeration bug?<BR>NO!</P><img src="http://blogs.ugidotnet.org/rucka/aggbug/407.aspx" width="1" height="1" /> Gianluca Carucci http://blogs.ugidotnet.org/rucka/archive/2004/07/28/407.aspx Wed, 28 Jul 2004 23:48:00 GMT http://blogs.ugidotnet.org/rucka/archive/2004/07/28/407.aspx#feedback http://blogs.ugidotnet.org/rucka/comments/commentRss/407.aspx IPEndPoint.Create(SocketAddress), perchè è un Instance Method???? http://blogs.ugidotnet.org/rucka/archive/2004/07/27/406.aspx <P>Evidentemente non sono l'unico a essermi fatto questa domanda....</P> <P> Dando un'occhiata al codice di Mono, nell'implementazione della propriet&#224; LocalEndPoint e RemoteEndPoint si pu&#242; notare il seguente codice (e i commenti) :</P> <P>"...<FONT color=#0000ff size=2></P> <P>if</FONT><FONT size=2>(sa.Family==AddressFamily.InterNetwork || sa.Family==AddressFamily.InterNetworkV6 ) {</P> <P></FONT><FONT color=#008000 size=2>// Stupidly, EndPoint.Create() is an</P></FONT><FONT size=2> <P></FONT><FONT color=#008000 size=2>// instance method</P></FONT><FONT size=2> <P></FONT><FONT color=#0000ff size=2>return</FONT><FONT size=2> </FONT><FONT color=#0000ff size=2>new</FONT><FONT size=2> IPEndPoint(0, 0).Create(sa);</P> <P>}</P></FONT> <P>..."</P> <P>Chiss&#224; se chi ha progettato (o implementato) la classe IPEndPoint lavora ancora in Microsoft:P</P><img src="http://blogs.ugidotnet.org/rucka/aggbug/406.aspx" width="1" height="1" /> Gianluca Carucci http://blogs.ugidotnet.org/rucka/archive/2004/07/27/406.aspx Tue, 27 Jul 2004 16:28:00 GMT http://blogs.ugidotnet.org/rucka/archive/2004/07/27/406.aspx#feedback http://blogs.ugidotnet.org/rucka/comments/commentRss/406.aspx Formatter, Serializzazione e dintorni... Errore nella documentazione o bug? http://blogs.ugidotnet.org/rucka/archive/2004/07/02/405.aspx <P>In questi giorni stavo dilettandomi a scrivere un Formatter personalizzato da affiancare al BinaryFormatter e al SoapFormatter. Grazie al prezioso <A href="http://msdn.microsoft.com/msdnmag/issues/02/04/net/default.aspx">link </A>di <A href="http://www.ugidotnet.org/7322.blog">Adrian</A> sono partito leggendo la serie di articoli di Jeffrey Richter sulla serializzazione. Nel primo di questi articoli sono elencate la serie di operazioni eseguite da un generico Formatter durante la deserializzazione. In questa fase &#232; citato il metodo statico FormatterServices.GetSerializableMembers. La documentazione microsoft riguardo questo metodo dice:</P> <P>"Gets all the serializable member for a class of specified type". Inoltre nella sezione <STRONG>Remarks </STRONG>specifica: "Generally, members of a class are the nontransient, nonstatic members such as fields and properties. To be included, properties must have both a getter and a setter."</P> <P>In pratica il metodo restituisce tutti i campi di una classe e le propriet&#224; che implementano il get e il set. Mosso dalla curiosit&#224; provo e.... sorpresa! Tra i membri restituiti dal metodo nessuna traccia delle propriet&#224;. Per avere la conferma dell'anomalia ho controllato il mio mono 1.0 nuovo di zecca e ho scoperto che l'effettiva implementazione di mono recupera solo i campi della classe. </P> <P>Errore della documentazione o bug....? Ai posteri (o al fw 2.0) la risposta...</P><img src="http://blogs.ugidotnet.org/rucka/aggbug/405.aspx" width="1" height="1" /> Gianluca Carucci http://blogs.ugidotnet.org/rucka/archive/2004/07/02/405.aspx Fri, 02 Jul 2004 16:09:00 GMT http://blogs.ugidotnet.org/rucka/archive/2004/07/02/405.aspx#feedback http://blogs.ugidotnet.org/rucka/comments/commentRss/405.aspx