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)
Sistema Operativo (Windows 98/NT/2000/XP/2003/CE e Altri) 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-4f47-a244-c96d69c35dec&DisplayLang=en
Codice IL e Metadati RUN! VB.NET Compilatore vbc.exe JIT Compiler Codice x86
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 Windows Forms e servizi 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 Public Class Person … End Class File MyFile2.vb Module MainModule … End Module File MyFile3.vb Public Class Person2 … End Class Module MainModule2
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
Le stringhe sono immutabili Usate StringBuilder 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
E’ possibile dichiarare e inizializzare con lo stesso statement. 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 Stringhe, Objects Sono controllati dal Garbage Collector Attenzione alle assegnazioni Dim s as String=“pippo” Heap &H1235 &H1230 Ciao &H1235 pippo ... pluto
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 Il valore usato nella Dim è l’upper bound! 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(...)
In VB6 si usava Type-End Type 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 ... 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 — Application title, version, logs, description, … — 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 — Collezione dei web services referenziati http://msdn.microsoft.com/msdnmag/issues/05/07/My/default.aspx
Visual Studio 2005 Overview
Express Pro Team Standard Windows or Web Designers Code Editors and IntelliSense Programming Languages Remote Data Access Mobile Device Development User Experience Simplified Server Development/Debugging SQL Server 2005 Development Application Modeling, Code Profiling, Unit Testing, Static Code Analysis, Load Testing, Enterprise Source Control, Work Item Tracking
“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 Refactor Tool Code Snippets e Expansions 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 Warnings Autocorrezione del codice 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 Visualizer 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 Le classi possono essere Nested <Scope> Class Car … End Class File Class1.vb Public Class Car Public Sub Start() End Sub 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 MyObj.DoSomething() Finally MyObj.Dispose() End Try Dim MyObj As New DisposableObject MyObj.DoSomething() MyObj.Dispose() Using MyObj as New DisposableObject MyObj.DoSomething() 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 Class Unico punto dove è possibile inizilizzare fields ReadOnly
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 Get Return carOwner End Get Set(ByVal Value As String) carOwner = Value End Set End Property End Class Le proprietà Shared non possono accedere a field non Shared Car.Owner=“Corrado” 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 Delegates Gestione degli 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 Si applicano anche ai costruttori
Interfacce In VB6 si usava una classe No scope No implementazione 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 Il framework fa largo uso di interfacce Public Class Car ... Private Sub Faster() Implements ICar.Faster End Sub Public Sub AutoPilot() ... End Class Public Class Car : Implements ICar,ITruck Private Sub Faster() Implements _ ICar.Faster,ITruck.Faster End Sub Public Sub AutoPilot() ... 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 ...
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 ...
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 le collezioni tipizzate? ...attendere prego... 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 4 Start Faster Car
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() 4 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 Covarianza 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 4 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 4 Dim c As Car = New SuperCar() c.Faster() ‘Inherited
Override Un metodo dichiarato Overrides: MyBase 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 4 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 4
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 4 Public Class Car Private Sub IncreaseSpeed Me.Faster() End Sub End Class Me non indica il contesto corrente
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# 4
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 4 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 4 Dim c as Car= New SuperCar c.Faster()’ base In alcuni casi potremmo non volere che qualcuno erediti la nostra classe
NotInheritable e MustInherit Indica che la classe non è ereditabile (sealed class) Public Class SuperCar Inherits Car ‘Errore End Class Public NotInheritable Class Car 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 4 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 4 Dim l as New Cars() l.Add(New Car()) ‘ok l.Add (New Truck()) ‘Errore
Override di eventi La classe base deve essere strutturata in maniera opportuna Public Class Car Public Event LowOil() Public Overridable Sub Faster If (Me.OilLevel<5) Then Me.OnLowOil() End Sub Protected Overridable Sub OnLowOil() RaiseEvent LowOil() End Class Public Class SuperCar: Inherits Car Protected Overrides Sub OnLowOil() Me.Signal(“Low oil”) MyBase.OnLowOil() End Sub End Class 4
Generics Collections Public Class List(Of T) Public Class List Private elements() As T Private count As Integer Public Sub Add(ByVal element As T) If count = elements.Length Then Resize(count * 2) elements(count) = element : count += 1 End Sub Public Default Property Item(ByVal Index _ As Integer) As T Get Return elements(index) End Get Set (value as T) elements(index) = value End Set End Property End Class Public Class List Private elements() As Object Private count As Integer Public Sub Add(ByVal element As Object) If count = elements.Length Then Resize(count * 2) elements(count) = element : count += 1 End Sub Public Default Property Item(ByVal Index _ As Integer) As Object Get Return elements(index) End Get Set (value as object) elements(index) = value End Set End Property End Class Dim intList As New List() intList.Add(1) ‘ Boxing! intList.Add(2) ‘ Boxing! intList.Add(“Pippo") ‘ No error… i = CInt(intList(0)) ‘ Richiesto cast Dim intList As New List(Of Int32) intList.Add(1) ‘ No Boxing! intList.Add(2) ‘ No Boxing! intList.Add(“Pippo") ‘ Error… i = intList(0) ‘ Non serve castare
Generics Collections Collection Classes Collection Interfaces List (of T) Dictionary (Of K,V) SortedDictionary (Of K,V) Stack(Of T) Queue(Of T) Collection Classes Public Class TypedCollection(Of T) _ Inherits System.Collections.ObjectModel.Collection(Of T) ... End Class Dim Coll as New TypedCollection(Of DataTable) Coll.Add(new DataTable()) Dim coll As New List(Of DataTable) List (of T) IDictionary (Of K,V) ICollection (Of T) IEnumerable (Of T) IEnumerator (Of T) IComparable(Of T) IComparer(Of T) Collection Interfaces Collection Base Classes 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 As New) Private _Navigator As New T Public ReadOnly Property Navigator As T Get Return _Navigator End Get End Class Public Class Car(Of T) Private _Navigator As T Public ReadOnly Property Navigator As T Get Return _Navigator End Get End Class Public Class Car(Of T) Private _Navigator As New 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 Temperature as Single Public Sub New (value as Single) Me.Temperature=value End Sub Public Shared Operator +(ByVal a As SetPoint,_ ByVal b As SetPoint) As SetPoint Return New SetPoint(a.Temperature + b.Temperature) End Operator End Class Public Class SetPoint Public Temperature as Single Public Sub New (value as Single) Me.Temperature=value End Sub 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 = 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