Quiz Sharp http://blogs.ugidotnet.org/adrian/category/Quiz Sharp.aspx Quiz Sharp it-IT Adrian Florea Subtext Version 2.6.0.0 Quiz Sharp #72 [junior] http://blogs.ugidotnet.org/adrian/archive/2009/05/21/quiz-sharp-72-junior.aspx <p>Il seguente snippet:</p> <p><strong>using</strong> System;<br /> <br /> <strong>interface</strong> IFoo {<br />     IFoo GetInstance();<br /> }<br /> <br /> <strong>partial class</strong> Foo : IFoo {<br />     <strong>public</strong> IFoo GetInstance() {<br />         Console.WriteLine("Ciao");<br />         <strong>return this</strong>;<br />     }<br /> }<br /> <br /> <strong>class</strong> Program {<br />     <strong>static void</strong> Main() {<br />         (<strong>new</strong> Foo()).GetInstance().GetInstance();<br />     }<br /> }</p> <p>stampa:</p> <p><strong>Ciao<br /> Ciao</strong></p> <p>a console. <em>Senza toccare lo snippet</em> ma solo aggiungendone un pezzo, dobbiamo stampare a console:</p> <p><strong>Ciao<br /> <font color="#ff0000">UGIdotNET</font><br /> Ciao</strong></p><img src="http://blogs.ugidotnet.org/adrian/aggbug/96256.aspx" width="1" height="1" /> Adrian Florea http://blogs.ugidotnet.org/adrian/archive/2009/05/21/quiz-sharp-72-junior.aspx Thu, 21 May 2009 11:55:14 GMT http://blogs.ugidotnet.org/adrian/archive/2009/05/21/quiz-sharp-72-junior.aspx#feedback 335 http://blogs.ugidotnet.org/adrian/comments/commentRss/96256.aspx http://blogs.ugidotnet.org/adrian/services/trackbacks/96256.aspx Corso Sql Server 2008 Express per gli insegnanti arrivati all'ONI2009 http://blogs.ugidotnet.org/adrian/archive/2009/04/14/corso-sql-server-2008-express-per-gli-insegnanti-arrivati-alloni2009.aspx <p>Ieri e l'altro ieri ho tenuto un corso su Sql Server 2008 Express per 80 insegnanti di informatica arrivati per l'occasione delle Olimpiadi Nazionali di Informatica (ONI2009) che quest'anno sono state ospitate proprio dalla mia citta'. E' stata un'esperienza interessante e inedita perche' parlare di un argomento cosi' "real world" davanti alle migliori menti in ambito pre-universitario vi assicuro che non e' facile. Gente eccezionale, che vive di algoritmi, grafi e C++, un po' lontana purtroppo dalle problematiche dei DB. Ieri, cioe' nel secondo giorno, mi sono dovuto inventare la <a href="http://it.wikipedia.org/wiki/Successione_di_Fibonacci">successione di Fibonacci</a> fatta in SQL...</p> <p><strong>with</strong> fibonacci(f, g) <strong>as </strong>(<br />     <strong>select</strong> 0, 1<br />     <strong>union all</strong><br />     <strong>select</strong> f + g, f + g + g<br />     <strong>from</strong> fibonacci<br />     <strong>where</strong> f + g &lt; 100<br /> )<br /> <strong>select</strong> f<br /> <strong>from</strong> fibonacci<br /> <strong>union all</strong><br /> <strong>select</strong> g<br /> <strong>from</strong> fibonacci<br /> <strong>order by</strong> 1</p> <p>per tenerli svegli ;-) Hanno ricevuto con interesse il compito a casa di risolvere il <a href="http://it.wikipedia.org/wiki/Rompicapo_delle_otto_regine">rompicapo delle otto regine</a> sempre via <a href="http://msdn.microsoft.com/en-us/library/ms190766.aspx">CTE</a> :-) Molto gradito e' stato anche l'argomento sul nuovo tipo <a href="http://technet.microsoft.com/en-us/library/bb677290.aspx">hierarchyid</a> perche' abbastanza vicino al loro lavoro (algoritmi, alberi, etc.). Li sono piaciuti anche i nuovi tipi <em>geography</em> e <em>geometry</em> e l'integrazione del motore con .NET, poi il lavoro con XML, etc. In ogni caso e' stato un corso abbastanza atipico, preparato in un solo sabato, dalle 2 di notte in poi, con la soddisfazione di aver conosciuto di persona quelli che preparano le nuove generazioni di informatici rumeni.</p><img src="http://blogs.ugidotnet.org/adrian/aggbug/95948.aspx" width="1" height="1" /> Adrian Florea http://blogs.ugidotnet.org/adrian/archive/2009/04/14/corso-sql-server-2008-express-per-gli-insegnanti-arrivati-alloni2009.aspx Tue, 14 Apr 2009 19:36:52 GMT http://blogs.ugidotnet.org/adrian/archive/2009/04/14/corso-sql-server-2008-express-per-gli-insegnanti-arrivati-alloni2009.aspx#feedback 313 http://blogs.ugidotnet.org/adrian/comments/commentRss/95948.aspx http://blogs.ugidotnet.org/adrian/services/trackbacks/95948.aspx Quando C# e' piuttosto l'eccezione che la regola http://blogs.ugidotnet.org/adrian/archive/2008/11/10/quando-c-e-piuttosto-leccezione-che-la-regola.aspx <p>Il comportamento del compilatore C#, presentato prima <a href="http://blogs.ugidotnet.org/WamBlog/archive/2008/11/01/c-uno-strano-comportamento-con-loverride.aspx">qui</a> da Diego e poi nel mio <a href="http://blogs.ugidotnet.org/adrian/archive/2008/11/09/quiz-sharp-71-overrideoverload.aspx">post precedente</a>, sembra singolare tra gli altri compilatori piu' conosciuti .NET. Il seguente snippet C# entra in stack overflow:</p> <p><strong>using</strong> System;<br /> <br /> <strong>class</strong> Foo {<br />     <strong>public virtual void</strong> Write(<strong>string</strong> s) {<br />         Console.WriteLine("Foo virtual " + s);<br />     }<br /> }<br /> <br /> <strong>class</strong> Bar : Foo {<br />     <strong>public override void</strong> Write(<strong>string</strong> s) {<br />         Console.WriteLine("Bar override " + s);<br />     }<br /> <br />     <strong>public void</strong> Write(<strong>string</strong> s, <strong>params string</strong>[] args) {<br />         Write("Bar overload " + s);<br />     }<br /> }<br /> <br /> <strong>class</strong> Program {<br />     <strong>static void</strong> Main() {<br />         Bar bar = <strong>new</strong> Bar();<br />         bar.Write("Ciao!"); // <font color="#ff0000">Process is terminated due to StackOverflowException</font><br />     }<br /> }</p> <p>mentre per gli altri linguaggi, stampa <em>Bar override Ciao!</em> Di seguito il codice equivalente in Visual Basic .NET, C++/CLI e Visual J#</p> <p><strong>Imports</strong> System<br /> <br /> <strong>Class</strong> Foo<br />     <strong>Public Overridable Sub</strong> Write(<strong>ByVal</strong> s <strong>As String</strong>)<br />         Console.WriteLine("Foo virtual " + s)<br />     <strong>End Sub<br /> End Class<br /> <br /> Class</strong> Bar : <strong>Inherits</strong> Foo<br />     <strong>Public Overrides Sub</strong> Write(<strong>ByVal</strong> s <strong>As String</strong>)<br />         Console.WriteLine("Bar override " + s)<br />     <strong>End Sub<br /> <br />     Public Overloads Sub</strong> Write(<strong>ByVal</strong> s <strong>As String</strong>, <strong>ParamArray</strong> args <strong>As String</strong>())<br />         Write("Bar overload " + s)<br />     <strong>End Sub<br /> End Class<br /> <br /> Module</strong> Program<br />     <strong>Sub</strong> Main<br />         <strong>Dim</strong> bar <strong>As</strong> Bar = <strong>New</strong> Bar<br />         bar.Write("Ciao") ' stampa <font color="#ff0000">Bar override Ciao!</font><br />     <strong>End Sub<br /> End Module</strong></p> <p><strong>using namespace</strong> System;<br /> <br /> <strong>ref class</strong> Foo {<br />     <strong>public</strong>:<br />     <strong>virtual void</strong> Write(String^ s) {<br />         Console::WriteLine("Foo virtual " + s);<br />     }<br /> };<br /> <br /> <strong>ref class</strong> Bar : Foo {<br />     <strong>public</strong>:<br />     <strong>virtual void</strong> Write(String^ s) <strong>override</strong> {<br />         Console::WriteLine("Bar override " + s);<br />     }<br /> <br />     <strong>void</strong> Write(String^ s, ... <strong>array</strong>&lt;String^&gt;^ args) {<br />         Write("Bar overload " + s);<br />     }<br /> };<br /> <br /> <strong>int</strong> main() {<br />     Bar^ bar = <strong>gcnew</strong> Bar;<br />     bar-&gt;Write("Ciao!"); // stampa <font color="#ff0000">Bar override Ciao!</font><br /> };</p> <p><strong>import</strong> System.*;<br /> <br /> <strong>class</strong> Foo {<br />     <strong>public void</strong> Write(String s) {<br />         Console.WriteLine("Foo virtual " + s);<br />     }<br /> }<br /> <br /> <strong>class</strong> Bar <strong>extends</strong> Foo {<br />     <strong>public void</strong> Write(String s) {<br />         Console.WriteLine("Bar override " + s);<br />     }<br />     <strong>public void</strong> Write(String s, /** @attribute ParamArray() */ String[] args) {<br />         Write("Bar overload " + s);<br />     }<br /> }<br /> <br /> <strong>class</strong> Program {<br />     <strong>public static void</strong> main(String[] args) {<br />         Bar bar = <strong>new</strong> Bar();<br />         bar.Write("Ciao"); // stampa <font color="#ff0000">Bar override Ciao!</font><br />     }<br /> }</p> <p>Ho sempre considerato C# come linguaggio "centrale" di .NET, una chiave per capire meglio lo spirito della piattaforma - percio' mi meraviglio quando trovo comportamenti in C# che sono piuttosto l'eccezione anziche' la regola rispetto agli altri linguaggi .NET. A voi quale comportamento sembra piu' corretto/intuitivo?</p><img src="http://blogs.ugidotnet.org/adrian/aggbug/94595.aspx" width="1" height="1" /> Adrian Florea http://blogs.ugidotnet.org/adrian/archive/2008/11/10/quando-c-e-piuttosto-leccezione-che-la-regola.aspx Mon, 10 Nov 2008 23:46:00 GMT http://blogs.ugidotnet.org/adrian/archive/2008/11/10/quando-c-e-piuttosto-leccezione-che-la-regola.aspx#feedback 225 http://blogs.ugidotnet.org/adrian/comments/commentRss/94595.aspx http://blogs.ugidotnet.org/adrian/services/trackbacks/94595.aspx Quiz Sharp #71 [override/overload] http://blogs.ugidotnet.org/adrian/archive/2008/11/09/quiz-sharp-71-overrideoverload.aspx <p><a href="http://blogs.ugidotnet.org/WamBlog/archive/2008/11/01/c-uno-strano-comportamento-con-loverride.aspx">Questo post</a> di Diego Martelli, fattomi notare da un amico, riesce secondo me a sorprendere un comportamento interessante di C#, ovvero il seguente snippet di codice entra in <em>stack overflow</em>:</p> <p><strong>using</strong> System;<br /> <br /> <strong>class</strong> Foo {<br />     <strong>public virtual void</strong> Write(<strong>string</strong> s) {<br />         Console.WriteLine("Foo virtual " + s);<br />     }<br /> }<br /> <br /> <strong>class</strong> Bar : Foo {<br />     <strong>public override void</strong> Write(<strong>string</strong> s) {<br />         Console.WriteLine("Bar override " + s);<br />     }<br /> <br />     <strong>public void</strong> Write(<strong>string</strong> s, <strong>params string</strong>[] args) {<br />         Write("Bar overload " + s);<br />     }<br /> }<br /> <br /> <strong>class</strong> Program {<br />     <strong>static void</strong> Main() {<br />         Bar bar = <strong>new</strong> Bar();<br />         bar.Write("Ciao!");<br />     }<br /> } </p> <p>Probabilmente molti si aspetterebbero che venisse stampato "<strong>Bar override Ciao!</strong>" a console e invece il metodo chiamato e' il <em>Write</em> con l'elenco variabile di parametri e non il metodo in override. Questo comportamento e' dovuto, secondo me, al fatto che abbiamo istanziato <em>bar</em> come:</p> <p>Bar bar = <strong>new</strong> Bar();</p> <p>e non come:</p> <p>Foo bar = <strong>new</strong> Bar();</p> <p>Il metodo <em>Write</em> in override nella classe <em>Bar</em> non fa altro che <em>specializzare</em> il metodo virtuale della classe base <em>Foo</em>, percio' perde nella gara dei metodi in overload della classe <em>Bar</em> perche' <em>Write</em> nella sua <em>forma espansa</em> (ECMA-334, 14.4.2.1) ha un parametro di tipo string e zero elementi nell'array di parametri.</p> <p>Detto questo, ecco il mio quiz: Cosa stampa questo snippet a console?</p> <p><strong>using</strong> System;<br /> <br /> <strong>class</strong> Foo {<br />     <strong>public override string</strong> ToString() {<br />         <strong>return</strong> "override ";<br />     }<br />     <strong>public string</strong> ToString(<strong>params string</strong>[] args) {<br />         <strong>return</strong> "overload ";<br />     }<br /> }<br /> <br /> <strong>class</strong> Program {<br />     <strong>static void</strong> Main() {<br />         Foo foo = <strong>new</strong> Foo();<br />         Console.Write(foo);<br />         Console.WriteLine(foo.ToString());<br />     }<br /> }</p> <p> </p> <ul> <li><strong>A</strong>: override override </li> <li><strong>B</strong>: override overload </li> <li><strong>C</strong>: overload overload </li> </ul> <p> </p> <p>:-)</p><img src="http://blogs.ugidotnet.org/adrian/aggbug/94564.aspx" width="1" height="1" /> Adrian Florea http://blogs.ugidotnet.org/adrian/archive/2008/11/09/quiz-sharp-71-overrideoverload.aspx Sun, 09 Nov 2008 11:14:21 GMT http://blogs.ugidotnet.org/adrian/archive/2008/11/09/quiz-sharp-71-overrideoverload.aspx#feedback 311 http://blogs.ugidotnet.org/adrian/comments/commentRss/94564.aspx http://blogs.ugidotnet.org/adrian/services/trackbacks/94564.aspx Quiz Sharp #70 http://blogs.ugidotnet.org/adrian/archive/2008/05/18/quiz-sharp-70.aspx <p>Senza utilizzare stringhe, caratteri, numeri (<em>literals</em>) o file esterni, si chiede di scrivere un programma in C# 3.0 che stampi a console la definizione compilabile di un tipo non vuoto.</p><img src="http://blogs.ugidotnet.org/adrian/aggbug/92726.aspx" width="1" height="1" /> Adrian Florea http://blogs.ugidotnet.org/adrian/archive/2008/05/18/quiz-sharp-70.aspx Sun, 18 May 2008 07:22:45 GMT http://blogs.ugidotnet.org/adrian/archive/2008/05/18/quiz-sharp-70.aspx#feedback 105 http://blogs.ugidotnet.org/adrian/comments/commentRss/92726.aspx http://blogs.ugidotnet.org/adrian/services/trackbacks/92726.aspx Quiz Sharp #69 http://blogs.ugidotnet.org/adrian/archive/2008/04/08/92115.aspx Scrivete una proprieta' in cui il body del getter non contenga <strong>return</strong> o <strong>throw</strong>.<img src="http://blogs.ugidotnet.org/adrian/aggbug/92115.aspx" width="1" height="1" /> Adrian Florea http://blogs.ugidotnet.org/adrian/archive/2008/04/08/92115.aspx Tue, 08 Apr 2008 09:22:00 GMT http://blogs.ugidotnet.org/adrian/archive/2008/04/08/92115.aspx#feedback 105 http://blogs.ugidotnet.org/adrian/comments/commentRss/92115.aspx http://blogs.ugidotnet.org/adrian/services/trackbacks/92115.aspx code and solutions (and a resume) http://blogs.ugidotnet.org/adrian/archive/2007/12/11/90219.aspx <p>Via <a href="http://infoarena.ro/blog/olimpicul-de-la-facebook">questo post</a> del mio connazionale <a href="http://infoarena.ro/blog">Cosmin Negruseri</a>, sono venuto a conoscenza di questa idea tanto bella quanto semplice ed efficace: proprio nella <a href="http://www.facebook.com/jobs/index.php">pagina Jobs</a> di Facebook c'e' una <a href="http://www.facebook.com/jobs_puzzles/">sezione di programming puzzles</a> belli tosti, provateli per credere. Ogni problema finisce coll'invito:</p> <blockquote>Please send your code and solutions (and a resume) to { (0xFACEB00C &gt;&gt; 2) in decimal format } @ facebook.com</blockquote> <p>Notate "<em>and a resume</em>" messo tra parentesi, per non dire dell'indirizzo email veramente originale ;) Complimenti!</p> <p>(Oggi faccio gli 'anta ;) Non si scherza piu'!)</p><img src="http://blogs.ugidotnet.org/adrian/aggbug/90219.aspx" width="1" height="1" /> Adrian Florea http://blogs.ugidotnet.org/adrian/archive/2007/12/11/90219.aspx Tue, 11 Dec 2007 02:38:41 GMT http://blogs.ugidotnet.org/adrian/archive/2007/12/11/90219.aspx#feedback 272 http://blogs.ugidotnet.org/adrian/comments/commentRss/90219.aspx http://blogs.ugidotnet.org/adrian/services/trackbacks/90219.aspx Quiz Sharp #68 [con smiley] http://blogs.ugidotnet.org/adrian/archive/2007/11/18/89780.aspx <p>Questo snippet (di cui manca un pezzo) si esegue in Visual Studio premendo F5 e rimane fermo al breakpoint definito nel codice del metodo <em>Main</em>. Muovendo poi lentamente il mouse sulla finestra dello snippet in Visual Studio, si nota che a volte viene stampato uno smiley <strong>:-)</strong> a console.</p> <p><strong>class</strong> Quiz {<br />     // da completare<br />     <strong>static</strong> <strong>void</strong> Main() {<br />         System.Diagnostics.Debugger.Break(); // breakpoint<br />     }<br /> } </p> <p>Si chiede di completare il codice che manca.</p><img src="http://blogs.ugidotnet.org/adrian/aggbug/89780.aspx" width="1" height="1" /> Adrian Florea http://blogs.ugidotnet.org/adrian/archive/2007/11/18/89780.aspx Sun, 18 Nov 2007 11:12:53 GMT http://blogs.ugidotnet.org/adrian/archive/2007/11/18/89780.aspx#feedback 38 http://blogs.ugidotnet.org/adrian/comments/commentRss/89780.aspx http://blogs.ugidotnet.org/adrian/services/trackbacks/89780.aspx Quiz #67 [triple wrapping exceptions] http://blogs.ugidotnet.org/adrian/archive/2007/11/03/89396.aspx <p>Senza utilizzare alcun <strong>throw</strong>, completate il seguente snippet in tal modo che il <strong>catch</strong> stampi <strong>Ciao!</strong> a console e tutte e tre le inner exception devono essere di tipi diversi:</p> <p><strong>using</strong> System;<br /> <br /> <strong>class</strong> Quiz {<br />     // ... da completare<br /> <br />     <strong>static</strong> <strong>void</strong> Main() {<br />         <strong>try</strong> {<br />             // ... da completare<br />         }<br />         <strong>catch</strong> (Exception e) {<br />             <strong>if</strong>(<font face="Arial">e.InnerException != <strong>null</strong> &amp;&amp; e.InnerException.InnerException != <strong>null</strong> &amp;&amp; e.InnerException.InnerException.InnerException != <strong>null</strong></font>) {<br />                 Console.WriteLine("Ciao!");<br />             }<br />         }<br />     }<br /> } </p><img src="http://blogs.ugidotnet.org/adrian/aggbug/89396.aspx" width="1" height="1" /> Adrian Florea http://blogs.ugidotnet.org/adrian/archive/2007/11/03/89396.aspx Sat, 03 Nov 2007 23:42:23 GMT http://blogs.ugidotnet.org/adrian/archive/2007/11/03/89396.aspx#feedback 36 http://blogs.ugidotnet.org/adrian/comments/commentRss/89396.aspx http://blogs.ugidotnet.org/adrian/services/trackbacks/89396.aspx Quiz Sharp #66 [junior] http://blogs.ugidotnet.org/adrian/archive/2007/09/24/88514.aspx <p>Questi due snippet compilano senza errori o warning e sembrano equivalenti, ma non lo sono:</p> <p> </p><table> <tbody> <tr> <td><strong>using</strong> System;<br /> <br /> <strong>delegate</strong> Foo Foo();<br /> <br /> <strong>class</strong> Test {<br />     <strong>static</strong> Foo Quiz() {<br />         Console.WriteLine("*");<br />         <strong>return</strong> Test.Quiz;<br />     }<br /> <br />     <strong>static</strong> <strong>void</strong> Main() {<br />         Quiz()()();<br />     }<br /> }</td> <td><strong>imports</strong> System<br /> <br /> <strong>delegate</strong> <strong>function</strong> Foo <strong>as</strong> Foo<br /> <br /> <strong>class</strong> Test<br />     <strong>shared</strong> <strong>function</strong> Quiz <strong>as</strong> Foo<br />         Console.WriteLine("*")<br />         <strong>return</strong> Test.Quiz<br />     <strong>end</strong> <strong>function</strong><br /> <br />     <strong>shared</strong> <strong>sub</strong> Main<br />         Quiz()()()<br />     <strong>end</strong> <strong>sub</strong><br /> <strong>end</strong> <strong>class</strong></td> </tr> </tbody> </table> <p>Cosa manca allo snippet VB.NET per essere equivalente a quello C#?</p><img src="http://blogs.ugidotnet.org/adrian/aggbug/88514.aspx" width="1" height="1" /> Adrian Florea http://blogs.ugidotnet.org/adrian/archive/2007/09/24/88514.aspx Mon, 24 Sep 2007 06:44:04 GMT http://blogs.ugidotnet.org/adrian/archive/2007/09/24/88514.aspx#feedback 29 http://blogs.ugidotnet.org/adrian/comments/commentRss/88514.aspx http://blogs.ugidotnet.org/adrian/services/trackbacks/88514.aspx