Subscribe: Web Log di Adrian Florea
http://blogs.ugidotnet.org/adrian/Rss.aspx
Added By: Feedage Forager Feedage Grade B rated
Language: Italian
Tags:
bar override  bar  che  foo  nella  net  override  piu  questo  sono  string  system  void write  void  write string  write 
Rate this Feed
Rate this feedRate this feedRate this feedRate this feedRate this feed
Rate this feed 1 starRate this feed 2 starRate this feed 3 starRate this feed 4 starRate this feed 5 star

Comments (0)

Feed Details and Statistics Feed Statistics
Preview: Web Log di Adrian Florea

Web Log di Adrian Florea



"You know you've achieved perfection in design, not when you have nothing more to add, but when you have nothing more to take away." Antoine de Saint-Exupery



Copyright: Adrian Florea
 



Quiz Sharp #72 [junior]

Thu, 21 May 2009 08:55:14 GMT

Il seguente snippet:

using System;

interface IFoo {
    IFoo GetInstance();
}

partial class Foo : IFoo {
    public IFoo GetInstance() {
        Console.WriteLine("Ciao");
        return this;
    }
}

class Program {
    static void Main() {
        (new Foo()).GetInstance().GetInstance();
    }
}

stampa:

Ciao
Ciao

a console. Senza toccare lo snippet ma solo aggiungendone un pezzo, dobbiamo stampare a console:

Ciao
UGIdotNET
Ciao

(image)



Corso Sql Server 2008 Express per gli insegnanti arrivati all'ONI2009

Tue, 14 Apr 2009 16:36:52 GMT

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 successione di Fibonacci fatta in SQL...

with fibonacci(f, g) as (
    select 0, 1
    union all
    select f + g, f + g + g
    from fibonacci
    where f + g < 100
)
select f
from fibonacci
union all
select g
from fibonacci
order by 1

per tenerli svegli ;-) Hanno ricevuto con interesse il compito a casa di risolvere il rompicapo delle otto regine sempre via CTE :-) Molto gradito e' stato anche l'argomento sul nuovo tipo hierarchyid perche' abbastanza vicino al loro lavoro (algoritmi, alberi, etc.). Li sono piaciuti anche i nuovi tipi geography e geometry 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.

(image)



MVC versus Document/View in MFC

Fri, 03 Apr 2009 19:18:48 GMT

Sto leggendo il bellissimo libro di Dino & Andrea, "Microsoft .NET: Architecting Applications for the Enterprise" e mi ha incuriosito questa loro osservazione alla pagina 362: "[...] Microsoft Foundation Classes (MFC) offered more than a decade ago an architecture with some points in common with MVC - particularly, the Document/View (DV) model. DV can be seen as a version of MVC where the view and controller are fused together. We really don't know whether the MFC team intentionally discarded MVC to embrace DV; our feeling, however, is that DV blossomed autonomously during the design by simply applying correctly and diffusely the SoC principle".

Sembra che alla PDC del 1995, un membro del team di MFC abbia raccontato proprio la storia del "MVC versus DV" nella scelta architetturale di MFC: "[...] for the controller’s message mapping mechanism, can’t we just reuse MFC’s message map solution? Ideally, yes. But there is one big problem here... A separate controller class for message handlers may sound like a good idea, but MFC was designed in such a way that this was thought impossible. MFC allows commands such as menu picks to be rerouted to non-windows, but not windows messages such as mouse clicks. In MFC, only a CWnd can receive windows messages and only one instance of a CWnd can receive the messages for a real Windows window. Since a controller is meant to be a non-window that can handle windows messages and exist in multiple instances per window, we seem to be stuck! An interesting aside, this problem was sited by an original MFC team member as the main reason Microsoft emulated MVC for the CDocument and CView, but stopped short of implementing a controller (MFC Professional Developers Conference, 1995)". Interessante...

(image)



Vita da service pack

Thu, 26 Mar 2009 12:40:42 GMT

Ho scoperto una cosa a mio parere strana: un metodo (System.Web.UI.WebControls.ParameterCollection.Add(String, DbType, String)) che esiste solo nelle versioni service pack del framework .NET (2.0 SP2, 3.0 SP2, 3.5 SP1) ma non nelle versioni "normali". Mi chiedo come mai se il metodo e' stato introdotto in .NET 2.0 SP2, l'abbiano tolto dalle .NET 3.0 e .NET 3.0 SP1 per reintrodurlo nella .NET 3.0 SP2 per poi toglierlo di nuovo dalla .NET 3.5 e finalmente reintrodurlo nella .NET 3.5 SP1???...

