La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

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

Presentazioni simili


Presentazione sul tema: "Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005."— Transcript della presentazione:

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

2 Perchè.NET ? Tecnologia nella quale Microsoft ha investito molto (Tempo e $$$) creata dai migliori architetti software (MS e non) Tecnologia alla base di tutti i nuovi prodotti (da SQL Server 2005 a Windows Vista) Standard ISO E il futuro di Microsoft, COM è il passato

3 Perchè.NET ? Progetto nato nel 1998 come evoluzione di COM, Alpha a PDC 2000 Effetto scrivania... Le applicazioni di oggi hanno necessità diverse (Connettività, Interazione...) I linguaggi devono interagire tra loro Il sistema operativo si è evoluto seguendo una logica di espansione DLL Hell Eliminare gli errori del passato (COM)

4 Perchè.NET ? Strato software che si interpone tra lapplicazione e il sistema operativo Codice MSIL C#,VB.NET....NET Framework CLR (Garbage Collector,Eccezioni,Multithreading) BCL (Tipi Base) Sistema Operativo (Windows 98/NT/2000/XP/2003/CE e Altri) Circa 8000 classi...

5 Vantaggi del.NET Framework (#1) Modello di programmazione OOP comune basta (!?) accessi alle DLL Utilizzo facilitato (IUnknown,AddRef,Registrazioni...) Aggiornamenti facilitati (basta RegSvr32!) Distribuzione semplificata (XCopy) Side by Side execution Codice ottimizzato per la piattaforma di esecuzione Codice sicuro in quanto gestito (managed)

6 Vantaggi del.NET Framework (#2) Integrazione dei linguaggi (CTS è comune) Gestione automatica della memoria (Garbage Collector) Totalmente gratuito! a244-c96d69c35dec&DisplayLang=en

7 Codice IL e Metadati VB.NET Compilatore vbc.exe Codice IL e Metadati JIT Compiler Codice x86 RUN!

8 Codice IL e Metadati Public Sub Main Console.WriteLine(Ciao) Console.WriteLine(Ciao) Console.WriteLine(A tutti!) Console.WriteLine(A tutti!) End Sum Il JIT Analizza tutti i tipi (oggetti) utilizzati in Main Riserva una struttura dati per ogni metodo associa un puntatore ad una funzione JITCompiler Quando un metodo viene invocato, compila il codice, aggiorna il puntatore al codice X86 ed esegue il codice La seconda WriteLine non deve essere ricompilata Il codice viene compilato on demand e ottimizzato sulla macchina client

9 Common Language Runtime BCL - Libreria di classi ADO.NET : Accesso ai dati e XML ASP.NET : Web Forms e servizi Windows Forms.NET Framework blocks

10 Riassumendo... Redist circa 22 MB Non supporta Windows 95 Per sviluppare serve Win2000 o superiore Lattuale versione è la 2.0 Il framework funziona Side-by-Side Visual Studio 2005 supporta solo il framework 2.0 Non serve per applicazioni ASP.NET (lato client) Esiste per Linux (Mono) Esiste per Pocket PC,SmartPhones, Embedded Su NT serve Sp6a Richiede IE 5.01 o superiore Richiede Windows Installer 3.0

11 VB 2005: Il linguaggio Attenzione: Non stiamo parlando di VB7

12 Files.vb In VB6 ci sono diverse estensioni (cls, frm...) In VB2005 esiste una sola estensione.vb che può (anche) contentere più classi e/o moduli. Il nome della classe non è legato al nome del file File MyFile1.vb Public Class Person … End Class File MyFile2.vb Module MainModule … End Module File MyFile3.vb Public Class Person2 … End Class Module MainModule2 … End Class

13 Program EntryPoint In VB6 un applicativo può partire da un Form o da una Sub Main In VB pure però.. La Sub Main non deve necessariamente stare in un modulo VB 2005 però, by default, utilizza lApplication Framework Application Framework Permette di gestire un applicazione in maniera più semplice Offre una serie di eventi tipici di un applicazione Startup, Shutdown StartupNextInstanceUnhandledException

14 Namespaces Il compilatore ha bisogno di sapere esattamente quale classe instanziare Possono esserci dei conflitti Sono dei raggruppamenti Logici I moduli e le classi vivono nei Namespaces VB Imposta un root namespace VB.NET definisce degli imports globali La keyword Imports permette di importare i namespaces Imports System.IO Imports Test=System.IO Permette di evitare di scrivere il percorso completo a un namespace Posso creare un namespace allinterno di un altro namespace Usare Global per far riferimento al root namespace

15 Variabili Global Variables (usare Shared) Usare Option Explicit e Option Strict Dichiarazioni multiple sulla stessa riga Block scope (cicli For,Do...Loop)

16 Data Types Byte (*) Char (2 bytes) [Ac] Boolean (4 bytes) Short (2 bytes) ex Integer di VB6 (*) Integer (4 bytes) ex Long di VB6 (*) Long (8 bytes) (*) Currency -> Decimal (16 bytes) SingleDoubleDate Sono Alias dei tipi definiti nel.NET framework (Int16, Int32...) (*) Sono sia signed che Unsigned Per ognuno esiste il relativo operatore di conversione e la classe Convert. I tipi unsigned non sono CLS compliant

17 Nullable Types Sono Value Types che possono essere Nothing Dim i As Integer= Nothing Value=0 Sono basati sulla classe generica Nullable Nullable.GetValueOrDefault() La properietà HasValue indica se il nullable ha un valore associato Dim i As Nullable(Of DateTime)= Nothing Value=Nothing

18 Data Types - String Il framework non supporta le stringhe a lunghezza fissa VB6 Dim s As String * 20 VB 2005 Dim s As New String( c,20) Le stringhe sono immutabili Usate StringBuilder Usate le costanti ControlChars.X

19 Inizializzazione E possibile dichiarare e inizializzare con lo stesso statement. Dim x As integer=9 Inizializzazione di oggetti Dim o As Person O=New Person() Dim o As New Person() è identico (In VB6 non lo era)

20 Assegnazione Le proprietà di Default non esistono più Si può usare se la proprietà ha un indice Set non si usa più Nuovi operatori X+=1X-=1X*=nX\=nY^=ns+=xyz Usare & oppure +? s=s & ciao s=s + ciao

21 Value Types Ereditano le caratteristiche da System.ValueType Enum, Structures, Integer... Tipi base Sono memorizzate sullo stack Memorizzano il valore della variabile

22 Reference Types Sono memorizzate nella memoria Heap Contengono un riferimento alla variabile Stringhe, Objects Sono controllati dal Garbage Collector Attenzione alle assegnazioni Dim s as String=pippo &H1230Ciao &H1235pippo...pluto &H1235 Heap

23 Boxing-Unboxing E la conversione di un value type in un reference type e viceversa E un operazione dispendiosa in termini di prestazioni e memoria Accade quando si associa un Value Type ad una variabile di tipo Object Usare CType() o DirectCast() per convertire CType tenta la conversione del tipo DirectCast è più veloce (solo reference types) TryCast è un operatore di cast che ritorna Nothing se il casting fallisce

24 Enum Simili a VB6 E possibile definire il tipo usato dallEnum E possibile decorare un enumerato con E possibile decorare un enumerato con Il tipo Enum è presente nel framework ed espone metodi per la gestione degli enum ParseGetValues

25 Array Sono 0 (zero!) based Dim k() as Integer(0 to 10) Il valore usato nella Dim è lupper bound! Dim a(3,2) as Integer [Matrici] Array Initializers Dim x() as Int32={1,2,3} Non si può usare ReDim per dimensionare un array Sono basati sulla classe Array del Framework Array.CloneArray.Copy(...)

26 Strutture Sono Value Types In VB6 si usava Type-End Type In VB 2005 si usa Structure-End Structure Possono essere viste come classi leggere Possono avere metodi, proprietà ed eventi

27 Procedure e Funzioni I Parametri sono ByVal (erano ByRef in VB6) Si può usare Return per ritornare un valore ad una funzione Si possono usare parametri Optional Supportati solo da VB Sono un trucchetto per mantenere la compatibilità IsMissing non esiste più, bisogna dare un default Usare gli Overloads Le routines richiedono sempre le parentesi

28 Cicli e controllo di flusso VB 2005 offre le versioni cortocircuitate di And e Or IIF non è cortocircuitata While/Wend di VB6 diventa While/End While I cicli For/For Each permettono di dimensionare la variabile usata nel ciclo Statement Continue

29 Gestione degli errori VB 2005 offre ancora On Error... Meccanismo obsoleto Mantenuto per compatibilità Sostituito dalla gestione strutturata delle eccezioni Un eccezione è un anomalia che può capitare durante la vita dellapplicazione Lanomalia viene segnalata attraverso un oggetto Exception (o ereditato da esso) Exception.Message Exception.Source Exception.StackTrace Come faccio a intercettare le eccezioni?

30 Gestione degli errori : Try-Catch-Finally Per lanciare da codice un eccezione usare Throw [exception] E possibile passare leccezione originale usando InnerException Le eccezioni vanno indicate dalla più specifica alla generica Usate levento UnHandledException per intercettare eventuali errori non gestiti Non lanciate eccezioni inutilmente Usate Debug->Exceptions per controllare il debugger Try Catch ex As ArgumentException [When] Catch ex As ArgumentException [When] Catch ex As Exception Generica Catch ex As Exception Generica Finally Finally End Try

31 My Application Computer User Resources Settings Forms WebServices 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 Namespace

32 Visual Studio 2005 Overview

33 ExpressStandardProTeam Windows or Web Designers Code Editors and IntelliSense Programming Languages Remote Data Access Mobile Device Development User Experience SimplifiedSimplified Server Development/Debugging SQL Server 2005 Development Application Modeling, Code Profiling, Unit Testing, Static Code Analysis, Load Testing, Enterprise Source Control, Work Item Tracking

34 Personalizzare Visual Studio 2005 E il vostro strumento di lavoro, rendetelo piacevole e produttivo Import/Export Settings Colorare il testo come preferite Keyboard scheme (VB6) Task List personalizzabile Option Strict On !!! External Tools Creazione di macro da associare a combinazioni di tasti Object Browser Immediate window a design time Regions

35 Scelta di un Project Template Windows Application Class Library Windows Control Library ASP.NET Web Application / Service / Control Library Console Application Windows Service Custom templates

36 Ma dovè il comando Build di VB6? Ogni volta che premete F5 Visual Studio compila sempre il vostro progetto Leseguibile e tutti i files necessari sono nella cartella bin DebugRelase Debug vs Release La modalità Release non contiene le informazioni di debug Il codice è ottimizzato rispetto alla versione Debug

37 Struttura di un Progetto VB 2005 Solution Files (.sln,.suo) Rappresentano lintero applicativo e il suo stato Project Files (.vbproj) Windows Application Librerie Local Project Items Classi, Form, Moduli, ecc. (.vb) Risorse (.resx) Web Project Items XML Web services (.asmx) Web Form (.aspx) Global application classes (.asax)

38 IDE Features XML Comments Commenti aggiuntivi inseriti nel codice e gestiti dallintellisense Potete usarli per generare documentazione con NDoc Refactor Tool Lide supporta il name refactoring Code Snippets e Expansions Pezzi di codice pronti alluso e parametrizzabili Potete aggiungere i vostri

39 Compiler Features Smart Tags Autocorrezione del codice Warnings Il compilatore analizza in maniera dettagliata il codice Variabili inutilizzate Instanze non create Funzioni ricorsive Uso incorretto di Try/Catch

40 Debugger Features Edit & Continue come in VB6!!! DataTips Visualizzazione di tutti i dettagli di una variabile Visualizer Permettono di visualizzare i dati in maniera più chiara Potete creare i vostri visualizers BreakPointsTracePoints Scrivono delle informazioni quando il codice passa dal tracepoint Locals e Autos Window Conditional,Obsolete attributes Debug e My.Application.Log classes

41 VB 2005: Novità OOP

42 Classi Parziali Class Car … End Class Class Car … End Class File Class1.vb Public Class Car Public Sub Start() Public Sub Start() End Sub End Sub End Class File Class2.vb Public Partial Class Car Public Sub Stop() Public Sub Stop() End Sub End Sub End Class Dim T As New Car() T.Start()T.Stop() Le classi possono essere Nested

43 Uso dei Costruttori Sub New rimpiazza Class_Initialize Viene eseguita quando loggetto è istanziato Possiamo specificare più costruttori per la stessa classe (Overload) Può essere usato per simulare PublicNotCreatable di VB6 Public Sub New( ) intValue = 1 intValue = 1 End Sub Public Sub New(ByVal i As Integer) intValue = i intValue = i End Sub

44 Distruzione degli oggetti Sub Finalize rimpiazza levento Class_Terminate La usiamo per liberare le risorse usate dalloggetto Viene eseguita quando il GC distrugge loggetto Usiamo x = Nothing per permettere la Garbage Collection Attenzione: la distruzione potrebbe non avvenire immediatamente! Protected Overrides Sub Finalize( ) Rilascio delle risorse Rilascio delle risorse End Sub Se dovete rilasciare un oggetto immediatamente implementate il pattern Dispose Interfaccia IDisposable Usatelo solo quando veramente necessario!

45 Using Dim MyObj As New DisposableObject MyObj.DoSomething()MyObj.Dispose() Try MyObj.DoSomething() MyObj.DoSomething()Finally MyObj.Dispose() MyObj.Dispose() End Try Using MyObj as New DisposableObject MyObj.DoSomething() MyObj.DoSomething() End Using Dim Temp As DisposableObject = New DisposableObject Try Temp.DoSomething() Temp.DoSomething()Finally If (Temp IsNot Nothing) Then _ DirectCast(Temp, IDisposable).Dispose() If (Temp IsNot Nothing) Then _ DirectCast(Temp, IDisposable).Dispose() End Try

46 Metodi e Overloading Metodo Permette di definire delle azioni che loggetto deve compiere Car.Faster() Guideline: I nomi dei metodi sono PascalCase Non si applica ai valori di ritorno Class Car Public Sub Faster() Public Sub Faster()... End Sub... End Sub End Class Class 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 Sub End Class

47 Shared Members VB6ModuliVB.NET Moduli -> Classi con metodi statici (Shared) Class Car Public Shared Function GetConsumo(km as Int32,_ Public Shared Function GetConsumo(km as Int32,_ litri as Int32) as Single litri as Int32) as Single... End Sub... End Sub End Class Dim Consumo as Double = Car.GetConsumo(100,6)

48 Shared Fields VB6 Necessità di avere dei fields condivisi dalle varie istanze La classe usava un campo definito in un modulo Class Car Private Shared carOwner as String Private Shared carOwner as String Public Property Owner() As String Public Property Owner() As String Get Get Return carOwner Return carOwner End Get End Get Set(ByVal Value As String) Set(ByVal Value As String) carOwner = Value carOwner = Value End Set End Set End Property End Class Dim c as New Car c.Owner=Corrado Dim k as New Car Console.WriteLine(k.Owner)Corrado

49 Proprietà Shared Class Car Private Shared carOwner as String Private Shared carOwner as String Public Shared Property Owner() As String Public Shared Property Owner() As String Get Get Return carOwner Return carOwner End Get End Get Set(ByVal Value As String) Set(ByVal Value As String) carOwner = Value carOwner = Value End Set End Set End Property End Class Le proprietà Shared non possono accedere a field non Shared Accedete sempre a item statici usando NomeClasse.XXX Il compilatore emette warning se accedete via istanza Definite un costruttore privato per Classi statiche Car.Owner=Corrado Console.WriteLine(Car.Owner) Corrado Dim k as New Car() k.Owner=Mario Warning!

50 Eventi Eventi Sono internamente basati su Delegates Delegates Sono lequivalente.NET dei puntatori a funzione del C Sono type safe Si definisce attraverso la keyword Delegate Possiamo passare un metodo come parametro Gestione degli eventi WithEventsAddHandlerRemoveHandlerHandles

51 Interfacce Public Interface ICar Sub Start() Sub Start() Sub Faster() Sub Faster() Sub Slower() Sub Slower() ReadOnly Property Speed() As Integer ReadOnly Property Speed() As Integer Event LowOil() Event LowOil() End Interface In VB6 si usava una classe No scope No implementazione Public Class Car Implements ICarEnter Implements ICarEnter Public Sub Faster() Implements ICar.Faster Public Sub Faster() Implements ICar.Faster End Sub End Sub Public Event LowOil() Implements ICar.LowOil Public Event LowOil() Implements ICar.LowOil Public ReadOnly Property Speed() As Integer Implements ICar.Speed Public ReadOnly Property Speed() As Integer Implements ICar.Speed Get Get End Get End Get End Property End Property End Class Implements ha parecchi vantaggi...

52 Interfacce Public Class Car... Private Sub Faster() Implements ICar.Faster Private Sub Faster() Implements ICar.Faster End Sub End Sub Public Sub AutoPilot() Public Sub AutoPilot() End Sub End Sub End Class Public Class Car : Implements ICar,ITruck Private Sub Faster() Implements _ Private Sub Faster() Implements _ ICar.Faster,ITruck.Faster ICar.Faster,ITruck.Faster End Sub End Sub Public Sub AutoPilot() Public Sub AutoPilot() End Sub End Sub End Class Il framework fa largo uso di interfacce

53 Insiemi di oggetti System.Collections namespace ArrayListHashTableSortedListStackQueue Ogni oggetto permette di gestire insiemi di oggetti con caratteristiche proprie

54 HashTable E un array autodimensionante Implementa IDictionary La ricerca è By Key (Object) Gli items non sono memorizzati secondo un ben preciso ordine Dim list as New HashTable(10) For i as Integer=0 to 9 Dim c as New Car Dim c as New Car list.Add(car+i.ToString,c) list.Add(car+i.ToString,c)Next Dim c as Car= DirectCast(list(car6), Car) For Each c as Car in list......Next

55 SortedList E un array autodimensionante Gli Items sono ordinati (usando IComparable) La ricerca è By Key Sorting <>Performances Dim list as New SortedList(10) For i as Integer=0 to 9 Dim c as New Car Dim c as New Car list.Add(car+i.ToString,c) list.Add(car+i.ToString,c)Next Dim c as Car= DirectCast(list(car6), Car) For Each c as Car in list......Next

56 Stack E una pila autodimensionante LIFO – Last In, First Out Push, Pop e Peek Dim list as New Stack() list.Push(a) list.Push(b) list.Push(c) Console.WriteLine(list.Pop)c

57 Queue E una coda autodimensionante FIFO – First In, First Out Enqueue, Dequeue e Peek Dim list as New Queue() list.Enqueue(a) list.Enqueue(b) list.Enqueue(c) Console.WriteLine(list.Dequeue)a Altri tipi di collezioni sono disponibili in System.Collection.Specialized NameValueCollection...e le collezioni tipizzate?...attendere prego......e le collezioni tipizzate?...attendere prego...

58 Ereditarietà Classi con funzionalità e interfacce molto simili ad un altra Modifica della classe (errori,interfaccia non congrua) Copia e Incolla Il codice potrebbe non essere disponibile Eredità per delega Parecchio codice per il wrapping della classe interna Car SuperCar Start Start Faster

59 Ereditarietà Creare una classe che eredita da un altra Eredita Interfaccia e Implementazione Inherits Non è necessario Source Code Stesso linguaggio (C# VB.NET) Dim sc as New SuperCar sc.Start()Sc.Faster() Public Class SuperCar Inherits Car Inherits Car End Class Public Class SuperCar Inherits Car Inherits Car Public Sub Turbo Public Sub Turbo End Sub End Sub End Class Dim sc as New SuperCar sc.Start()Car sc.Faster()Car sc.Turbo()SuperCar

60 Ereditarietà Concetti La classe da cui si eredita è definita classe Base Posso ereditare da qualsiasi classe.NET (che lo permette) Tutte le classi in.NET ereditano da System.Object Si definisce una relazione Is a (é un) In.NET tutto è Object Dim c as Car= New SuperCar c.Start() c.Turbo()Errore Public Class SuperCar Inherits Car Inherits Car Public Sub Turbo Public Sub Turbo End Sub End Sub End Class Una classe può ereditare da una sola classe base Single Inheritance Covarianza

61 Override La classe che eredita può modificare il comportamento della classe base Ridefinendone i metodi/proprieta/eventi La classe base deve permetterne la redifinizione Overridable Public Class Car Public Overridable Sub Faster Public Overridable Sub Faster Console.WriteLine(base) Console.WriteLine(base) End Sub End Sub End Class Public Class SuperCar Inherits Car Inherits Car Public Overrides Sub Faster Public Overrides Sub Faster Console.WriteLine(Inherited) Console.WriteLine(Inherited) End Sub End Sub End Class Dim c As Car = New SuperCar() c.Faster()Inherited

62 Override Un metodo dichiarato Overrides: E automaticamente Overridable Si può usare NotOverridable per modificarne il comportamento Public Class SuperCar: Inherits Car Public NotOverridable Overrides Sub Faster Public NotOverridable Overrides Sub Faster Console.WriteLine(Inherited) Console.WriteLine(Inherited) End Sub End Sub End Class MyBase Rappresenta la classe da cui si sta ereditando Public Class SuperCar: Inherits Car Public Overrides ReadOnly Property Model as String Public Overrides ReadOnly Property Model as String Return MyBase.Model + Super Return MyBase.Model + Super End Sub End Sub End Class

63 Override I costruttori non vengono ereditati No problem se non avete dei costruttori parametrici (usa default) Dovete invocarli esplicitamente (prima istruzione) Public Class SuperCar: Inherits Car Public Sub New (cilindrata as Integer) Public Sub New (cilindrata as Integer) MyBase.New(cilindrata)Inizializzo la classe base MyBase.New(cilindrata)Inizializzo la classe base End Sub End Sub End Class Public Class Car Public Sub New (cilindrata as Integer) Public Sub New (cilindrata as Integer) End Sub End Sub End Class

64 Public Class Car Private Sub IncreaseSpeed Me.Faster() Private Sub IncreaseSpeed Me.Faster() End Sub End Sub End Class Override, classe base e Me Quando associate un istanza di una classe ereditata ad una variabile di tipo base, la classe base vede limplementazione dei metodi della classe ereditata Public Class Car Public Overridable Sub Faster Public Overridable Sub Faster Console.WriteLine(base) Console.WriteLine(base) End Sub End Sub End Class Public Class SuperCar: Inherits Car Public Overrides Sub Faster Public Overrides Sub Faster Console.WriteLine(Inherited) Console.WriteLine(Inherited) End Sub End Sub End Class Dim c as Car= New SuperCar c.Faster()Inherited Me non indica il contesto corrente

65 Public Class Car Private Sub IncreaseSpeed MyClass.Faster() Private Sub IncreaseSpeed MyClass.Faster() End Sub End Sub End Class MyClass MyClass permette di specificare che il contesto di esecuzione sia quello della classe base e non quello di eventuali overrides in classi ereditanti da essa Viene eseguito il metodo Faster della classe Car Non disponibile in C#

66 Public Class Car Protected Sub IncreaseSpeed End Sub Protected Sub IncreaseSpeed End Sub End Class Protected scope Protected rende visibile un elemento alle sole classi ereditanti o alla classe che lo definisce Si usa quando un metodo è utile al colloquio tra classe base e classe ereditante Public Class SuperCar: Inherits Car Public Sub Faster Public Sub Faster MyBase.IncreaseSpeed() MyBase.IncreaseSpeed() End Sub End Sub End Class Dim c As New Car c.IncreaseSpeed() Errore Può essere abbinato con Friend

67 Public Class SuperCar: Inherits Car Public Shadows Sub Faster Public Shadows Sub Faster Console.WriteLine(Inherited) Console.WriteLine(Inherited) End Sub End Sub End Class Shadows Overrides funziona se il metodo della classe base è virtual Potrebbe non esserlo (I metodi Overridable sono più lenti) Potremmo non poterlo modificare Shadows Permette di ridefinire metodi già presenti nella classe base Sono a tutti gli effetti delle nuove implementazioni Sono ignorate dalla classe base (no ereditarietà) Va usato per ridefinire membri Shared Dim c as Car= New SuperCar c.Faster()base In alcuni casi potremmo non volere che qualcuno erediti la nostra classe

68 NotInheritable e MustInherit NotInheritable Indica che la classe non è ereditabile (sealed class) Public NotInheritable Class Car End Class Public Class SuperCar Inherits Car Errore Inherits Car Errore End Class MustInherith Non può essere istanziata (abstract class) Può essere usata solo ereditando da essa Spesso contiene dei metodi definiti MustOverride Permette di definire delle classi che hanno funzionalità parziale Public MustInherit Class Car Public MustOverride Sub Faster Public MustOverride Sub Faster End Sub End Sub End Class

69 Classe Astratta: CollectionBase System.Collection.CollectionBase Permette di creare collezioni tipizzate Public Class Cars : Inherits CollectionBase Public Sub Add(ByVal item As Car) Public Sub Add(ByVal item As Car) MyBase.InnerList.Add(item) MyBase.InnerList.Add(item) End Sub End Sub Default Property Item(ByVal index As Integer) As Car Default Property Item(ByVal index As Integer) As Car Get Get Return DirectCast(MyBase.InnerList(index), Car) Return DirectCast(MyBase.InnerList(index), Car) End Get End Get Set(ByVal Value As Car) Set(ByVal Value As Car) MyBase.InnerList(index) = Value MyBase.InnerList(index) = Value End Set End Set End Property End Property End Class Dim l as New Cars() l.Add(New Car())ok l.Add (New Truck()) Errore

70 Override di eventi La classe base deve essere strutturata in maniera opportuna Public Class Car Public Event LowOil() Public Event LowOil() Public Overridable Sub Faster Public Overridable Sub Faster If (Me.OilLevel<5) Then Me.OnLowOil() If (Me.OilLevel<5) Then Me.OnLowOil() End Sub End Sub Protected Overridable Sub OnLowOil() Protected Overridable Sub OnLowOil() RaiseEvent LowOil() RaiseEvent LowOil() End Sub End Sub End Class Public Class SuperCar: Inherits Car Protected Overrides Sub OnLowOil() Protected Overrides Sub OnLowOil() Me.Signal(Low oil) Me.Signal(Low oil) MyBase.OnLowOil() MyBase.OnLowOil() End Sub End Sub End Class

71 Generics Collections Public Class List Private elements() As Object Private elements() As Object Private count As Integer Private 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 += 1 elements(count) = element : count += 1 End Sub End Sub Public Default Property Item(ByVal Index _ Public Default Property Item(ByVal Index _ As Integer) As Object As Integer) As Object Get Get Return elements(index) Return elements(index) End Get End Get Set (value as object) elements(index) = value Set (value as object) elements(index) = value End Set End Set End Property End Property End Class Dim intList As New List() intList.Add(1) Boxing! intList.Add(2) Boxing! intList.Add(Pippo") No error… intList.Add(Pippo") No error… i = CInt(intList(0)) Richiesto cast Public Class List(Of T) Private elements() As T Private elements() As T Private count As Integer Private count As Integer Public Sub Add(ByVal element As T) Public Sub Add(ByVal element As T) If count = elements.Length Then Resize(count * 2) If count = elements.Length Then Resize(count * 2) elements(count) = element : count += 1 elements(count) = element : count += 1 End Sub End Sub Public Default Property Item(ByVal Index _ Public Default Property Item(ByVal Index _ As Integer) As T As Integer) As T Get Get Return elements(index) Return elements(index) End Get End Get Set (value as T) elements(index) = value Set (value as T) elements(index) = value End Set End Set End Property End Property End Class Dim intList As New List(Of Int32) intList.Add(1) No Boxing! intList.Add(2) No Boxing! intList.Add(Pippo") Error… intList.Add(Pippo") Error… i = intList(0) Non serve castare

72 Generics Collections Collection Classes List (of T) Dictionary (Of K,V) SortedDictionary (Of K,V) Stack(Of T) Queue(Of T) Collection 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 Classes Collection (Of T) KeyedCollection (Of T) ReadOnlyCollection(Of T) Public Class TypedCollection(Of T) _ Inherits System.Collections.ObjectModel.Collection(Of T)... End Class Dim Coll as New TypedCollection(Of DataTable) Coll.Add(new DataTable()) Dim coll As New List(Of DataTable)

73 Generics Methods Dim X As Int32 = 3 Dim Y As Int32 = 4 Dim Z As Int32 = IIf(X>Y,X,Y) Error Dim Z As Int32 = MyIIF(Of Int32)(X>Y,X,Y) No cast! Dim Z As Int32 = MyIIF(X>Y,X,Y) Type inferencing Public Function MyIIF (Of T)(cond As Boolean, _ trueP As T, falseP As T) As T If (cond) Then Return trueP If (cond) Then Return trueP Else Return falseP End If Else Return falseP End If End Sub

74 Generics Constraints Public Class Car(Of T) Private _Navigator As T Public ReadOnly Property Navigator As T Get Return _Navigator Return _Navigator End Get End Class Dim Car1 As New Car(Of TomTom) Car1.Navigator.RouteTo() Error Public Class Car _ (Of T As {New,BaseClass,I1,I2,Class,Structure}) Private _Navigator As New T Public ReadOnly Property Navigator As T Get Return _Navigator Return _Navigator End Get End Class Public Class Car(Of T) Private _Navigator As New T Public ReadOnly Property Navigator As T Get Return _Navigator Return _Navigator End Get End Class Public Class Car(Of T As New) Private _Navigator As New T Public ReadOnly Property Navigator As T Get Return _Navigator Return _Navigator End Get End Class

75 Operator Overloading Public Class SetPoint Public Temperature as Single Public Sub New (value as Single) Me.Temperature=value End Sub End Class Me.Temperature=value End Sub End Class Dim T1 as New SetPoint(12.5) Dim T2 as New SetPoint(13) Dim T3 as SetPoint = T1 + T2 Public Class SetPoint Public Temperature as Single Public Sub New (value as Single) Me.Temperature=value End Sub Me.Temperature=value End Sub Public Shared Operator +(ByVal a As SetPoint,_ ByVal b As SetPoint) As SetPoint ByVal b As SetPoint) As SetPoint Return New SetPoint(a.Temperature + b.Temperature) Return New SetPoint(a.Temperature + b.Temperature) End Operator End Class

76 Operator Overloading Alcuni operatori sono accoppiati <> e = > e e < >= e = e <= IsTrue e IsFalse AndAlso Richiede And deve ritornare un tipo simile a quello in cui è definito Richiede la definizione di IsFalse/IsTrue CType è loperatore di conversione Widening – Implicite Narrowing – Esplicite


Scaricare ppt "Learn & Get … Ovvero come sopravvivere alla migrazione da VB6 a VB2005."

Presentazioni simili


Annunci Google