- I generics in VB .Net -
 
COSA SERVE PER QUESTO TUTORIAL
 Download | Chiedi sul FORUM | Glossario conoscenze basiche di VB .Net
Generics: liste, dizionari e utilizzo di classi e procedure generiche

UN ESEMPIO APPLICATIVO DI GENERICS: LISTE E DIZIONARI
Generics, l'operatore Of e le classi List e Dictionary

La versione 2.0 del Framework .Net introduce, tra gli altri, un nuovo importante concetto: quello dei generics. I generics sono in sostanza paragonabili ai template di C++: permettono di utilizzare classi e metodi fornendogli anche un tipo come parametro. Vediamo subito un esempio per chiarire il concetto:


Dim listaDiStringhe As New List(Of String)(2)
listaDiStringhe.Add("prima stringa")
listaDiStringhe.Add("seconda stringa")

Dim listaDiInteri As New List(Of Integer)(2)
listaDiInteri.Add(1)
listaDiInteri.Add(2)

Si noti la sintassi di New: prima dei parametri del costruttore (in questo caso il 2, la capacità iniziale della lista) è stato specificato tra parentesi il nuovo operatore Of seguito prima da String e in seguito da Integer. List (System.Collections.Generic.List) è una classe molto semplice ma efficace, permette infatti di creare liste dinamiche (ovvero una sorta di array dal quale è possibile aggiungere, rimuovere e inserire elementi in qualunque momento) di qualsiasi genere: l'uso dei generics (denotato dall'operatore Of) lo rende infatti indipendente dal tipo di dati che la lista deve contenere. Questo risulta molto utile in alcune occasioni e risolve problemi altrimenti aggirabili solamente creando una classe per ogni tipo di dati oppure tramite l'uso di Object, procedura assai inelegante. Infatti prima dell'introduzione dei generics erano diffuse classi del tipo StringList e StringDictionary (ancora disponibili in System.Collections.Specialized), oggi rimpiazzate dal codice precedente per StringList e da quanto segue per StringDictionary:


'Un dizionario di stringhe con chiave numerica
Dim dizionario As New Dictionary(Of Integer, String)
dizionario.Add(216, "contenuto")
Console.WriteLine(dizionario(216))

Abbiamo qui creato un nuovo dizionario (System.Collections.Generic.Dictionary) le cui chiavi sono numeri interi e il contenuto stringhe.

UN ESEMPIO DI CLASSE CHE UTILIZZA I TEMPLATE
Timeout, sessioni cookieless e locazione dei dati memorizzati

Vediamo a questo punto come possiamo realizzare una classe che fa uso dei generics:


Public Class ClasseGenerica(Of ParametroDiTipo)
    Public Function GetName() As String
        Return GetType(ParametroDiTipo).Name
    End Function
End Class

Questa semplice classe prende un parametro di tipo che viene identificato come ParametroDiTipo; esso può essere qualsiasi cosa, da Object a String, a Integer ad una struttura o altro. La funzione GetName non fa altro che restituirne il nome. Vediamo una riga di codice che stamperebbe il nome della classe:

Console.WriteLine( ( New ClasseGenerica(Of String) ).GetName() )

Si noti che è anche possibile usare i generics anche solamente su un metodo, ad esempio:


Public Function GetName(Of ParametroDiTipo)() As String
    Return GetType(ParametroDiTipo).Name
End Function

può essere richiamata tramite la seguente sintassi:

Console.WriteLine( GetName(Of Integer)() )

CONFIGURAZIONE DELLE SESSIONI IN ASP.NET
Timeout, sessioni cookieless e locazione dei dati memorizzati

Vediamo ora come è possibile applicare restrizioni al tipo di dati passato ad una classe generica.


Public Function GetNameBis(Of ParametroDiTipo As MiaClasse)() As String
    Return GetType(ParametroDiTipo).Name
End Function

Rispetto alla funzione precedente (GetName) è stato aggiunto As MiaClasse di seguito alla dichiarazione di un parametro di tipo: in questo modo è stato imposto che il tipo che viene passato deve essere o ereditare la classe MiaClasse. Al posto di una classe si potrebbero specificare un'interfaccia (costringendo a passare tipi che la implementino) oppure una delle seguenti parole chiave:

  • Class: il parametro di tipo deve essere una classe;
  • Structure: il parametro di tipo deve essere una struttura o un tipo di dati semplice come Integer;
  • New: il parametro di tipo deve essere dotato di un costruttore privo di parametri;

Queste restrizioni possono anche essere combinate tra loro come segue:


Public Sub SalutaCon(Of ParametroDiTipo As {MiaInterfaccia, Class, New})()
    Dim ClasseIgnota As New ParametroDiTipo()
    ClasseIgnota.Saluta()
End Sub

Nota: la parola chiave New in una lista di restrizioni, se presente, deve sempre apparire per ultima.
Questo codice richiede come parametro una classe che sia che implementi MiaInterfaccia e che sia dotata di un costruttore privo di parametri. Grazie all'ultima restrizione (New) possiamo richiamare con sicurezza New su ParametroDiTipo e quindi invocare Saluta(), metodo definito nell'interfaccia MiaInterfaccia. Di seguito riportiamo MiaInterfaccia e la classe MiaClasse che la implementa.


Class MiaClasse
    Implements MiaInterfaccia

    Public Sub New()
        'Nulla da fare
    End Sub

    Public Sub Saluta() Implements MiaInterfaccia.Saluta
        Console.WriteLine("Ciao!")
    End Sub
End Class

Interface MiaInterfaccia
    Sub Saluta()
End Interface

Per richiamare il metodo è sufficiente il codice seguente:

SalutaCon(Of MiaClasse)()
<< INDIETRO by VeNoM00