[OT] Per i tanti amici milanesi: sono a Milano dall'8 di marzo e torno in Romania settimana prossima, probabilmente mercoledi' - se vi fa piacere magari si organizza un pranzo o una cena!

(image)



Sul cast del foreach

Wed, 14 Jan 2009 09:11:13 GMT

Nel suo post di ieri, "foreach l'insidioso", Luca si e' chiesto come mai il seguente snippet:

using System.Collections.Generic;

interface IPersistent { }
class Invoice : IPersistent { }
class Order : IPersistent { }

class Program {
    static void Main() {
        List changedDocuments = new List();
        changedDocuments.Add(new Invoice());
        changedDocuments.Add(new Order());
        foreach (Invoice changedInvoice in changedDocuments) { }
    }
}

compili. Secondo me, il comportamento del compilatore e' giusto, voluto e documentato. Le specifiche del linguaggio (15.8.4, ECMA-334), dicono:

"A foreach statement of the form

foreach(V v in x) embedded-statement

is then expanded to:

{
    E e = ((C)(x)).GetEnumerator();
    try {
        V v;
        while (e.MoveNext()) {
            v = (V)(T)e.Current;
            embedded-statement
        }
    }
    finally {
        … // Dispose e
    }
}

The variable e is not visible to or accessible to the expression x or the embedded statement or any other source code of the program. The variable v is read-only in the embedded statement. If there is not an explicit conversion from T (the element type) to V (the type in the foreach statement), an error is produced and no further steps are taken."

Quindi e' la responsabilita' del programmatore quella di assicurarsi che il cast sia valido. Potremmo volere per esempio fare un foreach su tutte le Label nella ControlCollection dei Controls di una Form - sara' il nostro compito quello di "filtrare" gli elementi di tipo Label e fare il foreach soltanto su questi, oppure assicurarsi che nella Controls ci sono solo Label. Perche' il compilatore non ci aiuta? Probabilmente perche' la lista potrebbe essere costruita anche altrove!

In ogni caso, se cerchiamo un aiuto da parte dell'intellisense e del compilatore, possiamo sostituire il foreach nello snippet di Luca, con:

changedDocuments.ForEach(delegate(IPersistent persistent) { });

Sorprendemente, otteniamo anche un codice IL piu' piccolo rispetto alla variante con foreach. Il type parameter dell'argomento action del metodo ForEach, e' vincolato ora ad essere identico al type parameter della nostra List, cioe' IPersistent.

(image)



3rd Italian MDA Forum

Fri, 21 Nov 2008 09:15:24 GMT

Salire sul palco a parlare di DSL Tools subito dopo Richard Mark Soley, Stephen J. Mellor e Michael Rosen, giuro che non e' stato facile :) Ottima l'organizzazione dell'evento, nel cinquecentesco Palazzo delle Stelline, tante discussioni interessantissime sull'MDA, modellizzazione e generazione di codice. Giornata davvero speciale!

(image)



Quando C# e' piuttosto l'eccezione che la regola

Mon, 10 Nov 2008 21:46:00 GMT

