learn & get … ovvero come sopravvivere alla migrazione da vb6 a vb2005
TRANSCRIPT
Learn & Learn & GetGet… … Ovvero come sopravvivere alla Ovvero come sopravvivere alla migrazione da VB6 a VB2005migrazione da VB6 a VB2005
Perchè .NET ?Perchè .NET ?
Tecnologia nella quale Microsoft ha Tecnologia nella quale Microsoft ha investito molto (Tempo e $$$) creata dai investito molto (Tempo e $$$) creata dai migliori architetti software (MS e non)migliori architetti software (MS e non)
Tecnologia alla base di tutti i nuovi Tecnologia alla base di tutti i nuovi prodottiprodotti(da SQL Server 2005 a Windows Vista(da SQL Server 2005 a Windows Vista™™))
Standard ISOStandard ISO
E’ il futuro di Microsoft, E’ il futuro di Microsoft, COM è il passatoCOM è il passato
Perchè .NET ?Perchè .NET ?
Progetto nato nel 1998 come evoluzione di Progetto nato nel 1998 come evoluzione di COM, Alpha a PDC 2000COM, Alpha a PDC 2000
Effetto scrivania...Effetto scrivania...
Le applicazioni di oggi hanno necessità Le applicazioni di oggi hanno necessità diverse (Connettività, Interazione...)diverse (Connettività, Interazione...)
I linguaggi devono interagire tra loroI linguaggi devono interagire tra loro
Il sistema operativo si è evoluto seguendo Il sistema operativo si è evoluto seguendo una logica di “espansione”una logica di “espansione”
DLL HellDLL Hell
Eliminare gli errori del passato (COM)Eliminare gli errori del passato (COM)
Perchè .NET ?Perchè .NET ?
Strato software che si interpone tra Strato software che si interpone tra l’applicazione e il sistema operativol’applicazione e il sistema operativo
Codice MSILCodice MSILC#,VB.NET...C#,VB.NET...
.NET Framework .NET Framework CLR (Garbage Collector,Eccezioni,Multithreading)CLR (Garbage Collector,Eccezioni,Multithreading)
BCL (Tipi Base)BCL (Tipi Base)
Sistema OperativoSistema Operativo (Windows 98/NT/2000/XP/2003/CE e Altri) (Windows 98/NT/2000/XP/2003/CE e Altri)
Circa 8000 classi...Circa 8000 classi...
Vantaggi del .NET Framework Vantaggi del .NET Framework (#1)(#1)
Modello di programmazione OOP comuneModello di programmazione OOP comunebasta (!?) accessi alle DLLbasta (!?) accessi alle DLLUtilizzo facilitato Utilizzo facilitato (IUnknown,AddRef,Registrazioni...)(IUnknown,AddRef,Registrazioni...)Aggiornamenti facilitati (basta RegSvr32!)Aggiornamenti facilitati (basta RegSvr32!)Distribuzione semplificata (XCopy)Distribuzione semplificata (XCopy)Side by Side executionSide by Side executionCodice ottimizzato per la piattaforma di Codice ottimizzato per la piattaforma di esecuzione esecuzione Codice sicuro in quanto “gestito” Codice sicuro in quanto “gestito” (“managed”)(“managed”)
Vantaggi del .NET Framework Vantaggi del .NET Framework (#2)(#2)
Integrazione dei linguaggiIntegrazione dei linguaggi(CTS è comune) (CTS è comune)
Gestione automatica della memoria Gestione automatica della memoria ((Garbage CollectorGarbage Collector))Totalmente gratuito!Totalmente gratuito!http://www.microsoft.com/downloads/details.aspx?FamilyID=fe6f2099-http://www.microsoft.com/downloads/details.aspx?FamilyID=fe6f2099-b7b4-4f47-a244-c96d69c35dec&DisplayLang=enb7b4-4f47-a244-c96d69c35dec&DisplayLang=en
Codice IL e Codice IL e MetadatiMetadati
VB.NETVB.NET
Compilatore vbc.exeCompilatore vbc.exe
Codice IL e MetadatiCodice IL e Metadati
JIT CompilerJIT Compiler
Codice x86Codice x86
RUN!
Codice IL e Codice IL e MetadatiMetadatiPublic Sub MainPublic Sub Main Console.WriteLine(“Ciao”)Console.WriteLine(“Ciao”) Console.WriteLine(“A tutti!”)Console.WriteLine(“A tutti!”)End SumEnd Sum
Il JIT Analizza tutti i tipi (oggetti) utilizzati in MainIl JIT Analizza tutti i tipi (oggetti) utilizzati in MainRiserva una struttura dati per ogni metodo associa un Riserva una struttura dati per ogni metodo associa un puntatore ad una funzione JITCompilerpuntatore ad una funzione JITCompilerQuando un metodo viene invocato, compila il codice, Quando un metodo viene invocato, compila il codice, aggiorna il puntatore al codice X86 ed esegue il aggiorna il puntatore al codice X86 ed esegue il codicecodiceLa seconda WriteLine non deve essere ricompilataLa seconda WriteLine non deve essere ricompilataIl codice viene compilato “on demand” e ottimizzato Il codice viene compilato “on demand” e ottimizzato sulla macchina clientsulla macchina client
Common Language RuntimeCommon Language Runtime
BCL - Libreria di classiBCL - Libreria di classi
ADO.NET : Accesso ai dati e XMLADO.NET : Accesso ai dati e XML
ASP.NET : Web Forms ASP.NET : Web Forms e servizie servizi Windows FormsWindows Forms
.NET Framework .NET Framework blocksblocks
Riassumendo...Riassumendo...
Redist circa 22 MBRedist circa 22 MBNon supporta Windows 95Non supporta Windows 95Per sviluppare serve Win2000 o superiorePer sviluppare serve Win2000 o superioreL’attuale versione è la 2.0L’attuale versione è la 2.0Il framework funziona Side-by-SideIl framework funziona Side-by-SideVisual Studio 2005 supporta solo il framework 2.0Visual Studio 2005 supporta solo il framework 2.0Non serve per applicazioni ASP.NET (lato client)Non serve per applicazioni ASP.NET (lato client)Esiste per Linux (Mono)Esiste per Linux (Mono)Esiste per Pocket PC,SmartPhones, EmbeddedEsiste per Pocket PC,SmartPhones, EmbeddedSu NT serve Sp6aSu NT serve Sp6aRichiede IE 5.01 o superioreRichiede IE 5.01 o superioreRichiede Windows Installer 3.0Richiede Windows Installer 3.0
VB 2005: Il VB 2005: Il linguaggiolinguaggio
Attenzione: Attenzione: Non stiamo parlando di Non stiamo parlando di VB7VB7
Files .vbFiles .vb
In VB6 ci sono diverse estensioni (cls, frm...)In VB6 ci sono diverse estensioni (cls, frm...)In VB2005 esiste una sola estensione .vb che può (anche) In VB2005 esiste una sola estensione .vb che può (anche) contentere più classi e/o moduli.contentere più classi e/o moduli.Il nome della classe non è legato al nome del fileIl nome della classe non è legato al nome del file
File File MyFile1.vbMyFile1.vb
Public Class PersonPublic Class Person……End ClassEnd Class
File File MyFile2.vbMyFile2.vb
Module MainModuleModule MainModule……End ModuleEnd Module
File File MyFile3.vbMyFile3.vbPublic Class Person2Public Class Person2……End ClassEnd Class
Module MainModule2Module MainModule2……End ClassEnd Class
Program EntryPointProgram EntryPoint
In VB6 un applicativo può partire da un Form o da In VB6 un applicativo può partire da un Form o da una Sub Mainuna Sub MainIn VB 2005... pure In VB 2005... pure però.. però..
La Sub Main non deve necessariamente stare in un moduloLa Sub Main non deve necessariamente stare in un modulo
VB 2005 però, by default, utilizza l’Application VB 2005 però, by default, utilizza l’Application FrameworkFrameworkApplication FrameworkApplication Framework
Permette di gestire un applicazione in maniera più semplicePermette di gestire un applicazione in maniera più sempliceOffre una serie di eventi “tipici” di un applicazioneOffre una serie di eventi “tipici” di un applicazione
Startup, ShutdownStartup, ShutdownStartupNextInstanceStartupNextInstanceUnhandledException UnhandledException
NamespacesNamespaces
Il compilatore ha bisogno di sapere esattamente quale classe Il compilatore ha bisogno di sapere esattamente quale classe instanziareinstanziarePossono esserci dei conflittiPossono esserci dei conflittiSono dei raggruppamenti Logici Sono dei raggruppamenti Logici I moduli e le classi vivono nei NamespacesI moduli e le classi vivono nei NamespacesVB Imposta un root namespaceVB Imposta un root namespaceVB.NET definisce degli imports globaliVB.NET definisce degli imports globaliLa keyword Imports permette di importare i namespacesLa keyword Imports permette di importare i namespaces
Imports System.IOImports System.IOImports Test=System.IOImports Test=System.IO
Permette di evitare di scrivere il percorso completo a un Permette di evitare di scrivere il percorso completo a un namespacenamespacePosso creare un namespace all’interno di un altro namespacePosso creare un namespace all’interno di un altro namespaceUsare Usare GlobalGlobal per far riferimento al root namespace per far riferimento al root namespace
VariabiliVariabili
Global Variables (usare Shared)Global Variables (usare Shared)
Usare Option Explicit e Usare Option Explicit e Option StrictOption Strict
Dichiarazioni multiple sulla stessa Dichiarazioni multiple sulla stessa rigariga
Block scope (cicli For,Do...Loop)Block scope (cicli For,Do...Loop)
Data TypesData TypesByte (*)Byte (*)Char (2 bytes) [A“c”]Char (2 bytes) [A“c”]Boolean (4 bytes)Boolean (4 bytes)Short (2 bytes) Short (2 bytes) ex Integer di VB6ex Integer di VB6 (*) (*)Integer (4 bytes) Integer (4 bytes) ex Long di VB6ex Long di VB6 (*) (*)Long (8 bytes) (*)Long (8 bytes) (*)Currency -> Decimal (16 bytes)Currency -> Decimal (16 bytes)SingleSingleDoubleDoubleDateDate
Sono Alias dei tipi definiti nel .NET frameworkSono Alias dei tipi definiti nel .NET framework(Int16, Int32...)(Int16, Int32...)(*) Sono sia signed che Unsigned(*) Sono sia signed che UnsignedPer ognuno esiste il relativo operatore di conversione e la Per ognuno esiste il relativo operatore di conversione e la classe Convert.classe Convert.I tipi unsigned non sono CLS compliantI tipi unsigned non sono CLS compliant
Nullable TypesNullable Types
Sono Value Types che possono essere Sono Value Types che possono essere NothingNothing
Dim i As Integer= Nothing ‘Value=0Dim i As Integer= Nothing ‘Value=0
Sono basati sulla classe generica NullableSono basati sulla classe generica NullableNullable.GetValueOrDefault()Nullable.GetValueOrDefault()
La properietà HasValue indica se il nullable ha un valore associatoLa properietà HasValue indica se il nullable ha un valore associato
Dim i As Nullable(Of DateTime)= Nothing ‘Value=NothingDim i As Nullable(Of DateTime)= Nothing ‘Value=Nothing
Data Types - StringData Types - String
Il framework non supporta le stringhe a Il framework non supporta le stringhe a lunghezza fissalunghezza fissa
VB6VB6Dim s As String * 20Dim s As String * 20
VB 2005VB 2005Dim s As New String(“ “c,20)Dim s As New String(“ “c,20)
Le stringhe sono Le stringhe sono immutabiliimmutabili
Usate StringBuilderUsate StringBuilder
Usate le costanti ControlChars.XUsate le costanti ControlChars.X
InizializzazioneInizializzazione
E’ possibile dichiarare e inizializzare E’ possibile dichiarare e inizializzare con lo stesso statement.con lo stesso statement.
Dim x As integer=9Dim x As integer=9
Inizializzazione di oggettiInizializzazione di oggetti
Dim o As PersonDim o As PersonO=New Person()O=New Person()
Dim o As New Person() ‘ è identico (In VB6 non lo era)Dim o As New Person() ‘ è identico (In VB6 non lo era)
AssegnazioneAssegnazioneLe proprietà di Default non esistono piùLe proprietà di Default non esistono più
Si può usare se la proprietà ha un indiceSi può usare se la proprietà ha un indice
Set non si usa piùSet non si usa più
Nuovi operatoriNuovi operatoriX+=1X+=1
X-=1X-=1
X*=nX*=n
X\=nX\=n
Y^=nY^=n
s+=“xyz”s+=“xyz”
Usare & oppure +?Usare & oppure +?s=s & “ciao” s=s & “ciao”
s=s + ”ciao”s=s + ”ciao”
Value TypesValue Types
Ereditano le caratteristiche da Ereditano le caratteristiche da System.ValueTypeSystem.ValueType
Enum, Structures, Integer... Tipi baseEnum, Structures, Integer... Tipi base
Sono memorizzate sullo Sono memorizzate sullo stackstack
Memorizzano Memorizzano il valoreil valore della variabile della variabile
Reference TypesReference Types
Sono memorizzate nella memoria Sono memorizzate nella memoria HeapHeapContengono Contengono un riferimentoun riferimento alla variabile alla variabile
Stringhe, ObjectsStringhe, ObjectsSono controllati dal Sono controllati dal Garbage CollectorGarbage CollectorAttenzione alle assegnazioniAttenzione alle assegnazioni
Dim s as String=“pippo”
&H1230&H1230 CiaoCiao
&H1235&H1235 pippopippo
...... plutopluto
&H1235
&H1235HeapHeap
Boxing-UnboxingBoxing-Unboxing
E’ la conversione di un value type in un reference type e E’ la conversione di un value type in un reference type e viceversaviceversa
E’ un operazione dispendiosa in termini di prestazioni e E’ un operazione dispendiosa in termini di prestazioni e memoriamemoria
Accade quando si associa un Value Type ad una variabile di Accade quando si associa un Value Type ad una variabile di tipo Objecttipo Object
Usare Usare CType()CType() o o DirectCast()DirectCast() per convertire per convertire
CTypeCType tenta la conversione del tipo tenta la conversione del tipo
DirectCastDirectCast è più veloce (solo reference types) è più veloce (solo reference types)
TryCastTryCast è un operatore di cast che ritorna è un operatore di cast che ritorna Nothing se il casting fallisceNothing se il casting fallisce
EnumEnum
Simili a VB6Simili a VB6
E’ possibile definire il E’ possibile definire il tipotipo usato dall’Enum usato dall’Enum
E’ possibile “E’ possibile “decoraredecorare” un enumerato con ” un enumerato con <Flags()><Flags()>
Il tipo Enum è presente nel framework ed Il tipo Enum è presente nel framework ed espone metodi per la gestione degli enumespone metodi per la gestione degli enum
ParseParse
GetValuesGetValues
ArrayArray
Sono 0 (zero!) basedSono 0 (zero!) basedDim k() as Integer(0 to 10)Dim k() as Integer(0 to 10)
Il valore usato nella Dim è l’upper bound!Il valore usato nella Dim è l’upper bound!
Dim a(3,2) as Integer [Matrici]Dim a(3,2) as Integer [Matrici]
Array InitializersArray Initializers
Dim x() as Int32={1,2,3}Dim x() as Int32={1,2,3}
Non si può usare ReDim per dimensionare un Non si può usare ReDim per dimensionare un arrayarray
Sono basati sulla classe Array del FrameworkSono basati sulla classe Array del Framework
Array.CloneArray.Clone
Array.Copy(...)Array.Copy(...)
StruttureStrutture
Sono Value TypesSono Value Types
In VB6 si usava Type-End TypeIn VB6 si usava Type-End Type
In VB 2005 si usa Structure-End In VB 2005 si usa Structure-End StructureStructure
Possono essere viste come classi Possono essere viste come classi “leggere”“leggere”
Possono avere metodi, proprietà ed Possono avere metodi, proprietà ed eventieventi
Procedure e FunzioniProcedure e Funzioni
I Parametri sono ByVal (erano ByRef in VB6)I Parametri sono ByVal (erano ByRef in VB6)
Si può usare Si può usare ReturnReturn per ritornare un valore ad per ritornare un valore ad una funzioneuna funzione
Si possono usare parametri OptionalSi possono usare parametri OptionalSupportati solo da VBSupportati solo da VB
Sono un trucchetto per mantenere la compatibilitàSono un trucchetto per mantenere la compatibilità
IsMissing non esiste più, bisogna dare un defaultIsMissing non esiste più, bisogna dare un default
Usare gli Usare gli OverloadsOverloads
Le routines richiedono Le routines richiedono sempresempre le parentesi le parentesi
Cicli e controllo di flussoCicli e controllo di flusso
VB 2005 offre le versioni cortocircuitate di And e VB 2005 offre le versioni cortocircuitate di And e OrOr
IIF non è cortocircuitataIIF non è cortocircuitata
While/Wend di VB6 diventa While/End While/Wend di VB6 diventa While/End WhileWhile
I cicli For/For Each permettono di I cicli For/For Each permettono di dimensionare la variabile usata nel ciclodimensionare la variabile usata nel ciclo
Statement Statement ContinueContinue
Gestione degli erroriGestione degli errori
VB 2005 offre ancora On Error...VB 2005 offre ancora On Error...Meccanismo obsoletoMeccanismo obsoleto
Mantenuto per compatibilitàMantenuto per compatibilità
Sostituito dalla Sostituito dalla gestione strutturata delle eccezionigestione strutturata delle eccezioni
Un eccezione Un eccezione è un anomaliaè un anomalia che può capitare che può capitare durante la vita dell’applicazionedurante la vita dell’applicazioneL’anomalia viene segnalata attraverso un oggetto L’anomalia viene segnalata attraverso un oggetto ExceptionException (o ereditato da esso) (o ereditato da esso)
Exception.MessageException.MessageException.SourceException.SourceException.StackTraceException.StackTrace
Come faccio a intercettare le Come faccio a intercettare le eccezioni?eccezioni?
Gestione degli errori : Try-Catch-Gestione degli errori : Try-Catch-FinallyFinally
Per lanciare da codice un eccezione usare Per lanciare da codice un eccezione usare ThrowThrow [exception] [exception]E’ possibile passare l’eccezione originale usando E’ possibile passare l’eccezione originale usando InnerExceptionInnerException
Le eccezioni vanno indicate dalla più specifica alla genericaLe eccezioni vanno indicate dalla più specifica alla generica
Usate l’evento Usate l’evento UnHandledExceptionUnHandledException per intercettare per intercettare eventuali errori non gestitieventuali errori non gestiti
Non lanciate eccezioni inutilmenteNon lanciate eccezioni inutilmente
Usate Debug->Exceptions per controllare il debuggerUsate Debug->Exceptions per controllare il debugger
TryTry ...... Catch ex As ArgumentException [When]Catch ex As ArgumentException [When] ...... Catch ex As Exception ‘GenericaCatch ex As Exception ‘Generica ... ... FinallyFinally ......End TryEnd Try
My
Application
Computer
User
Resources
Settings
WebServices
Forms
— 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
My NamespaceMy Namespace
http://msdn.microsoft.com/msdnmag/issues/05/07/My/default.aspx
Visual Studio 2005Visual Studio 2005OverviewOverview
ExpresExpresss
StandarStandardd ProPro TeamTeam
Windows or Web DesignersWindows or Web Designers
Code Editors and IntelliSenseCode Editors and IntelliSense
Programming LanguagesProgramming Languages
Remote Data AccessRemote Data Access
Mobile Device DevelopmentMobile Device Development
User ExperienceUser Experience SimplifieSimplifiedd
SimplifieSimplifiedd
Server Server Development/DebuggingDevelopment/Debugging
SQL Server 2005 SQL Server 2005 DevelopmentDevelopment
Application Modeling,Application Modeling,Code Profiling, Unit Testing, Code Profiling, Unit Testing, Static Code Analysis, Load Testing, Static Code Analysis, Load Testing, Enterprise Source Control, Enterprise Source Control, Work Item TrackingWork Item Tracking
““Personalizzare” Visual Studio Personalizzare” Visual Studio 20052005E’ il vostro strumento di lavoro, rendetelo E’ il vostro strumento di lavoro, rendetelo
‘piacevole’ e produttivo‘piacevole’ e produttivoImport/Export SettingsImport/Export Settings
Colorare il testo come preferiteColorare il testo come preferite
Keyboard scheme (VB6)Keyboard scheme (VB6)
Task List personalizzabileTask List personalizzabile
Option Strict On !!!Option Strict On !!!
External ToolsExternal Tools
Creazione di macro da associare a combinazioni di tastiCreazione di macro da associare a combinazioni di tasti
Object BrowserObject Browser
Immediate window a design timeImmediate window a design time
RegionsRegions
Scelta di un Project Scelta di un Project TemplateTemplate
Windows ApplicationWindows ApplicationClass LibraryClass LibraryWindows Control LibraryWindows Control LibraryASP .NET Web Application / Service / ASP .NET Web Application / Service / Control LibraryControl LibraryConsole ApplicationConsole ApplicationWindows ServiceWindows ServiceCustom templatesCustom templates
Ma dov’è il comando Build di Ma dov’è il comando Build di VB6?VB6?
Ogni volta che premete F5 Visual Studio compila Ogni volta che premete F5 Visual Studio compila sempre il vostro progettosempre il vostro progetto
L’eseguibile e tutti i files necessari sono nella L’eseguibile e tutti i files necessari sono nella cartella bincartella bin
DebugDebug
RelaseRelase
Debug vs ReleaseDebug vs ReleaseLa modalità Release non contiene le informazioni di La modalità Release non contiene le informazioni di debugdebug
Il codice è ottimizzato rispetto alla versione DebugIl codice è ottimizzato rispetto alla versione Debug
Struttura di un Progetto VB 2005Struttura di un Progetto VB 2005
Solution Files (.sln, .suo)Solution Files (.sln, .suo)Rappresentano l’intero applicativo e il suo statoRappresentano l’intero applicativo e il suo stato
Project Files (.vbproj)Project Files (.vbproj)Windows ApplicationWindows ApplicationLibrerieLibrerie
Local Project ItemsLocal Project ItemsClassi, Form, Moduli, ecc. (.vb)Classi, Form, Moduli, ecc. (.vb)Risorse (.resx)Risorse (.resx)
Web Project ItemsWeb Project ItemsXML Web services (.asmx)XML Web services (.asmx)Web Form (.aspx)Web Form (.aspx)Global application classes (.asax)Global application classes (.asax)
IDE FeaturesIDE Features
XML CommentsXML CommentsCommenti aggiuntivi inseriti nel codice e gestiti Commenti aggiuntivi inseriti nel codice e gestiti dall’intellisensedall’intellisensePotete usarli per generare documentazione con NDocPotete usarli per generare documentazione con NDoc
http://ndoc.sourceforge.net/http://ndoc.sourceforge.net/
Refactor ToolRefactor Toolhttp://msdn.microsoft.com/vbasic/downloads/tools/refactor/http://msdn.microsoft.com/vbasic/downloads/tools/refactor/L’ide supporta il name refactoringL’ide supporta il name refactoring
Code Snippets e ExpansionsCode Snippets e Expansions““Pezzi” di codice pronti all’uso e parametrizzabiliPezzi” di codice pronti all’uso e parametrizzabiliPotete aggiungere i vostriPotete aggiungere i vostri
http://www.gotcodesnippets.net/http://www.gotcodesnippets.net/http://msdn.microsoft.com/vbasic/downloads/tools/http://msdn.microsoft.com/vbasic/downloads/tools/snippeteditor/snippeteditor/
Compiler FeaturesCompiler Features
Smart TagsSmart TagsAutocorrezione del codiceAutocorrezione del codice
WarningsWarningsIl compilatore analizza in maniera Il compilatore analizza in maniera dettagliata il codicedettagliata il codice
Variabili inutilizzateVariabili inutilizzateInstanze non createInstanze non createFunzioni ricorsiveFunzioni ricorsiveUso incorretto di Try/CatchUso incorretto di Try/Catch
Debugger FeaturesDebugger FeaturesEdit & Continue come in VB6!!!Edit & Continue come in VB6!!!DataTipsDataTips
Visualizzazione di tutti i dettagli di una variabileVisualizzazione di tutti i dettagli di una variabile
VisualizerVisualizerPermettono di visualizzare i dati in maniera più chiaraPermettono di visualizzare i dati in maniera più chiaraPotete creare i vostri visualizersPotete creare i vostri visualizers
http://www.code-magazine.com/article.aspx?quickidhttp://www.code-magazine.com/article.aspx?quickid=0503061&page=1=0503061&page=1
BreakPointsBreakPointsTracePointsTracePoints
Scrivono delle informazioni quando il codice passa dal Scrivono delle informazioni quando il codice passa dal tracepointtracepoint
Locals e Autos WindowLocals e Autos WindowConditional,Obsolete attributesConditional,Obsolete attributesDebug e My.Application.Log classesDebug e My.Application.Log classes
VB 2005: Novità OOPVB 2005: Novità OOP
Classi ParzialiClassi Parziali <Scope> Class Car<Scope> Class Car……End ClassEnd Class
File Class1.vbFile Class1.vbPublic Class CarPublic Class Car Public Sub Start()Public Sub Start() End SubEnd SubEnd ClassEnd Class
File Class2.vbFile Class2.vbPublic Public PartialPartial Class Car Class Car Public Sub Stop()Public Sub Stop() End SubEnd SubEnd ClassEnd Class
Dim T As New Car()Dim T As New Car()T.Start()T.Start()T.Stop()T.Stop()
Le classi possono Le classi possono essere Nestedessere Nested
Uso dei Uso dei CostruttoriCostruttori
Sub NewSub New rimpiazza rimpiazza Class_InitializeClass_Initialize
Viene eseguita quando l’oggetto è istanziatoViene eseguita quando l’oggetto è istanziato
Possiamo specificare più costruttori per la stessa classe (Overload)Possiamo specificare più costruttori per la stessa classe (Overload)
Può essere usato per simulare PublicNotCreatable di VB6Può essere usato per simulare PublicNotCreatable di VB6
Public Sub New( )Public Sub New( ) intValue = 1intValue = 1End SubEnd Sub
Public Sub New(ByVal i As Integer)Public Sub New(ByVal i As Integer) intValue = iintValue = iEnd SubEnd Sub
Distruzione degli Distruzione degli oggettioggettiSub FinalizeSub Finalize rimpiazza l’evento rimpiazza l’evento Class_TerminateClass_Terminate
La usiamo per liberare le risorse usate dall’oggetto La usiamo per liberare le risorse usate dall’oggetto Viene eseguita quando il GC distrugge l’oggettoViene eseguita quando il GC distrugge l’oggetto
Usiamo Usiamo x = Nothingx = Nothing per permettere la Garbage Collection per permettere la Garbage CollectionAttenzione: la distruzione potrebbe non avvenire Attenzione: la distruzione potrebbe non avvenire immediatamente!immediatamente!
Protected Overrides Sub Finalize( )Protected Overrides Sub Finalize( ) ‘ ‘Rilascio delle risorseRilascio delle risorseEnd SubEnd Sub
Se dovete rilasciare un oggetto immediatamente implementate il pattern Se dovete rilasciare un oggetto immediatamente implementate il pattern DisposeDispose
Interfaccia Interfaccia IDisposableIDisposableUsatelo solo quando veramente necessario!Usatelo solo quando veramente necessario!
UsingUsing
Dim MyObj As New DisposableObjectDim MyObj As New DisposableObjectMyObj.DoSomething()MyObj.DoSomething()MyObj.Dispose()MyObj.Dispose()
Dim MyObj As New DisposableObjectDim MyObj As New DisposableObjectTryTry MyObj.DoSomething()MyObj.DoSomething()FinallyFinally MyObj.Dispose()MyObj.Dispose()End TryEnd Try
Using MyObj as New DisposableObjectUsing MyObj as New DisposableObject MyObj.DoSomething()MyObj.DoSomething()End UsingEnd Using
Dim Temp As DisposableObject = New DisposableObjectDim Temp As DisposableObject = New DisposableObjectTryTry Temp.DoSomething()Temp.DoSomething()FinallyFinally If (Temp IsNot Nothing) Then _If (Temp IsNot Nothing) Then _ DirectCast(Temp, IDisposable).Dispose() DirectCast(Temp, IDisposable).Dispose()End TryEnd Try
Metodi e OverloadingMetodi e Overloading
MetodoMetodoPermette di definire delle azioni che l’oggetto deve Permette di definire delle azioni che l’oggetto deve compierecompiere
Car.Faster()Car.Faster()
Guideline: I nomi dei metodi sono PascalCaseGuideline: I nomi dei metodi sono PascalCase
Non si applica ai valori di ritornoNon si applica ai valori di ritorno
Class CarClass Car ...... Public Sub Faster()Public Sub Faster() ...... End Sub End SubEnd ClassEnd Class
Class CarClass Car ...... Public Sub Faster()Public Sub Faster() ...... End Sub End Sub Public Sub Faster(maxSpeed as Integer)Public Sub Faster(maxSpeed as Integer) ...... End Sub End SubEnd ClassEnd Class
Shared Members Shared Members VB6VB6
ModuliModuli
VB.NETVB.NET
Moduli -> Classi con metodi statici (Shared)Moduli -> Classi con metodi statici (Shared)
Class CarClass Car ...... Public Public SharedShared Function GetConsumo(km as Int32,_ Function GetConsumo(km as Int32,_
litri as Int32) as Singlelitri as Int32) as Single ...... End Sub End SubEnd ClassEnd Class
Dim Consumo as Double = Dim Consumo as Double = CarCar.GetConsumo(100,6).GetConsumo(100,6)
Shared Fields Shared Fields VB6VB6
Necessità di avere dei fields condivisi dalle varie istanzeNecessità di avere dei fields condivisi dalle varie istanze
La classe usava un campo definito in un moduloLa classe usava un campo definito in un modulo
Class CarClass Car Private Private SharedShared carOwner as String carOwner as String Public Property Owner() As StringPublic Property Owner() As String GetGet Return carOwnerReturn carOwner End GetEnd Get Set(ByVal Value As String)Set(ByVal Value As String) carOwner = ValuecarOwner = Value End SetEnd SetEnd PropertyEnd PropertyEnd ClassEnd Class Dim c as New CarDim c as New Car
c.Owner=“Corrado”c.Owner=“Corrado”Dim k as New CarDim k as New CarConsole.WriteLine(k.Owner)Console.WriteLine(k.Owner) ‘Corrado‘Corrado
Proprietà SharedProprietà Shared Class CarClass Car Private Private SharedShared carOwner as String carOwner as String Public Public SharedShared Property Owner() As Property Owner() As StringString GetGet Return carOwnerReturn carOwner End GetEnd Get Set(ByVal Value As String)Set(ByVal Value As String) carOwner = ValuecarOwner = Value End SetEnd SetEnd PropertyEnd PropertyEnd ClassEnd Class
Le proprietà Le proprietà Shared Shared non non possonopossono accedere accedere a field non Shareda field non Shared
Accedete sempre a item statici usando Accedete sempre a item statici usando NomeClasse.XXXNomeClasse.XXX
Il compilatore emette warning se accedete via istanzaIl compilatore emette warning se accedete via istanza
Definite un costruttore privato per Classi staticheDefinite un costruttore privato per Classi statiche
Car.Owner=“Corrado”Car.Owner=“Corrado”Console.WriteLine(Car.Owner) ‘CorradoConsole.WriteLine(Car.Owner) ‘Corrado
Dim k as New Car()Dim k as New Car()k.Owner=“Mario” ‘Warning!k.Owner=“Mario” ‘Warning!
EventiEventiEventiEventi
Sono internamente basati su Sono internamente basati su DelegatesDelegates
DelegatesDelegatesSono l’equivalente .NET dei puntatori a funzione del Sono l’equivalente .NET dei puntatori a funzione del CC
Sono type safeSono type safe
Si definisce attraverso la keyword Si definisce attraverso la keyword DelegateDelegate
Possiamo passare un Possiamo passare un metodometodo come parametro come parametro
Gestione degli eventiGestione degli eventiWithEventsWithEvents
AddHandlerAddHandler
RemoveHandlerRemoveHandler
HandlesHandles
InterfacceInterfaccePublicPublic Interface Interface ICar ICar Sub Start()Sub Start() Sub Faster()Sub Faster() Sub Slower()Sub Slower() ReadOnly Property Speed() As IntegerReadOnly Property Speed() As Integer Event LowOil()Event LowOil() ‘‘End InterfaceEnd Interface
In VB6 si usava una classeIn VB6 si usava una classeNo scopeNo scopeNo implementazioneNo implementazione
Public Class CarPublic Class Car ImplementsImplements ICar ICar ‘Enter ‘Enter ...... Public Sub Faster() Public Sub Faster() ImplementsImplements ICar.Faster ICar.Faster End SubEnd Sub Public Event LowOil() Public Event LowOil() ImplementsImplements ICar.LowOil ICar.LowOil Public ReadOnly Property Speed() As Integer Public ReadOnly Property Speed() As Integer ImplementsImplements ICar.Speed ICar.Speed GetGet End GetEnd Get End PropertyEnd Property ......End ClassEnd Class
Implements ha parecchi vantaggi...Implements ha parecchi vantaggi...
InterfacceInterfacce
Public Class Car ...Public Class Car ... PrivatePrivate Sub Faster() Sub Faster() ImplementsImplements ICar.Faster ICar.Faster End SubEnd Sub Public Sub AutoPilot()Public Sub AutoPilot() End SubEnd Sub ......End ClassEnd Class
Public Class Car : Implements Public Class Car : Implements ICar,ITruckICar,ITruck PrivatePrivate Sub Faster() Sub Faster() Implements _Implements _ ICar.Faster,ICar.Faster,ITruck.FasterITruck.Faster End SubEnd Sub Public Sub AutoPilot()Public Sub AutoPilot() End SubEnd Sub ......End ClassEnd Class
Il framework fa largo uso di interfacceIl framework fa largo uso di interfacce
Insiemi di oggettiInsiemi di oggetti
System.Collections namespaceSystem.Collections namespaceArrayListArrayListHashTableHashTableSortedListSortedListStackStackQueueQueue
Ogni oggetto permette di gestire insiemi Ogni oggetto permette di gestire insiemi di oggetti con caratteristiche proprie di oggetti con caratteristiche proprie
HashTableHashTableE’ un array autodimensionante E’ un array autodimensionante
Implementa IDictionaryImplementa IDictionary
La ricerca è By Key (Object)La ricerca è By Key (Object)
Gli items non sono memorizzati secondo un ben preciso ordineGli items non sono memorizzati secondo un ben preciso ordine
Dim list as New HashTable(10)Dim list as New HashTable(10)For i as Integer=0 to 9For i as Integer=0 to 9 Dim c as New CarDim c as New Car list.Add(“car”+i.ToString,c)list.Add(“car”+i.ToString,c)NextNext
Dim c as Car= DirectCast(list(“car6”), Car)Dim c as Car= DirectCast(list(“car6”), Car)
For Each c as Car in listFor Each c as Car in list ......NextNext
SortedListSortedListE’ un array autodimensionanteE’ un array autodimensionante
Gli Items sono ordinati (usando IComparable)Gli Items sono ordinati (usando IComparable)La ricerca è By KeyLa ricerca è By KeySorting <>PerformancesSorting <>Performances
Dim list as New SortedList(10)Dim list as New SortedList(10)For i as Integer=0 to 9For i as Integer=0 to 9 Dim c as New CarDim c as New Car list.Add(“car”+i.ToString,c)list.Add(“car”+i.ToString,c)NextNext
Dim c as Car= DirectCast(list(“car6”), Car)Dim c as Car= DirectCast(list(“car6”), Car)
For Each c as Car in listFor Each c as Car in list ......NextNext
StackStackE’ una pila autodimensionanteE’ una pila autodimensionante
LIFO – Last In, First OutLIFO – Last In, First OutPush, Pop e PeekPush, Pop e Peek
Dim list as New Stack()Dim list as New Stack()
list.list.PushPush(“a”)(“a”)list.list.PushPush(“b”)(“b”)list.list.PushPush(“c”)(“c”)
Console.WriteLine(list.Pop)‘cConsole.WriteLine(list.Pop)‘c
QueueQueueE’ una coda autodimensionanteE’ una coda autodimensionante
FIFO – First In, First OutFIFO – First In, First OutEnqueue, Dequeue e PeekEnqueue, Dequeue e Peek
Dim list as New Queue()Dim list as New Queue()
list.list.EnqueueEnqueue(“a”)(“a”)list.list.EnqueueEnqueue(“b”)(“b”)list.list.EnqueueEnqueue(“c”)(“c”)
Console.WriteLine(list.Console.WriteLine(list.DequeueDequeue)) ‘a‘a
Altri tipi di collezioni sono disponibili in Altri tipi di collezioni sono disponibili in System.Collection.SpecializedSystem.Collection.SpecializedNameValueCollectionNameValueCollection
...e le collezioni tipizzate? ...attendere prego......e le collezioni tipizzate? ...attendere prego...
EreditarietàEreditarietà
Classi con funzionalità e interfacce molto simili ad Classi con funzionalità e interfacce molto simili ad un altraun altra
Modifica della classe (errori,interfaccia non congrua)Modifica della classe (errori,interfaccia non congrua)Copia e IncollaCopia e Incolla
Il codice potrebbe non essere disponibileIl codice potrebbe non essere disponibileEredità per delegaEredità per delegaParecchio codice per il wrapping della classe internaParecchio codice per il wrapping della classe interna
Car
Car
SuperCaSuperCarr
StartStart
StartStartFasterFaster
EreditarietàEreditarietàCreare una classe che eredita da un altraCreare una classe che eredita da un altra
Eredita Interfaccia e ImplementazioneEredita Interfaccia e ImplementazioneInheritsInheritsNon è necessarioNon è necessario
Source CodeSource CodeStesso linguaggio (C# <-> VB.NET)Stesso linguaggio (C# <-> VB.NET)
Dim sc as New SuperCarDim sc as New SuperCarsc.Start()sc.Start()Sc.Faster()Sc.Faster()
Public Class SuperCarPublic Class SuperCar InheritsInherits Car CarEnd ClassEnd Class
Public Class SuperCarPublic Class SuperCar InheritsInherits Car Car Public Sub TurboPublic Sub Turbo End SubEnd SubEnd ClassEnd Class
Dim sc as New SuperCarDim sc as New SuperCarsc.Start()sc.Start() ‘Car‘Carsc.Faster()sc.Faster() ‘Car‘Carsc.Turbo()sc.Turbo() ‘SuperCar‘SuperCar
EreditarietàEreditarietàConcettiConcetti
La classe da cui si eredita è definita classe La classe da cui si eredita è definita classe BaseBasePosso ereditare da qualsiasi classe .NET (che lo permette)Posso ereditare da qualsiasi classe .NET (che lo permette)Tutte le classi in .NET ereditano da Tutte le classi in .NET ereditano da System.ObjectSystem.ObjectSi definisce una relazione Si definisce una relazione “Is a”“Is a” (é un) (é un)
In .NET tutto è ObjectIn .NET tutto è Object
Dim c as Car= New SuperCarDim c as Car= New SuperCarc.Start()c.Start()c.Turbo()c.Turbo() ‘‘ErroreErrore
Public Class SuperCarPublic Class SuperCar InheritsInherits Car Car Public Sub TurboPublic Sub Turbo End SubEnd SubEnd ClassEnd Class
Una classe può ereditare da una sola classe baseUna classe può ereditare da una sola classe baseSingle InheritanceSingle Inheritance
CovarianzaCovarianza
OverrideOverrideLa classe che eredita può modificare il comportamento della classe baseLa classe che eredita può modificare il comportamento della classe base
Ridefinendone i metodi/proprieta/eventiRidefinendone i metodi/proprieta/eventiLa classe base deve permetterne la redifinizioneLa classe base deve permetterne la redifinizioneOverridableOverridable
Public Class Car Public Class Car Public Public OverridableOverridable Sub Faster Sub Faster Console.WriteLine(“base”)Console.WriteLine(“base”) End SubEnd SubEnd ClassEnd Class Public Class SuperCarPublic Class SuperCar
InheritsInherits Car Car Public Public OverridesOverrides Sub Faster Sub Faster Console.WriteLine(“Inherited”)Console.WriteLine(“Inherited”) End SubEnd SubEnd ClassEnd Class
Dim c As Car = New SuperCar()Dim c As Car = New SuperCar()c.Faster()c.Faster() ‘‘InheritedInherited
OverrideOverrideUn metodo dichiarato Un metodo dichiarato OverridesOverrides::
E’ automaticamente OverridableE’ automaticamente OverridableSi può usare Si può usare NotOverridableNotOverridable per modificarne il comportamento per modificarne il comportamento
Public Class SuperCar: Public Class SuperCar: InheritsInherits Car Car Public Public NotOverridableNotOverridable OverridesOverrides Sub Faster Sub Faster Console.WriteLine(“Inherited”)Console.WriteLine(“Inherited”) End SubEnd SubEnd ClassEnd Class
MyBaseMyBaseRappresenta la classe da cui si sta ereditando Rappresenta la classe da cui si sta ereditando
Public Class SuperCar: Public Class SuperCar: InheritsInherits Car Car Public Overrides ReadOnly Property Model as StringPublic Overrides ReadOnly Property Model as String Return Return MyBase.ModelMyBase.Model + “ Super” + “ Super” End SubEnd SubEnd ClassEnd Class
OverrideOverrideI costruttori non vengono ereditatiI costruttori non vengono ereditati
No problem se non avete dei costruttori parametrici (usa default)No problem se non avete dei costruttori parametrici (usa default)Dovete invocarli esplicitamente (prima istruzione)Dovete invocarli esplicitamente (prima istruzione)
Public Class SuperCar: Public Class SuperCar: InheritsInherits Car Car Public Sub New (cilindrata as Integer)Public Sub New (cilindrata as Integer) MyBase.New(cilindrata)MyBase.New(cilindrata) ‘Inizializzo la classe base‘Inizializzo la classe base End SubEnd SubEnd ClassEnd Class
Public Class CarPublic Class Car Public Sub New (cilindrata as Integer)Public Sub New (cilindrata as Integer) End SubEnd SubEnd ClassEnd Class
Public Class Car Public Class Car Private Sub IncreaseSpeedPrivate Sub IncreaseSpeed MeMe.Faster().Faster() End SubEnd SubEnd ClassEnd Class
Override, classe base e MeOverride, classe base e MeQuando associate un istanza di una classe ereditata ad una Quando associate un istanza di una classe ereditata ad una variabile di tipo base, la classe base “vede” l’implementazione variabile di tipo base, la classe base “vede” l’implementazione dei metodi della classe ereditatadei metodi della classe ereditata
Public Class Car Public Class Car Public Public OverridableOverridable Sub Faster Sub Faster Console.WriteLine(“base”)Console.WriteLine(“base”) End SubEnd SubEnd ClassEnd Class Public Class SuperCar: Public Class SuperCar: InheritsInherits Car Car
Public Public OverridesOverrides Sub Faster Sub Faster Console.WriteLine(“Inherited”)Console.WriteLine(“Inherited”) End SubEnd SubEnd ClassEnd Class
Dim c as Car= New SuperCarDim c as Car= New SuperCarc.Faster()’c.Faster()’ InheritedInherited
MeMe non indicanon indica il contesto corrente il contesto corrente
Public Class Car Public Class Car Private Sub IncreaseSpeedPrivate Sub IncreaseSpeed MyClassMyClass.Faster().Faster() End SubEnd SubEnd ClassEnd Class
MyClassMyClassMyClassMyClass permette di specificare che il contesto di esecuzione permette di specificare che il contesto di esecuzione sia quello della classe base e non quello di eventuali overrides sia quello della classe base e non quello di eventuali overrides in classi ereditanti da essain classi ereditanti da essa
Viene eseguito il metodo Faster della classe CarViene eseguito il metodo Faster della classe CarNon disponibile in C#Non disponibile in C#
Public Class Car Public Class Car Protected Sub IncreaseSpeedProtected Sub IncreaseSpeed End Sub End SubEnd ClassEnd Class
Protected scopeProtected scopeProtected rende visibile un elemento alle sole classi ereditanti o alla Protected rende visibile un elemento alle sole classi ereditanti o alla classe che lo definisceclasse che lo definisceSi usa quando un metodo è utile al colloquio tra classe base e Si usa quando un metodo è utile al colloquio tra classe base e classe ereditanteclasse ereditante
Public Class SuperCar: Public Class SuperCar: InheritsInherits Car Car Public Sub FasterPublic Sub Faster MyBase.IncreaseSpeed()MyBase.IncreaseSpeed() End SubEnd SubEnd ClassEnd Class
Dim c As New CarDim c As New Carc.IncreaseSpeed()’ c.IncreaseSpeed()’ ErroreErrore
Può essere abbinato con FriendPuò essere abbinato con Friend
Public Class SuperCar: Public Class SuperCar: InheritsInherits Car Car Public Public ShadowsShadows Sub Faster Sub Faster Console.WriteLine(“Inherited”)Console.WriteLine(“Inherited”) End SubEnd SubEnd ClassEnd Class
ShadowsShadowsOverrides funziona se il metodo della classe base è virtualOverrides funziona se il metodo della classe base è virtual
Potrebbe non esserlo (I metodi Overridable sono più ‘lenti’)Potrebbe non esserlo (I metodi Overridable sono più ‘lenti’)Potremmo non poterlo modificarePotremmo non poterlo modificare
ShadowsShadowsPermette di ridefinire metodi già presenti nella classe basePermette di ridefinire metodi già presenti nella classe base
Sono a tutti gli effetti delle nuove implementazioniSono a tutti gli effetti delle nuove implementazioniSono ignorate dalla classe base (no ereditarietà)Sono ignorate dalla classe base (no ereditarietà)Va usato per ridefinire membri SharedVa usato per ridefinire membri Shared
Dim c as Car= New SuperCarDim c as Car= New SuperCarc.Faster()’c.Faster()’ basebase
In alcuni casi potremmo non volere che qualcuno erediti la nostra classeIn alcuni casi potremmo non volere che qualcuno erediti la nostra classe
NotInheritable e MustInheritNotInheritable e MustInheritNotInheritableNotInheritable
Indica che la classe non è ereditabile Indica che la classe non è ereditabile (sealed class)(sealed class)
Public Public NotInheritableNotInheritable Class Car Class Car End ClassEnd Class
Public Class SuperCarPublic Class SuperCar InheritsInherits Car ‘ Car ‘ErroreErroreEnd ClassEnd Class
MustInherithMustInherithNon può essere istanziata Non può essere istanziata (abstract class)(abstract class)Può essere usata solo Può essere usata solo ereditandoereditando da essa da essaSpesso contiene dei metodi definiti Spesso contiene dei metodi definiti MustOverrideMustOverridePermette di definire delle classi che hanno funzionalità parzialePermette di definire delle classi che hanno funzionalità parziale
Public Public MustInheritMustInherit Class Car Class Car Public Public MustOverrideMustOverride Sub Faster Sub Faster End SubEnd SubEnd ClassEnd Class
Classe Astratta: CollectionBaseClasse Astratta: CollectionBaseSystem.Collection.CollectionBaseSystem.Collection.CollectionBase
Permette di creare collezioni tipizzatePermette di creare collezioni tipizzate
Public Class Cars : Inherits Public Class Cars : Inherits CollectionBaseCollectionBase Public Sub Public Sub AddAdd(ByVal item As (ByVal item As CarCar)) MyBase.InnerListMyBase.InnerList.Add(item).Add(item) End SubEnd Sub
DefaultDefault Property Item(ByVal index As Integer) As Property Item(ByVal index As Integer) As CarCar GetGet Return DirectCast(Return DirectCast(MyBase.InnerList(index)MyBase.InnerList(index), Car), Car) End GetEnd Get Set(ByVal Value As Car)Set(ByVal Value As Car) MyBase.InnerList(index) = ValueMyBase.InnerList(index) = Value End SetEnd Set End PropertyEnd PropertyEnd ClassEnd Class Dim l as New Cars()Dim l as New Cars()
l.Add(New Car())l.Add(New Car()) ‘‘okokl.Add (New Truck()) l.Add (New Truck()) ‘‘ErroreErrore
Generics CollectionsGenerics Collections
Public Class ListPublic Class List Private elements() As ObjectPrivate elements() As Object Private count As IntegerPrivate count As Integer
Public Sub Add(ByVal element As Object)Public Sub Add(ByVal element As Object) If count = elements.Length Then Resize(count * 2)If count = elements.Length Then Resize(count * 2) elements(count) = element : count += 1elements(count) = element : count += 1 End SubEnd Sub
Public Default Property Item(ByVal Index _Public Default Property Item(ByVal Index _ As Integer) As ObjectAs Integer) As Object Get Get
Return elements(index) Return elements(index) End GetEnd Get Set (value as object) Set (value as object) elements(index) = value elements(index) = value End SetEnd Set End Property End Property End ClassEnd Class
Dim intList As New List()Dim intList As New List()
intList.Add(1) ‘ Boxing!intList.Add(1) ‘ Boxing!intList.Add(2) ‘ Boxing!intList.Add(2) ‘ Boxing!intList.Add(“Pippo") ‘ No error… intList.Add(“Pippo") ‘ No error…
i = CInt(intList(0)) ‘ Richiesto casti = CInt(intList(0)) ‘ Richiesto cast
Public Class ListPublic Class List(Of T)(Of T) Private elements() As Private elements() As TT Private count As IntegerPrivate count As Integer
Public Sub Add(ByVal element As Public Sub Add(ByVal element As TT)) If count = elements.Length Then Resize(count * 2)If count = elements.Length Then Resize(count * 2) elements(count) = element : count += 1elements(count) = element : count += 1 End SubEnd Sub
Public Default Property Item(ByVal Index _Public Default Property Item(ByVal Index _ As Integer) As As Integer) As TT Get Get
Return elements(index) Return elements(index) End GetEnd Get Set (value as Set (value as TT) ) elements(index) = value elements(index) = value End SetEnd Set End PropertyEnd PropertyEnd ClassEnd Class
Dim intList As New List(Of Int32)Dim intList As New List(Of Int32)
intList.Add(1) ‘ No Boxing!intList.Add(1) ‘ No Boxing!intList.Add(2) ‘ No Boxing!intList.Add(2) ‘ No Boxing!intList.Add(“Pippo") ‘ Error… intList.Add(“Pippo") ‘ Error…
i = intList(0)i = intList(0) ‘ Non serve castare ‘ Non serve castare
Generics CollectionsGenerics Collections
Collection ClassesCollection Classes
List (of T)Dictionary (Of K,V)SortedDictionary (Of K,V)Stack(Of T)Queue(Of T)
Collection InterfacesCollection Interfaces List (of T)IDictionary (Of K,V)ICollection (Of T)IEnumerable (Of T)IEnumerator (Of T)IComparable(Of T)IComparer(Of T)
Collection Base ClassesCollection Base Classes
Collection (Of T)KeyedCollection (Of T)ReadOnlyCollection(Of T)
Public Class TypedCollection(Of T) _Public Class TypedCollection(Of T) _Inherits System.Collections.Inherits System.Collections.ObjectModelObjectModel.Collection(Of T).Collection(Of T)......End ClassEnd Class
Dim Coll as New TypedCollection(Of DataTable)Dim Coll as New TypedCollection(Of DataTable)Coll.Add(new DataTable())Coll.Add(new DataTable())
Dim coll As New List(Of DataTable)Dim coll As New List(Of DataTable)
Generics MethodsGenerics Methods
Dim X As Int32 = 3Dim X As Int32 = 3Dim Y As Int32 = 4Dim Y As Int32 = 4
Dim Z As Int32 = IIf(X>Y,X,Y) ‘Dim Z As Int32 = IIf(X>Y,X,Y) ‘ErrorError
Dim Z As Int32 = MyIIF(Of Int32)(X>Y,X,Y) ‘No cast!Dim Z As Int32 = MyIIF(Of Int32)(X>Y,X,Y) ‘No cast!
Dim Z As Int32 = MyIIF(X>Y,X,Y) ‘ Type inferencingDim Z As Int32 = MyIIF(X>Y,X,Y) ‘ Type inferencing
Public Function MyIIF (Of T)(cond As Boolean, _Public Function MyIIF (Of T)(cond As Boolean, _trueP As T, falseP As T) As TtrueP As T, falseP As T) As T If (cond) Then If (cond) Then Return trueP Return trueP ElseElse Return falseP Return falseP End If End IfEnd SubEnd Sub
Generics ConstraintsGenerics Constraints
Public Class CarPublic Class Car(Of T)(Of T)Private _Navigator As Private _Navigator As TT
Public ReadOnly Property Navigator As Public ReadOnly Property Navigator As TTGetGet Return _Navigator Return _Navigator End GetEnd GetEnd ClassEnd Class
Dim Car1 As New Car(Of TomTom)Dim Car1 As New Car(Of TomTom)Car1.Navigator.RouteTo()’ Car1.Navigator.RouteTo()’ ErrorError
Public Class Car _Public Class Car _(Of T As(Of T As {New,BaseClass,I1,I2,Class,Structure}{New,BaseClass,I1,I2,Class,Structure}))Private _Navigator As New Private _Navigator As New TT
Public ReadOnly Property Navigator As Public ReadOnly Property Navigator As TTGetGet Return _Navigator Return _Navigator End GetEnd GetEnd ClassEnd Class
Public Class CarPublic Class Car(Of T)(Of T)Private _Navigator As Private _Navigator As NewNew TT
Public ReadOnly Property Navigator As Public ReadOnly Property Navigator As TTGetGet Return _Navigator Return _Navigator End GetEnd GetEnd ClassEnd Class
Public Class CarPublic Class Car(Of T (Of T As NewAs New))Private _Navigator As New Private _Navigator As New TT
Public ReadOnly Property Navigator As Public ReadOnly Property Navigator As TTGetGet Return _Navigator Return _Navigator End GetEnd GetEnd ClassEnd Class
Operator OverloadingOperator Overloading
Public Class SetPointPublic Class SetPoint Public Temperature as Single Public Temperature as Single Public Sub New (value as Single) Public Sub New (value as Single) Me.Temperature=valueMe.Temperature=value End Sub End SubEnd ClassEnd Class
Dim T1 as New SetPoint(12.5)Dim T1 as New SetPoint(12.5)Dim T2 as New SetPoint(13)Dim T2 as New SetPoint(13)Dim T3 as SetPoint = T1 + T2Dim T3 as SetPoint = T1 + T2
Public Class SetPointPublic Class SetPoint Public Temperature as Single Public Temperature as Single Public Sub New (value as Single) Public Sub New (value as Single) Me.Temperature=valueMe.Temperature=value End Sub End Sub
Public Shared Public Shared OperatorOperator +(ByVal a As SetPoint,_ +(ByVal a As SetPoint,_ ByVal b As SetPoint) As SetPointByVal b As SetPoint) As SetPoint
Return New SetPoint(a.Temperature + b.Temperature)Return New SetPoint(a.Temperature + b.Temperature)End OperatorEnd Operator
End ClassEnd Class
Operator OverloadingOperator OverloadingAlcuni operatori sono accoppiatiAlcuni operatori sono accoppiati
<> e =<> e =
> e <> e <
>= e <=>= e <=
IsTrue e IsFalseIsTrue e IsFalse
AndAlsoAndAlso
Richiede AndRichiede Anddeve ritornare un tipo simile a quello in cui è definitodeve ritornare un tipo simile a quello in cui è definito
Richiede la definizione di IsFalse/IsTrueRichiede la definizione di IsFalse/IsTrue
CTypeCType è l’operatore di conversione è l’operatore di conversione
Widening – ImpliciteWidening – Implicite
Narrowing – EspliciteNarrowing – Esplicite