learn & get … ovvero come sopravvivere alla migrazione da vb6 a vb2005

75
Learn & Learn & Get Get Ovvero come sopravvivere alla Ovvero come sopravvivere alla migrazione da VB6 a VB2005 migrazione da VB6 a VB2005

Upload: debora-romagnoli

Post on 01-May-2015

221 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

Learn & Learn & GetGet… … Ovvero come sopravvivere alla Ovvero come sopravvivere alla migrazione da VB6 a VB2005migrazione da VB6 a VB2005

Page 2: Learn & Get … Ovvero come sopravvivere alla migrazione 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

Page 3: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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)

Page 4: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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...

Page 5: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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”)

Page 6: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 7: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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!

Page 8: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 9: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 10: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 11: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

VB 2005: Il VB 2005: Il linguaggiolinguaggio

Attenzione: Attenzione: Non stiamo parlando di Non stiamo parlando di VB7VB7

Page 12: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 13: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 14: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 15: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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)

Page 16: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 17: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 18: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 19: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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)

Page 20: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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”

Page 21: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 22: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 23: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 24: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 25: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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(...)

Page 26: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 27: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 28: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 29: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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?

Page 30: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 31: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 32: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

Visual Studio 2005Visual Studio 2005OverviewOverview

Page 33: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 34: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

““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

Page 35: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 36: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 37: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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)

Page 38: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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/

Page 39: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 40: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 41: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

VB 2005: Novità OOPVB 2005: Novità OOP

Page 42: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 43: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 44: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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!

Page 45: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 46: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 47: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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)

Page 48: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 49: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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!

Page 50: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 51: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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...

Page 52: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 53: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 54: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 55: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 56: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 57: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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...

Page 58: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 59: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 60: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 61: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 62: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 63: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 64: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 65: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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#

Page 66: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 67: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 68: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 69: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 70: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 71: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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)

Page 72: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 73: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 74: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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

Page 75: Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005

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