Il comportamento del compilatore C#, presentato prima qui da Diego e poi nel mio post precedente, sembra singolare tra gli altri compilatori piu' conosciuti .NET. Il seguente snippet C# entra in stack overflow: using System; class Foo {     public virtual void Write(string s) {         Console.WriteLine("Foo virtual " + s);     } } class Bar : Foo {     public override void Write(string s) {         Console.WriteLine("Bar override " + s);     }     public void Write(string s, params string[] args) {         Write("Bar overload " + s);     } } class Program {     static void Main() {         Bar bar = new Bar();         bar.Write("Ciao!"); // Process is terminated due to StackOverflowException     } } mentre per gli altri linguaggi, stampa Bar override Ciao! Di seguito il codice equivalente in Visual Basic .NET, C++/CLI e Visual J# Imports System Class Foo     Public Overridable Sub Write(ByVal s As String)         Console.WriteLine("Foo virtual " + s)     End Sub End Class Class Bar : Inherits Foo     Public Overrides Sub Write(ByVal s As String)         Console.WriteLine("Bar override " + s)     End Sub     Public Overloads Sub Write(ByVal s As String, ParamArray args As String())         Write("Bar overload " + s)     End Sub End Class Module Program     Sub Main         Dim bar As Bar = New Bar         bar.Write("Ciao") ' stampa Bar override Ciao!     End Sub End Module using namespace System; ref class Foo {     public:     virtual void Write(String^ s) {         Console::WriteLine("Foo virtual " + s);     } }; ref class Bar : Foo {     public:     virtual void Write(String^ s) override {         Console::WriteLine("Bar override " + s);     }     void Write(String^ s, ... array^ args) {         Write("Bar overload " + s);     } }; int main() {     Bar^ bar = gcnew Bar;     bar->Write("Ciao!"); // stampa Bar override Ciao! }; import System.*; class Foo {     public void Write(String s) {         Console.WriteLine("Foo virtual " + s);     } } class Bar extends Foo {     public void Write(String s) {         Console.WriteLine("Bar override " + s);     }     public void Write(String s, /** @attribute ParamArray() */ String[] args) {         Write("Bar overload " + s);     } } class Program {     public static void main(String[] args) {         Bar bar = new Bar();         bar.Write("Ciao"); // stampa Bar override Ciao!     } } 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?[...]



Quiz Sharp #71 [override/overload]

Sun, 09 Nov 2008 09:14:21 GMT

Questo post 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 stack overflow:

using System;

class Foo {
    public virtual void Write(string s) {
        Console.WriteLine("Foo virtual " + s);
    }
}

class Bar : Foo {
    public override void Write(string s) {
        Console.WriteLine("Bar override " + s);
    }

    public void Write(string s, params string[] args) {
        Write("Bar overload " + s);
    }
}

class Program {
    static void Main() {
        Bar bar = new Bar();
        bar.Write("Ciao!");
    }
}

Probabilmente molti si aspetterebbero che venisse stampato "Bar override Ciao!" a console e invece il metodo chiamato e' il Write con l'elenco variabile di parametri e non il metodo in override. Questo comportamento e' dovuto, secondo me, al fatto che abbiamo istanziato bar come:

Bar bar = new Bar();

e non come:

Foo bar = new Bar();

Il metodo Write in override nella classe Bar non fa altro che specializzare il metodo virtuale della classe base Foo, percio' perde nella gara dei metodi in overload della classe Bar perche' Write nella sua forma espansa (ECMA-334, 14.4.2.1) ha un parametro di tipo string e zero elementi nell'array di parametri.

Detto questo, ecco il mio quiz: Cosa stampa questo snippet a console?

using System;

class Foo {
    public override string ToString() {
        return "override ";
    }
    public string ToString(params string[] args) {
        return "overload ";
    }
}

class Program {
    static void Main() {
        Foo foo = new Foo();
        Console.Write(foo);
        Console.WriteLine(foo.ToString());
    }
}

 

  • A: override override
  • B: override overload
  • C: overload overload

 

:-)

(image)



IDisposable e le partial class

Thu, 02 Oct 2008 00:23:15 GMT

Oggi, parlando con il mio collega Daniel, e' uscita fuori una situazione interessante. Supponiamo che avete un tool che vi genera una classe partial che implementa IDisposable:

using System;

partial class Foo : IDisposable {
    public void Dispose() {
        Console.WriteLine("implicit");
    }
}

Se volete cambiare il comportamento del Dispose senza toccare il codice generato sopra, basta implementare esplicitamente l'interfaccia IDisposable:

using System;

partial class Foo {
    void IDisposable.Dispose() {
        Console.WriteLine("explicit");
    }
}

A questo punto uno using(Foo foo = new Foo()){} stampera' explicit a console, anziche' implicit.

(image)



Microsoft Community Influencer

Sun, 14 Sep 2008 16:41:54 GMT

