Learn & Get
… Ovvero come sopravvivere alla
migrazione da VB6 a VB2005
Perchè .NET ?
Tecnologia nella quale Microsoft ha investito
molto (Tempo e $$$) creata dai migliori
architetti software (MS e non)
Tecnologia alla base di tutti i nuovi prodotti
(da SQL Server 2005 a Windows Vista™)
Standard ISO
E’ il futuro di Microsoft, COM è il passato
Perchè .NET ?
Progetto nato nel 1998 come evoluzione di COM,
Alpha a PDC 2000
Effetto scrivania...
Le applicazioni di oggi hanno necessità diverse
(Connettività, Interazione...)
I linguaggi devono interagire tra loro
Il sistema operativo si è evoluto seguendo una
logica di “espansione”
DLL Hell
Eliminare gli errori del passato (COM)
Perchè .NET ?
Strato software che si interpone tra
l’applicazione e il sistema operativo
Codice MSIL
C#,VB.NET...
.NET Framework
CLR (Garbage Collector,Eccezioni,Multithreading)
BCL (Tipi Base)
Sistema Operativo
(Windows 98/NT/2000/XP/2003/CE e Altri)
Circa 8000 classi...
Vantaggi del .NET Framework
(#1)
Modello di programmazione OOP comune
basta (!?) accessi alle DLL
Utilizzo facilitato
(IUnknown,AddRef,Registrazioni...)
Aggiornamenti facilitati (basta RegSvr32!)
Distribuzione semplificata (XCopy)
Side by Side execution
Codice ottimizzato per la piattaforma di
esecuzione
Codice sicuro in quanto “gestito” (“managed”)
Vantaggi del .NET Framework
(#2)
Integrazione dei linguaggi
(CTS è comune)
Gestione automatica della memoria
(Garbage Collector)
Totalmente gratuito!
http://www.microsoft.com/downloads/details.aspx?FamilyID=fe6f2099-b7b4-4f47a244-c96d69c35dec&DisplayLang=en
Codice IL e Metadati
VB.NET
Compilatore vbc.exe
Codice IL e Metadati
JIT Compiler
Codice x86
RUN!
Codice IL e Metadati
Public Sub Main
Console.WriteLine(“Ciao”)
Console.WriteLine(“A tutti!”)
End Sum
Il JIT Analizza tutti i tipi (oggetti) utilizzati in Main
Riserva una struttura dati per ogni metodo associa un
puntatore ad una funzione JITCompiler
Quando un metodo viene invocato, compila il codice,
aggiorna il puntatore al codice X86 ed esegue il codice
La seconda WriteLine non deve essere ricompilata
Il codice viene compilato “on demand” e ottimizzato
sulla macchina client
.NET Framework blocks
ASP.NET : Web Forms
e servizi
Windows Forms
ADO.NET : Accesso ai dati e XML
BCL - Libreria di classi
Common Language Runtime
Riassumendo...
Redist circa 22 MB
Non supporta Windows 95
Per sviluppare serve Win2000 o superiore
L’attuale versione è la 2.0
Il framework funziona Side-by-Side
Visual Studio 2005 supporta solo il framework 2.0
Non serve per applicazioni ASP.NET (lato client)
Esiste per Linux (Mono)
Esiste per Pocket PC,SmartPhones, Embedded
Su NT serve Sp6a
Richiede IE 5.01 o superiore
Richiede Windows Installer 3.0
VB 2005: Il linguaggio
Attenzione: Non stiamo parlando di VB7
Files .vb
In VB6 ci sono diverse estensioni (cls, frm...)
In VB2005 esiste una sola estensione .vb che può (anche)
contentere più classi e/o moduli.
Il nome della classe non è legato al nome del file
File MyFile1.vb
File MyFile2.vb
Public Class Person
Module MainModule
…
…
End Class
End Module
File MyFile3.vb
Public Class Person2
…
End Class
Module MainModule2
…
End Class
Program EntryPoint
In VB6 un applicativo può partire da un Form o da una
Sub Main
In VB 2005... pure però..
La Sub Main non deve necessariamente stare in un modulo
VB 2005 però, by default, utilizza l’Application Framework
Application Framework
Permette di gestire un applicazione in maniera più semplice
Offre una serie di eventi “tipici” di un applicazione
Startup, Shutdown
StartupNextInstance
UnhandledException
Namespaces
Il compilatore ha bisogno di sapere esattamente quale classe
instanziare
Possono esserci dei conflitti
Sono dei raggruppamenti Logici
I moduli e le classi vivono nei Namespaces
VB Imposta un root namespace
VB.NET definisce degli imports globali
La keyword Imports permette di importare i namespaces
Imports System.IO
Imports Test=System.IO
Permette di evitare di scrivere il percorso completo a un namespace
Posso creare un namespace all’interno di un altro namespace
Usare Global per far riferimento al root namespace
Variabili
Global Variables (usare Shared)
Usare Option Explicit e Option Strict
Dichiarazioni multiple sulla stessa riga
Block scope (cicli For,Do...Loop)
Data Types
Byte (*)
Char (2 bytes) [A“c”]
Boolean (4 bytes)
Short (2 bytes) ex Integer di VB6 (*)
Integer (4 bytes) ex Long di VB6 (*)
Long (8 bytes) (*)
Currency -> Decimal (16 bytes)
Single
Double
Date
Sono Alias dei tipi definiti nel .NET framework
(Int16, Int32...)
(*) Sono sia signed che Unsigned
Per ognuno esiste il relativo operatore di conversione e la classe
Convert.
I tipi unsigned non sono CLS compliant
Nullable Types
Sono Value Types che possono essere Nothing
Dim i As Integer= Nothing ‘Value=0
Dim i As Nullable(Of DateTime)= Nothing ‘Value=Nothing
Sono basati sulla classe generica Nullable
Nullable.GetValueOrDefault()
La properietà HasValue indica se il nullable ha
un valore associato
Data Types - String
Il framework non supporta le stringhe a
lunghezza fissa
VB6
Dim s As String * 20
VB 2005
Dim s As New String(“ “c,20)
Le stringhe sono immutabili
Usate StringBuilder
Usate le costanti ControlChars.X
Inizializzazione
E’ possibile dichiarare e inizializzare con lo
stesso statement.
Dim x As integer=9
Inizializzazione di oggetti
Dim o As Person
O=New Person()
Dim o As New Person() ‘ è identico (In VB6 non lo era)
Assegnazione
Le proprietà di Default non esistono più
Si può usare se la proprietà ha un indice
Set non si usa più
Nuovi operatori
X+=1
X-=1
X*=n
X\=n
Y^=n
s+=“xyz”
Usare & oppure +?
s=s & “ciao”
s=s + ”ciao”
Value Types
Ereditano le caratteristiche da
System.ValueType
Enum, Structures, Integer... Tipi base
Sono memorizzate sullo stack
Memorizzano il valore della variabile
Reference Types
Sono memorizzate nella memoria Heap
Contengono un riferimento alla variabile
Dim s as String=“pippo”
Heap
&H1230
Ciao
&H1235
pippo
...
pluto
Stringhe, Objects
Sono controllati dal Garbage Collector
Attenzione alle assegnazioni
Boxing-Unboxing
E’ la conversione di un value type in un reference type e viceversa
E’ un operazione dispendiosa in termini di prestazioni e memoria
Accade quando si associa un Value Type ad una variabile di tipo
Object
Usare CType() o DirectCast() per convertire
CType tenta la conversione del tipo
DirectCast è più veloce (solo reference types)
TryCast è un operatore di cast che ritorna Nothing se il
casting fallisce
Enum
Simili a VB6
E’ possibile definire il tipo usato dall’Enum
E’ possibile “decorare” un enumerato con
<Flags()>
Il tipo Enum è presente nel framework ed espone
metodi per la gestione degli enum
Parse
GetValues
Array
Sono 0 (zero!) based
Dim k() as Integer(0 to 10)
Il valore usato nella Dim è l’upper bound!
Dim a(3,2) as Integer [Matrici]
Array Initializers
Dim x() as Int32={1,2,3}
Non si può usare ReDim per dimensionare un array
Sono basati sulla classe Array del Framework
Array.Clone
Array.Copy(...)
Strutture
Sono Value Types
In VB6 si usava Type-End Type
In VB 2005 si usa Structure-End Structure
Possono essere viste come classi “leggere”
Possono avere metodi, proprietà ed eventi
Procedure e Funzioni
I Parametri sono ByVal (erano ByRef in VB6)
Si può usare Return per ritornare un valore ad una
funzione
Si possono usare parametri Optional
Supportati solo da VB
Sono un trucchetto per mantenere la compatibilità
IsMissing non esiste più, bisogna dare un default
Usare gli Overloads
Le routines richiedono sempre le parentesi
Cicli e controllo di flusso
VB 2005 offre le versioni cortocircuitate di And e Or
IIF non è cortocircuitata
While/Wend di VB6 diventa While/End While
I cicli For/For Each permettono di dimensionare
la variabile usata nel ciclo
Statement Continue
Gestione degli errori
VB 2005 offre ancora On Error...
Meccanismo obsoleto
Mantenuto per compatibilità
Sostituito dalla gestione strutturata delle eccezioni
Un eccezione è un anomalia che può capitare durante la
vita dell’applicazione
L’anomalia viene segnalata attraverso un oggetto
Exception (o ereditato da esso)
Exception.Message
Exception.Source
Exception.StackTrace
Come faccio a intercettare le eccezioni?
Gestione degli errori : Try-Catch-Finally
Try
...
Catch ex As ArgumentException [When]
...
Catch ex As Exception ‘Generica
...
Finally
...
End Try
Per lanciare da codice un eccezione usare Throw [exception]
E’ possibile passare l’eccezione originale usando InnerException
Le eccezioni vanno indicate dalla più specifica alla generica
Usate l’evento UnHandledException per intercettare eventuali
errori non gestiti
Non lanciate eccezioni inutilmente
Usate Debug->Exceptions per controllare il debugger
My Namespace
My
Application — Application title, version, logs, description, …
Computer
User
Resources
Settings
Forms
— Registry, Printer, Audio, File System, …
— User name, group, domain, …
— Accesso alle risorse di un applicazione
— User e application settings
— Collezione dei form presenti nel progetto
WebServices — Collezione dei web services referenziati
http://msdn.microsoft.com/msdnmag/issues/05/07/My/default.aspx
Visual Studio 2005
Overview
Express
Standard
Simplified
Simplified
Windows or Web Designers
Code Editors and IntelliSense
Programming Languages
Remote Data Access
Mobile Device Development
User Experience
Server Development/Debugging
SQL Server 2005 Development
Application Modeling,
Code Profiling, Unit Testing,
Static Code Analysis, Load Testing, Enterprise
Source Control,
Work Item Tracking
Pro
Team
“Personalizzare” Visual Studio 2005
E’ il vostro strumento di lavoro, rendetelo ‘piacevole’ e
produttivo
Import/Export Settings
Colorare il testo come preferite
Keyboard scheme (VB6)
Task List personalizzabile
Option Strict On !!!
External Tools
Creazione di macro da associare a combinazioni di tasti
Object Browser
Immediate window a design time
Regions
Scelta di un Project Template
Windows Application
Class Library
Windows Control Library
ASP .NET Web Application / Service /
Control Library
Console Application
Windows Service
Custom templates
Ma dov’è il comando Build di VB6?
Ogni volta che premete F5 Visual Studio compila sempre
il vostro progetto
L’eseguibile e tutti i files necessari sono nella cartella bin
Debug
Relase
Debug vs Release
La modalità Release non contiene le informazioni di debug
Il codice è ottimizzato rispetto alla versione Debug
Struttura di un Progetto VB 2005
Solution Files (.sln, .suo)
Rappresentano l’intero applicativo e il suo stato
Project Files (.vbproj)
Windows Application
Librerie
Local Project Items
Classi, Form, Moduli, ecc. (.vb)
Risorse (.resx)
Web Project Items
XML Web services (.asmx)
Web Form (.aspx)
Global application classes (.asax)
IDE Features
XML Comments
Commenti aggiuntivi inseriti nel codice e gestiti dall’intellisense
Potete usarli per generare documentazione con NDoc
http://ndoc.sourceforge.net/
Refactor Tool
http://msdn.microsoft.com/vbasic/downloads/tools/refactor/
L’ide supporta il name refactoring
Code Snippets e Expansions
“Pezzi” di codice pronti all’uso e parametrizzabili
Potete aggiungere i vostri
http://www.gotcodesnippets.net/
http://msdn.microsoft.com/vbasic/downloads/tools/snippeteditor/
Compiler Features
Smart Tags
Autocorrezione del codice
Warnings
Il compilatore analizza in maniera dettagliata
il codice
Variabili inutilizzate
Instanze non create
Funzioni ricorsive
Uso incorretto di Try/Catch
Debugger Features
Edit & Continue come in VB6!!!
DataTips
Visualizzazione di tutti i dettagli di una variabile
Visualizer
Permettono di visualizzare i dati in maniera più chiara
Potete creare i vostri visualizers
http://www.code-magazine.com/article.aspx?quickid=0503061&page=1
BreakPoints
TracePoints
Scrivono delle informazioni quando il codice passa dal
tracepoint
Locals e Autos Window
Conditional,Obsolete attributes
Debug e My.Application.Log classes
VB 2005: Novità OOP
Classi Parziali
File Class1.vb
Public Class Car
Public Sub Start()
End Sub
End Class
<Scope> Class Car
…
End Class
Le classi possono
essere Nested
Dim T As New Car()
T.Start()
T.Stop()
File Class2.vb
Public Partial Class Car
Public Sub Stop()
End Sub
End Class
Uso dei Costruttori
Sub New rimpiazza Class_Initialize
Viene eseguita quando l’oggetto è istanziato
Public Sub New( )
intValue = 1
End Sub
Possiamo specificare più costruttori per la stessa classe (Overload)
Può essere usato per simulare PublicNotCreatable di VB6
Public Sub New(ByVal i As Integer)
intValue = i
End Sub
Distruzione degli oggetti
Sub Finalize rimpiazza l’evento Class_Terminate
La usiamo per liberare le risorse usate dall’oggetto
Viene eseguita quando il GC distrugge l’oggetto
Usiamo x = Nothing per permettere la Garbage Collection
Attenzione: la distruzione potrebbe non avvenire
immediatamente!
Protected Overrides Sub Finalize( )
‘Rilascio delle risorse
End Sub
Se dovete rilasciare un oggetto immediatamente
implementate il pattern Dispose
Interfaccia IDisposable
Usatelo solo quando veramente necessario!
Using
Dim MyObj As New DisposableObject
Try
Dim MyObj As New DisposableObject
MyObj.DoSomething()
MyObj.DoSomething()
Finally
MyObj.Dispose()
MyObj.Dispose() Using MyObj as New DisposableObject
MyObj.DoSomething()
End Try
End Using
Dim Temp As DisposableObject = New DisposableObject
Try
Temp.DoSomething()
Finally
If (Temp IsNot Nothing) Then _
DirectCast(Temp, IDisposable).Dispose()
End Try
Metodi e Overloading
Metodo
Permette di definire delle azioni che l’oggetto deve compiere
Car.Faster()
Guideline: I nomi dei metodi sono PascalCase
Non si applica ai valori di ritorno
Class Car
...
Public Sub Faster()
...
End Sub
End Class
Class Car
...
Public Sub Faster()
...
End Sub
Public Sub Faster(maxSpeed as Integer)
...
End Sub
End Class
Shared Members
VB6
Moduli
VB.NET
Moduli -> Classi con metodi statici (Shared)
Class Car
...
Public Shared Function GetConsumo(km as Int32,_
litri as Int32) as Single
...
End Sub
End Class
Dim Consumo as Double = Car.GetConsumo(100,6)
Shared Fields
VB6
Necessità di avere dei fields condivisi dalle varie istanze
La classe usava un campo definito in un modulo
Class Car
Private Shared carOwner as String
Public Property Owner() As String
Get
Return carOwner
End Get
Set(ByVal Value As String)
carOwner = Value
End Set
End Property
End Class
Dim c as New Car
c.Owner=“Corrado”
Dim k as New Car
Console.WriteLine(k.Owner) ‘Corrado
Proprietà Shared
Class Car
Private Shared carOwner as String
Public Shared Property Owner() As String
Le proprietà Shared
Get
non possono
Return carOwner
accedere a field non
End Get
Shared
Set(ByVal Value As String)
carOwner = Value
End Set
End Property
Car.Owner=“Corrado”
End Class
Console.WriteLine(Car.Owner) ‘Corrado
Dim k as New Car()
k.Owner=“Mario” ‘Warning!
Accedete sempre a item statici usando NomeClasse.XXX
Il compilatore emette warning se accedete via istanza
Definite un costruttore privato per Classi statiche
Eventi
Eventi
Sono internamente basati su Delegates
Delegates
Sono l’equivalente .NET dei puntatori a funzione del C
Sono type safe
Si definisce attraverso la keyword Delegate
Possiamo passare un metodo come parametro
Gestione degli eventi
WithEvents
AddHandler
RemoveHandler
Handles
Interfacce
Public Interface ICar
Sub Start()
Sub Faster()
Sub Slower()
ReadOnly Property Speed() As Integer
Event LowOil()
‘
End Interface
In VB6 si usava una
classe
No scope
No
implementazione
Public Class Car
Implements ICar
‘Enter
...
Public Sub Faster() Implements ICar.Faster
End Sub
Public Event LowOil() Implements ICar.LowOil
Public ReadOnly Property Speed() As Integer Implements ICar.Speed
Get
End Get
End Property
...
End Class
Implements ha parecchi vantaggi...
Interfacce
Public Class Car ...
Private Sub Faster() Implements ICar.Faster
End Sub
Public Sub AutoPilot()
End Sub
...
End Class
Public Class Car : Implements ICar,ITruck
Private Sub Faster() Implements _
ICar.Faster,ITruck.Faster
End Sub
Public Sub AutoPilot()
End Sub
...
End Class
Il framework fa largo uso di interfacce
Insiemi di oggetti
System.Collections namespace
ArrayList
HashTable
SortedList
Stack
Queue
Ogni oggetto permette di gestire insiemi di
oggetti con caratteristiche proprie
HashTable
E’ un array autodimensionante
Implementa IDictionary
La ricerca è By Key (Object)
Gli items non sono memorizzati secondo un ben preciso ordine
Dim list as New HashTable(10)
For i as Integer=0 to 9
Dim c as New Car
list.Add(“car”+i.ToString,c)
Next
Dim c as Car= DirectCast(list(“car6”), Car)
For Each c as Car in list
...
Next
SortedList
E’ un array autodimensionante
Gli Items sono ordinati (usando IComparable)
La ricerca è By Key
Sorting <>Performances
Dim list as New SortedList(10)
For i as Integer=0 to 9
Dim c as New Car
list.Add(“car”+i.ToString,c)
Next
Dim c as Car= DirectCast(list(“car6”), Car)
For Each c as Car in list
...
Next
Stack
E’ una pila autodimensionante
LIFO – Last In, First Out
Push, Pop e Peek
Dim list as New Stack()
list.Push(“a”)
list.Push(“b”)
list.Push(“c”)
Console.WriteLine(list.Pop)‘c
Queue
E’ una coda autodimensionante
FIFO – First In, First Out
Enqueue, Dequeue e Peek
Dim list as New Queue()
list.Enqueue(“a”)
list.Enqueue(“b”)
list.Enqueue(“c”)
Console.WriteLine(list.Dequeue)
‘a
Altri tipi di collezioni sono disponibili in System.Collection.Specialized
NameValueCollection
...e le collezioni tipizzate? ...attendere prego...
Ereditarietà
Classi con funzionalità e interfacce molto simili ad un altra
Modifica della classe (errori,interfaccia non congrua)
Copia e Incolla
Il codice potrebbe non essere disponibile
Eredità per delega
Parecchio codice per il wrapping della classe interna
SuperCar
Start
Start
Car
Faster
Ereditarietà
Creare una classe che eredita da un altra
Eredita Interfaccia e Implementazione
Inherits
Non è necessario
Source Code
Stesso linguaggio (C# <-> VB.NET)
Public Class SuperCar
Inherits Car
End Class
Dim sc as New SuperCar
sc.Start()
Sc.Faster()
Public Class SuperCar
Inherits Car
Public Sub Turbo
End Sub
End Class
Dim sc as New SuperCar
sc.Start()
‘Car
sc.Faster()
‘Car
sc.Turbo()
‘SuperCar
Ereditarietà
Concetti
La classe da cui si eredita è definita classe Base
Posso ereditare da qualsiasi classe .NET (che lo permette)
Tutte le classi in .NET ereditano da System.Object
Si definisce una relazione “Is a” (é un)
In .NET tutto è Object
Covarianza
Public Class SuperCar
Inherits Car
Public Sub Turbo
End Sub
End Class
Dim c as Car= New SuperCar
c.Start()
c.Turbo()
‘Errore
Una classe può ereditare da una sola classe base
Single Inheritance
Override
La classe che eredita può modificare il comportamento della
classe base
Ridefinendone i metodi/proprieta/eventi
La classe base deve permetterne la redifinizione
Overridable
Public Class Car
Public Overridable Sub Faster
Console.WriteLine(“base”)
End Sub
End Class
Public Class SuperCar
Inherits Car
Public Overrides Sub Faster
Console.WriteLine(“Inherited”)
End Sub
End Class
Dim c As Car = New SuperCar()
c.Faster()
‘Inherited
Override
Un metodo dichiarato Overrides:
E’ automaticamente Overridable
Si può usare NotOverridable per modificarne il comportamento
Public Class SuperCar: Inherits Car
Public NotOverridable Overrides Sub Faster
Console.WriteLine(“Inherited”)
End Sub
End Class
MyBase
Rappresenta la classe da cui si sta ereditando
Public Class SuperCar: Inherits Car
Public Overrides ReadOnly Property Model as String
Return MyBase.Model + “ Super”
End Sub
End Class
Override
I costruttori non vengono ereditati
No problem se non avete dei costruttori parametrici (usa default)
Dovete invocarli esplicitamente (prima istruzione)
Public Class Car
Public Sub New (cilindrata as Integer)
End Sub
End Class
Public Class SuperCar: Inherits Car
Public Sub New (cilindrata as Integer)
MyBase.New(cilindrata)
‘Inizializzo la classe base
End Sub
End Class
Override, classe base e Me
Quando associate un istanza di una classe ereditata ad una variabile di
tipo base, la classe base “vede” l’implementazione dei metodi della
classe ereditata
Public Class Car
Public Overridable Sub Faster
Console.WriteLine(“base”)
End Sub
End Class
Public Class SuperCar: Inherits Car
Public Overrides Sub Faster
Console.WriteLine(“Inherited”)
End Sub
End Class
Dim c as Car= New SuperCar
c.Faster()’
Inherited
Me non indica il contesto corrente
Public Class Car
Private Sub IncreaseSpeed
Me.Faster()
End Sub
End Class
MyClass
MyClass permette di specificare che il contesto di esecuzione sia quello
della classe base e non quello di eventuali overrides in classi ereditanti
da essa
Public Class Car
Private Sub IncreaseSpeed
MyClass.Faster()
End Sub
End Class
Viene eseguito il metodo Faster della classe Car
Non disponibile in C#
Protected scope
Protected rende visibile un elemento alle sole classi
ereditanti o alla classe che lo definisce
Si usa quando un metodo è utile al colloquio tra classe base
e classe ereditante
Public Class Car
Protected Sub IncreaseSpeed
End Sub
End Class
Public Class SuperCar: Inherits Car
Public Sub Faster
MyBase.IncreaseSpeed()
End Sub
End Class
Dim c As New Car
c.IncreaseSpeed()’ Errore
Può essere abbinato con Friend
Shadows
Overrides funziona se il metodo della classe base è virtual
Potrebbe non esserlo (I metodi Overridable sono più ‘lenti’)
Potremmo non poterlo modificare
Shadows
Permette di ridefinire metodi già presenti nella classe base
Sono a tutti gli effetti delle nuove implementazioni
Sono ignorate dalla classe base (no ereditarietà)
Va usato per ridefinire membri Shared
Public Class SuperCar: Inherits Car
Public Shadows Sub Faster
Console.WriteLine(“Inherited”)
End Sub
End Class
Dim c as Car= New SuperCar
c.Faster()’
base
In alcuni casi potremmo non volere che qualcuno erediti la nostra
classe
NotInheritable e MustInherit
NotInheritable
Indica che la classe non è ereditabile (sealed class)
Public NotInheritable Class Car
End Class
Public Class SuperCar
Inherits Car ‘Errore
End Class
MustInherith
Non può essere istanziata (abstract class)
Può essere usata solo ereditando da essa
Spesso contiene dei metodi definiti MustOverride
Permette di definire delle classi che hanno funzionalità
parziale
Public MustInherit Class Car
Public MustOverride Sub Faster
End Sub
End Class
Classe Astratta: CollectionBase
System.Collection.CollectionBase
Permette di creare collezioni tipizzate
Public Class Cars : Inherits CollectionBase
Public Sub Add(ByVal item As Car)
MyBase.InnerList.Add(item)
End Sub
Default Property Item(ByVal index As Integer) As Car
Get
Return DirectCast(MyBase.InnerList(index), Car)
End Get
Set(ByVal Value As Car)
MyBase.InnerList(index) = Value
End Set
End Property
End Class
Dim l as New Cars()
l.Add(New Car())
l.Add (New Truck())
‘ok
‘Errore
Generics Collections
Public Class
Class List
List(Of T)
Public
Private elements()
elements() As
As Object
T
Private
Private count
count As
As Integer
Integer
Private
Public Sub
Sub Add(ByVal
Add(ByVal element
element As
As Object)
T)
Public
If count
count =
= elements.Length
elements.Length Then
Then Resize(count
Resize(count *
* 2)
2)
If
elements(count) =
= element
element :
: count
count +=
+= 1
1
elements(count)
End Sub
Sub
End
Public
Default
Property
Item(ByVal
_ _
Dim
intList
As New
List() Index
Public
Default
Property
Item(ByVal
Index
Dim intList
As Integer)
As Object
T As New List(Of Int32)
‘ Boxing!
Get intList.Add(1)
intList.Add(1)
No Boxing!
intList.Add(2)
‘ ‘Boxing!
Return
elements(index)
intList.Add(2)
‘No
Noerror…
Boxing!
intList.Add(“Pippo")
‘
End
Get
End Get
intList.Add(“Pippo")
‘ Error…
Set
Set (value
(value as
as object)
T)
i = CInt(intList(0))
‘ Richiesto cast
elements(index)
=
elements(index)
= value
value
i = intList(0)
‘ Non serve castare
End Set
End
Set
End
Property
Property
End End
Class
End Class
Generics Collections
Collection Classes
List (of T)
Dictionary (Of K,V)
SortedDictionary (Of K,V)
Stack(Of T)
Queue(Of T)
Public Class TypedCollection(Of T) _
List (of T)
Inherits System.Collections.ObjectModel.Collection(Of
T)
...
IDictionary (Of K,V)
End Class
ICollection (Of T)
Collection Interfaces
IEnumerable (Of T)
Dim Coll as New TypedCollection(Of DataTable)
IEnumerator (Of T)
Coll.Add(new DataTable())
IComparable(Of T)
IComparer(Of T)
Collection Base Classes
Dim coll As New List(Of DataTable)
Collection (Of T)
KeyedCollection (Of T)
ReadOnlyCollection(Of T)
Generics Methods
Public Function MyIIF (Of T)(cond As Boolean, _
trueP As T, falseP As T) As T
If (cond) Then
Return trueP
Else
Return falseP
End If
End Sub
Dim X As Int32 = 3
Dim Y As Int32 = 4
Dim Z As Int32 = IIf(X>Y,X,Y) ‘Error
Dim Z As Int32 = MyIIF(Of Int32)(X>Y,X,Y) ‘No cast!
Dim Z As Int32 = MyIIF(X>Y,X,Y) ‘ Type inferencing
Generics Constraints
Public Class Car(Of T
T)As New)
Private _Navigator As New
T
T
Public ReadOnly Property Navigator As T
Get
Return _Navigator
End Get
End Class
Dim Car1 As New Car(Of TomTom)
Car1.Navigator.RouteTo()’ Error
Public Class Car _
(Of T As {New,BaseClass,I1,I2,Class,Structure})
Private _Navigator As New T
Public ReadOnly Property Navigator As T
Get
Return _Navigator
End Get
End Class
Operator Overloading
Public Class SetPoint
Public
SetPoint
PublicClass
Temperature
as Single
Public
as Single
PublicTemperature
Sub New (value
as Single)
Public
Sub New (value as Single)
Me.Temperature=value
Me.Temperature=value
End
Sub
End Sub
End
Class
Public
Shared Operator +(ByVal a As SetPoint,_
ByVal b As SetPoint) As SetPoint
Return New SetPoint(a.Temperature + b.Temperature)
End Operator
End Class
Dim T1 as New SetPoint(12.5)
Dim T2 as New SetPoint(13)
Dim T3 as SetPoint = T1 + T2
Operator Overloading
Alcuni operatori sono accoppiati
<> e =
>e<
>= e <=
IsTrue e IsFalse
AndAlso
Richiede And
deve ritornare un tipo simile a quello in cui è definito
Richiede la definizione di IsFalse/IsTrue
CType è l’operatore di conversione
Widening – Implicite
Narrowing – Esplicite