Introduzione a C# 3.0

3 pagine in totale: <<Indietro 1 [2] 3 Avanti >>

Array tipizzati implicitamente

La sintassi per la creazione di array viene estesa con una nuova forma che consente di dichiarare array composti da elementi il cui tipo è ricavato tramite type inference. In questa modalità di dichiarazione il tipo di tutti gli elementi dell'array deve essere lo stesso (o comunque implicitamente convertibile); l'utilizzo di tipi eterogenei o per i quali non è possibile eseguire un cast implicito, produce un errore in fase di compilazione.

Gli esempi seguenti mostrano alcuni casi significativi di utilizzo della sintassi.

var numbers = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // int[]
var values = new[] { 1, 1.5, 2, 2.5, 3, 3.5, 4 }; // double[]
var names = new[] { "Daniele", "Riccardo" }; // string[]
var set = new[] { 1, "A", 2, "B", 3, "C" }; // Errore

Inizializzatori di oggetti e collezioni

In un'ottica di riduzione della verbosità del codice, oltre alle proprietà automatiche, C# 3.0 introduce una nuova sintassi molto compatta per l'inizializzazione di oggetti e collezioni.

Nel caso degli oggetti l'inizializzazione utilizza la parola chiave new seguita dal nome del tipo e da un elenco di coppie proprietà/valore separate da una virgola e racchiuse in una coppia di parentesi graffe. Riprendendo l'esempio visto in precedenza, la sintassi per la creazione di una istanza della classe Contact con inizializzazione delle proprietà è la seguente:

var c = new Contact {
    ID=1,
    FirstName="Riccardo",
    LastName="Golia",
    PhoneNumber="1234567890",
    EmailAddress="riccardo.domain.com"
  };

La forma sintattica appena vista è del tutto equivalente all'invocazione del costruttore di default di Contact, seguita dall'inizializzazione di ciascun membro della classe con il valore corrispondente.

Nel caso delle collezioni, ossia di tutti i tipi che implementano l'interfaccia System.Collections.Generic.ICollection, è possibile operare l'inizializzazione degli elementi costituenti. In questo caso l'inizializzazione consiste nella sequenza degli inizializzatori di ciascun elemento separati da una virgola. La sequenza è racchiusa in una coppia di parentesi graffe ed è preceduta dalla dichiarazione del tipo. Nel caso di una lista di elementi di tipo Contact, un possibile esempio potrebbe essere il seguente:

var contacts = new Collection<Contact> {
  new Contact {
      ID=1,
      FirstName="Daniele",
      LastName="Bochicchio",
      PhoneNumber="987654321",
      EmailAddress="daniele.domain.com"
    },
  new Contact {
      ID=2,
      FirstName="Cristian",
      LastName="Civera",
      PhoneNumber="135792468",
      EmailAddress="cristian.domain.com"
    },
  new Contact {
      ID=3,
      FirstName="Riccardo",
      LastName="Golia",
      PhoneNumber="123456789",
      EmailAddress="riccardo.domain.com"
    },
  new Contact {
      ID=4,
      FirstName="Stefano",
      LastName="Mostarda",
      PhoneNumber="246813579",
      EmailAddress="stefano.domain.com"
    }
};

Anonymous types

C# 3.0 permette di usare l'operatore new nella definizione di tipi anonimi, caratterizzati dal fatto di non avere un nome identificativo dichiarato esplicitamente (il nome viene comunque generato automaticamente in fase di compilazione). Un anonymous type deriva direttamente dalla classe System.Object ed è composto semplicemente da un insieme di proprietà in lettura e scrittura.

Per definire un anonymous type occorre utilizzare la stessa sintassi vista nel caso degli inizializzatori di oggetti. La sintassi di creazione è infatti caratterizzata dalla dichiarazione di una serie di proprietà il cui tipo viene ricavato tramite type inference in base all'espressione di inizializzazione.

var point = new { X=1, Y=2, Z=3 };

All'interno di un programma possono esistere più variabili assegnate ad un anonymous type e corrispondenti allo stesso tipo. Infatti due dichiarazioni di anonymous types producono lo stesso risultato se nelle due definizioni il nome e il tipo di ciascuna proprietà corrispondono rispettando l'ordine di apparizione. In tal caso è possibile eseguire l'assegnazione tra le due variabili dichiarate come anonime.

var point1 = new { X=21, Y=10, Z=71 };
var point2 = new { X=18, Y=8, Z=5 };
var point3 = new { A=20, B="1", C=67 };
point1 = point2; // Assegnazione valida
point1 = point3; // Errore

Extension methods

Gli extension methods sono metodi statici che possono essere invocati per un particolare tipo come se fossero metodi di istanza e permettono di estendere classi preesistenti con metodi aggiuntivi, sia che i tipi a cui essi si riferiscono siano direttamente inclusi nella BCL del .NET Framework, sia che siano tipi custom creati dallo sviluppatore.

Per dichiarare un extension method occorre modificare la firma di un metodo statico, aggiungendo prima del primo parametro la parola chiave this. Il tipo del primo parametro rappresenta la classe che viene estesa: il metodo statico diventa parte integrante dell'interfaccia e può essere invocato come un normale metodo di istanza.

Per poter utilizzare le estensioni per un particolare tipo occorre fare in modo che esse siano accessibili nel codice. A tal fine si rende necessario l'uso della direttiva using per referenziare il namespace in cui sono incluse le definizioni degli extension methods.

3 pagine in totale: <<Indietro 1 [2] 3 Avanti >>

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.



TUTORIALS


IN EVIDENZA
MISC