Sono tornato ieri sera dal fantastico Microsoft Community Bootcamp dove ho avuto il grande onore di essere nominato Microsoft Community Influencer, un programma locale di Microsoft Romania con cui sono state premiate un numero quasi doppio di persone rispetto al piu' conosciuto programma MVP. La gioia del riconoscimento e quella di passare due splendide giornate in compagnia di tutti i Developer Evangelist, MVP, Community Influencer e Student Partner rumeni e' stata grande quanto la sorpresa. Insieme abbiamo messo a punto un piano per un impegno piu' efficace del nostro contributo perche' la voglia di fare si vedeva negli occhi di tutti. Ringrazio i nuovi amici per avermi ricevuto nella loro famiglia e ovviamente tutti voi per avermi insegnato in tanti anni cosa vuol dire community!

(image)



Axioms for software architects by software architects

Mon, 08 Sep 2008 02:05:17 GMT

Via questo post di Neal Ford sono arrivato a questo saggissimo wiki: 97 Things Every Software Architect Should Know. Assolutamente da non perdere! Tre dei principi li ho gia' aggiunti alla mia collezione sulla semplicita'.

[OT]: Venerdi' organizziamo il secondo workshop dello user group locale, RONUA Galati, con due presentazioni sullo stesso difficile tema: un'introduzione a DSL Tools e un'altra a VSX. Guardate quanta gente e' venuta al primo workshop, tenuto a maggio! Incredibile... Poi sono stato invitato a partecipare questo weekend insieme a tutti gli MVP e Microsoft Influencer rumeni alla quinta edizione di Microsoft Community Bootcamp, organizzata da Microsoft Romania in montagna, ottima opportunita' di conoscerci tutti insieme! Presto mettero' da qualche parte le slide e il codice del workshop e vi aggiornero' su come e' andata al bootcamp - scusate la parte off-topic del post...

(image)



How I got Started in Software Development

Tue, 15 Jul 2008 05:09:01 GMT

Taggato da Gianluca, ecco le mie risposte:

A quale età hai cominciato a programmare?

A 17 anni, nel lontano agosto del 1985

Come hai cominciato a programmare?

A giugno di quell'anno (23 anni fa...), avevo vinto la fase provinciale di un concorso di comunicazioni scientifiche (sezione matematica) e come premio mi avevano mandato per 2-3 settimane al 1° campo nazionale di informatica in Romania, a Câmpulung Muscel, dove ho avuto la fortuna di conoscere gli autori dei miei manuali di matematica, Gheorghe Rizescu e Octavian Stănăşilă, poi Adrian Petrescu che aveva costruito proprio il computer aMIC su cui ci insegnarono a programmare in BASIC, poi una ragazza bionda con degli enormi occhioni verdi di cui mi innamorai perdutamente ma ebbi il corraggio di dicchiararle subito il mio impossibile amore ;) Partecipai anche i prossimi anni, '86 e '87, al 2° e al 3° campo nazionale di informatica, stavolta a Târgu Mureş dove ho approfondito le mie conoscenze di BASIC ;)

Qual’è stato il tuo primo linguaggio di programmazione?

BASIC

Qual’è stato il primo programma vero che hai scritto?

Il primo "vero" programma non ricordo ma il primo programma in assoluto non lo posso scordare: ero curioso di vedere come la funzione f(x)=(1+1/x)^x tende all'infinito verso il numero di Eulero e quindi le disegnai il grafico.

Quali linguaggi hai usato da quando hai cominciato a programmare?

In ordine temporale: BASIC, FORTRAN, Turbo Pascal, C, dBase IV, Turbo Prolog, C++, Informix NewEra, Object Tcl, Delphi, Informix AppPage, JavaScript, Informix 4GL, Java, C#, VB.NET

Quando è stato il tuo primo vero lavoro da programmatore?

Direi nel 1996 (dal '92 al '96 ho fatto piu' matematica che informatica, come ricercatore)

Con il senno di poi, rifaresti lo stesso il programmatore? Ricominceresti a programmare?

Non so, probabilmente no.

Se ci fosse una cosa che hai imparato nella tua carriera e che vorresti dire ai giovani programmatori, cosa diresti?

Leggere prima la documentazione... ;)

Qual’è la cosa più divertente che hai programmato?

type foo.cs > foo.cs
csc /t:library foo.cs

Adesso è l’ora di taggare qualcun’altro...

Luca Minudel
Gian Maria Ricci
Michele Bernardi
Matteo Spreafico

(image)



End tag required for HTML SCRIPT element

Mon, 14 Jul 2008 00:23:53 GMT

Magari lo sanno tutti ma io ci ho perso mezz'ora per capire dove sta l'errore:

e