Marco Russo

.NET, Business Intelligence e dintorni

News

Microsoft SQL Server & Business Intelligence Conference 2012

Torino Technologies Grou

Corsi

Libri

Miei blog in inglese

Archives

Best practice per l'uso di local type inference

C# 3.0 introduce un costrutto sintattico che consente di inferire il tipo di una variabile nella sua dichiarazione in base al tipo dell'espressione di inizializzazione. In pratica:

string s = "Marco";
string x = s;

si può scrivere:

var s = "Marco";
var x = s;

Come sempre, il fatto che una cosa si possa fare non significa che la si debba fare sempre. La keyword var nasce per supportare costrutti sintattici particolari in C# 3.0, ma può avere un uso più ampio.

Ho pubblicato un post in inglese in cui descrivo una serie di regole pratiche che varrebbe la pena di seguire - siccome sto cercando feedback a riguardo (si tratta di considerazioni più o meno soggettive) segnalo anche qua la richiesta...

Comments

Riccardo said:

"Come sempre, il fatto che una cosa si possa fare non significa che la si debba fare sempre".

D'accordo. Peccato che poi qualcuno comunque la farà. In genere - per la legge di Murphy -  chi la fa è quello che poi non mantiene il codice. Sarò di vecchia scuola - o forse solo oramai tecnologicamente rimbambito -  ma continuo a preferire il type checking statico.

# settembre 18, 2007 5:09

marco.pappalepore said:

ciao Marco,

 rispondo qui perchè non ho tempo di registrarmi di là...

Personalmente penso che alla fine prevalgano i costrutti che richiedono meno energia per essere digitati(quindi più brevi, e magari con la stessa parola usata più volte come "var"). Se non causano errori nell'esecuzione, non causano gravi ambiguità o fraintendimenti nel codice, per la loro sinteticità diventano più comodi da usare, e alla lunga l'abitudine a servirsene si diffonde. In altre parole, ritengo che quando ci sono queste alternative avvenga esattamente come per i costrutti linguistici nel linguaggio naturale, che è in continua evoluzione e si modella ed "erode" sempre nelle configurazioni espressive più economiche e sintetiche.

Non mi è del tutto chiaro perchè uno non dovrebbe scrivere

var customer = new Customer();

o

var numbers = new Int[]{1, 3, 5, 9};

Nel primo caso è forse perchè uno potrebbe dichiarare customer di un tipo più in su nella gerarchia ?

e per gli interi qual è il motivo ?

Grazie, ciao,

         Marco

# settembre 25, 2007 4:11

marco said:

Per gli interi nessun motivo, però considera che:

var x = 5;

può essere ambiguo (int? long? short? quale era l'intenzione?)

mentre

var x = new int[] {1, 3, 5, 9};

non ha alcuna ambiguità.

Come dici, l'esempio di un tipo reference si porta dietro implicazioni sull'ereditarietà. Al solito, il problema è l'intenzione. Considerando che stai istanziando una variabile locale (e non un membro di una classe) tutto sommato non escluderei che scrivere:

var customer = new Customer();

sia altrettanto leggibile che:

Customer customer = new Customer();

specialmente se dopo questa linea ne seguono poche altre prima di chiudere la funzione.

Grazie per i feedback, è proprio quello che cercavo.

Marco

# settembre 25, 2007 7:46