1 / 77

Da VB a VB.NET

Da VB a VB.NET. Andrea Saltarello [IDevGuro] Corrado Cavalli [DevGuro(Of T)]. Sponsor. .Non migrare! VB.NET è un nuovo linguaggio Il wizard fa del suo meglio ma non fa i miracoli . Golden migration rule. Scelta di un Project Template. Windows Application Class Library

doria
Download Presentation

Da VB a VB.NET

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Da VB a VB.NET Andrea Saltarello [IDevGuro] Corrado Cavalli [DevGuro(Of T)]

  2. Sponsor

  3. .Non migrare! VB.NET è un nuovo linguaggio Il wizard fa del suo meglio ma non fa i miracoli Golden migration rule...

  4. Scelta di un Project Template • Windows Application • Class Library • Windows Control Library • ASP .NET Web Application / Service / Control Library • Console Application • Windows Service • Smart Device App • Office App (VSTO)

  5. Overview del .NET Framework Visual Studio .NET Visual Basic C++ C# J# … Common Language Specification .NET Framework

  6. Solution Files (.sln, .suo) Project Files (.vbproj) Local Project Items Classi, Form, Moduli, ecc. (.vb) Web Project Items XML Web services (.asmx) Web Form (.aspx) Global application classes (.asax) Struttura di un Progetto

  7. Parte #1 Il linguaggio Visual Basic .NET

  8. In VB6, una classe: è un file .cls Ha come nome il nome del file (es: Customer.cls) In VB.NET, una classe: È un blocco di codice Class…End Class In un unico file ci possono essere più classi Definire classi

  9. VB.NET=OOP! <Scope> Class Car…End Class File Class1.vb Public Class Car Public Sub Start() End Sub End Class VB 2005 Dim T As New Car() T.Start() T.Stop() VB 2005 File Class2.vb Public Partial Class Car Public Sub Stop() End Sub End Class VB 2005

  10. Sub New rimpiazza Class_Initialize Viene eseguita quando l’oggetto è istanziato Uso dei Costruttori Public Sub New( ) intValue = 1 End Sub Possiamo specificare più costruttori per la stessa classe (Overload) Public Sub New(ByVal i As Integer) intValue = i End Sub

  11. Sub Finalize rimpiazza l’evento Class_Terminate La usiamo per liberare le risorse usate dall’oggetto Viene eseguita quando il GC distrugge l’oggetto Usiamo x = Nothing per permettere la Garbage Collection Attenzione: la distruzione potrebbe non avvenire immediatamente! Distruzione degli oggetti Protected Overrides Sub Finalize( ) ‘Rilascio delle risorse End Sub

  12. Stessa Sintassi di Visual Basic 6.0 Una classe può contenere metodi con stesso nome e signature differente una alternativa ai parametri Optional più robusti: errori a compile time Non deve esistere ambiguità I metodi non possono differire solo per il tipo di ritorno o argomenti opzionali Dichiarazione di Funzioni Public Function ToInt(ByVal o as Object) As Integer End Sub Public Function ToInt(ByVal s as String) As Integer End Sub

  13. Sintassi differente da quella di Visual Basic 6.0 Dichiarazione di Proprietà Public Property MyData( ) As Integer Get Return intMyData 'Restituisce una variabile locale End Get Set (ByVal Value As Integer) intMyData = Value ‘Memorizza il valore in una variabile End Set End Property Keyword ReadOnly e WriteOnly Public ReadOnly Property MyProperty( ) As Integer Get Return _MyProperty End Get End Property

  14. 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 (favour object composition over inheritance – cit.) Parecchio codice per il wrapping della classe interna VB.NET=Ereditarietà SuperCar Start Start Faster Car

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

  16. 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 Ereditarietà Public Class SuperCar Inherits Car Public Sub Turbo End Sub End Class Dim c as Car= New SuperCar c.Start() c.Turbo() ‘Errore • Una classe può ereditare da una sola classe base • Single Inheritance

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

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

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

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

  21. 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 MyClass Public Class Car Private Sub IncreaseSpeedMyClass.Faster() End Sub End Class Viene eseguito il metodo Faster della classe Car Non disponibile in C#

  22. 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 Shadows Public Class SuperCar: Inherits Car Public Shadows Sub Faster Console.WriteLine(“Inherited”) End Sub End Class Dim c as Car= New SuperCar c.Faster()’ base In alcuni casi potremmo non volere che qualcuno erediti la nostra classe

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

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

  25. Permettono di definire dei tipi “generici” che verrano “completati” a compile time VB 2005 - Generics Public Class Car Private _Navigator As T Public ReadOnly Property Navigator As T Get Return _Navigator End Get End Class Public Class Car(Of T) Private _Navigator As T Public ReadOnly Property Navigator As T Get Return _Navigator End Get End Class Placeholder Public Class TomTom Public Sub RouteTo():End Sub End Class Public Class Garmin Public Sub NavigateTo():End Sub End Class Dim Car1 As New Car(Of TomTom)Dim Car2 As New Car(Of Garmin) Car1.Navigator.

  26. VB 2005 – Generics Collections Public Class List(Of T) Private elements() As T Private count As Integer Public Sub Add(ByVal element As T) If count = elements.Length Then Resize(count * 2) elements(count) = element : count += 1 End Sub Public Default Property Item(ByVal Index _ As Integer) As T Get Return elements(index) End Get Set (value as T) elements(index) = value End Set End Property End Class Public Class List Private elements() As Object Private count As Integer Public Sub Add(ByVal element As Object) If count = elements.Length Then Resize(count * 2) elements(count) = element : count += 1 End Sub Public Default Property Item(ByVal Index _ As Integer) As Object Get Return elements(index) End Get Set (value as object) elements(index) = value End Set End Property End Class Dim intList As New List() intList.Add(1) ‘ Boxing! intList.Add(2) ‘ Boxing! intList.Add(“Pippo") ‘ No error…  i = CInt(intList(0)) ‘ Richiesto cast Dim intList As New List(Of Int32) intList.Add(1) ‘ No Boxing! intList.Add(2) ‘ No Boxing! intList.Add(“Pippo") ‘ Error…  i = intList(0) ‘ Non serve castare

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

  28. VB 2005 – Generics Constraints Public Class Car(Of T) Private _Navigator As T Public ReadOnly Property Navigator As T Get Return _Navigator End Get End Class Public Class Car(Of T) Private _Navigator As NewT Public ReadOnly Property Navigator As T Get 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 End Get End Class Dim Car1 As New Car(Of TomTom)Car1.Navigator.RouteTo()’ Error Public Class Car _ (Of T As{New,BaseClass,I1,I2,Class,Structure}) Private _Navigator As New T Public ReadOnly Property Navigator As T Get Return _Navigator End Get End Class

  29. “Da VB a VB.NET”, Andrea Saltarello, workshop 14/11/2001 “Language Revolution”, Corrado Cavalli e Raffaele Rialdi, “Whidbey workshop” An Introduction to Visual Basic 2005, Jay Roxe e Sean Draine, “Whidbey (Reloaded) workshop” VB.NET: Approfondimenti

  30. Le classi attributo: dal punto di vista dell’utilizzatore, sono espressioni utili per decorare porzioni di codice Dal punto di vista del realizzatore, sono classi che specializzano System.Attribute E’ raccomandato l’uso del suffisso Attribute nella definizione del nome delle suddette classi Il suffisso può essere omesso in fase di decorazione del codice Classi Attributo Public Class ReportManager <Obsolete(“Dovresti usare PrintLabel(Int32)”)> _ Public Sub PrintLabel() PrintLabel(1) End Sub Public Sub PrintLabel(ByVal copies As Integer) End Sub End Class

  31. “Componenti "Alternativi": le classi Attributo”, Andrea Saltarello, workshop “Component Development” Attributi: approfondimenti

  32. Parte #2 VB.NET vs. Windows Forms

  33. VB6 Aggiunta di un file .res al progetto Utilizzo del resource editor Localizzare testo usando LoadResString LoadResPicture LoadResData No local/region aware Difficile integrare culturediverse Difficile estendere lalocalizzazione No locale adaptive UI Localizzazione in VB6

  34. VB.NET Si appoggia su files xml (.resx) ResGen.exe .resx -> .resources ResourceManager Cerca le assembly satellite utilizzando la cultura della UI Probing <language-culture> <language> Neutral / Default culture Tools WinRes.exe Lutz Roeder’s Resourcer (http://www.aisto.com/roeder/dotnet/) Al.exe Localizzazione in .NET

  35. “Applicazioni Windows Forms localizzate”, Corrado Cavalli, articolo. Localizzazione: Approfondimenti

  36. Proprietà IsMdiContainer = True per “promuovere” un form allo stato di contenitore MDI Nessun limite sul numero di form MDI per applicazione Proprietà MdiParent = mdiform per “incastrare” il form MDI child un form MDI può ospitare *qualsiasi* controllo sulla sua superficie Applicazioni MDI

  37. Alcuni controlli (es: Menu, ListBox e ComboBox) espongono la proprietà DrawMode, che può essere impostata a: Normal OwnerDrawFixed OwnerDrawVariable L'evento DrawItem riceve un riferimento all’elemento (es: l’indice) e un oggetto Graphics Controlli Owner drawn

  38. Le delegate sono dei puntatori a funzione: Managed. Non abbiamo in mano un vero puntatore a funzione, ma un oggetto in grado di rintracciarlo. Il GC non ci preoccupa: CLR e FX sono in combutta e mantengono valido il “puntatore” type-safe. Le funzioni devono rispettare la firma della delegate Delegate

  39. Il framework offre la classe Thread, che accetta in ingresso una istanza della delegate ThreadStart Multithreading

  40. Il cliente vuole applicazioni “veloci” Ottimizzare la velocità apparente Collo di bottiglia... Attendere prego... Applicazione Freezed Application.DoEvents() Eseguire l’operazione in un thread separato Non è consentito accedere a controlli Windows da threads diversi da quello in cui il controllo è stato creato Gli unici metodi thread-safe di un controllo windows sono Invoke BeginInvoke EndInvoke CreateGraphics ISyncronizeInvoke InvokeRequired,Invoke,BeginInvoke,EndInvoke Control implementa ISyncronizeInvoke Asyncronous Programming

  41. Ritorna True se il thread che invoca la proprietà è diverso da quello che ha creato il controllo Non siamo sicuri se è safe accedere al controllo Metodi always safe InvokeRequired public readonly property InvokeRequired() as boolean get Dim procId as Integer Dim WinThId = GetWindowThreadProcessId(Me.Handle, procId) return AppDomain.GetCurrentThreadId()<>WinThId end get End property

  42. I delegates possono essere utilizzati per eseguire operazioni asincrone BeginInvoke Ritorna IAsyncResult IAsyncResult.IsCompleted BeginInvoke (AsyncCallback,Object) Invoca AsyncCallback al termine dell’operazione AsyncCallback(ByVal ar as IAsyncResult) Object viene passato alla procedura di callback In AsyncCallback deve essere invocato EndInvoke AsyncCallback viene invocata in un thread separato Il thread proviene dal ThreadPool BeginInvoke/EndInvoke posson generare delle eccezioni Non è possibile interropere BeginInvoke Asyncronous Delegates

  43. “Accesso Thread-Safe a controlli Windows Forms”, Corrado Cavalli, articolo. GUI Asincrona: Approfondimenti

  44. Parte #3 Accesso ai dati

More Related