VB.NET Overview Corrado Cavalli Microsoft .NET MVP [email protected] Importante! VB.NET è VB7 Non è E’ un linguaggio nuovo, maturo, OOP Sintassi molto (!) simile a VB6 Da usare come nuovo linguaggio .NET Framework Tutti i linguaggi .NET (C++ escluso) richiedono la presenza del .NET Framework Strato software che si interpone tra il S.O e l’applicazione Codice MSIL VB.NET,C#,C++,J#... .NET Framework CLR (Garbage Collector,Eccezioni,Multithreading) BCL (Tipi Base) Sistema Operativo (Windows 98/NT/2000/XP/2003/CE e Altri) Circa 8000 classi... Codice IL e JIT Compiler VB.NET Compilatore vbc.exe Codice IL e Metadati JIT Compiler Codice x86 RUN! .NET Framework ASP.NET : Web Forms e servizi Windows Forms ADO.NET : dati e XML BCL - Libreria di classi Common Language Runtime Il tutto... Totalmente Free! Dettagli Redist circa 20 MB (già installato su WS2003) Non gira su Windows 95 Per sviluppare serve Win2000 o superiore Non serve per applicazioni ASP.NET (lato client) Esiste per Pocket PC, SmartPhones, Embedded .NET Framework (Applicazioni) Console Applications Windows Forms Windows Services Components Web Forms (Siti Web) XML Web Services New! Il linguaggio Tutti i files hanno la stessa estensione (.vb) e possono contenere più Classi [Class]/ Moduli [Module]. EntryPoint (Sub Main) di un programma può essere in un modulo o in una classe Namespaces Sono dei raggruppamenti Logici I moduli e le classi vivono nei Namespaces VB Imposta un root namespace NameSpace ABC ... NameSpace DEF ... End NameSpace End NameSpace VB.NET definisce degli imports globali Imports Namespace=Alias Permette di evitare di scrivere il percorso completo a un namespace Variabili Global Variables (usare Shared) Usare Option Explicit e Option Strict Dim i as Integer=“1” VB6 Dichiarazioni multiple sulla stessa riga Dim a,b,c as String a,b=Variant c=String VB6 Option Strict On= Error! Dim a,b,c as String Crea 3 variabili stringa Block scope (cicli For,Do...Loop) Data Types Variant non esiste più Tutto deriva da System.Object Data Types Byte New! Char (2 bytes) [A“c”] Boolean (4 bytes) Short (2 bytes) {ex Integer} Integer (4 bytes) {ex Long} Long (8 bytes) Currency -> Decimal (16 bytes) Single Double Date Sono Alias dei tipi definiti nel .NET framework (Int16, Int32...) Data Types String Le stringhe a lunghezza fissa non esistono in .NET Dim s as String *20 Dim s as New String(“ “c,20) Crea una stringa lunga 20 caratteri VB6 Initializers E’ possibile dichiarare e inizializzare una variabile sulla stessa riga Dim X as Integer=1 Dim y as Integer=myFunction Dim conn as new SQLConnection(...) Dim x as new MyOwnClass() ... Dim x as MyOwnClass x=new MyOwnClass Sono equivalenti Assignments Le proprietà di Default non esistono più Label1.Caption=“ok” VB6 Label1=“ok” Label1.Text=“ok” VB.NET Set non si usa più X+=1,X-=1,X*=n,X\=n,Y^=n, s+=“xyz” s=s & “ciao” , s=s+”ciao” VS 2003 Only s=s & 1 (ok) s=s+1 (error) VB.NET Bit shifting! Dim i as Integer=8 i=i>>1 (4) Value Types Ereditano da System.ValueType Enum,Structures,Integer... Tipi base Sono memorizzate sullo stack Contengono il valore della variabile Dim i as integer=1 Reference Types Sono memorizzate nella Heap Contengono un riferimento alla variabile Dim s as String=“pippo” Heap &H1230 Ciao &H1235 pippo ... pluto Stringhe, Objects Sono controllati dal Garbage Collector 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 passa un Value Type ad una variabile object Usare CType() o DirectCast() per evitare Boxing e UnBoxing CType tenta la conversione del tipo DirectCast è più veloce (solo reference types) Enum Simili a VB6 E’ possibile definire il tipo usato dall’Enum E’ possibile “decorare” un enumerato con <Flags()> Demo Array Sono 0 (zero!) based Il valore usato nella Dim è l’upper bound! Dim b(3) as Integer VB.NET: 0,1,2,3 C#: 0,1,2 Dim a(3,2) as Integer [Matrici] Array Initializers Dim x() as Int32={1,2,3} Array.Clone Array.Copy(...) Demo Strutture Sono Value Types Si definiscono usando Type Prova Public X as Integer Public Y as Long End Type VB6 Structure Prova Public X as Integer Public Y as Long End Structure VB.NET Possono essere viste come classi “leggere” Demo Procedure I Parametri sono ByVal (ByRef in VB6) Si può usare Return per ritornare un valore Le routines richiedono sempre le parentesi Public Function Test (ByVal X as Integer) as Integer Return X+1 End Structure Test(3) ‘ <-Parentesi Short circuit e Loop AndAlso e OrElse sono short circuited IIF No (!) While While ... End While ... Wend VS 2003 Only For i as Integer=0 to 10 ... Next For Each t as TextBox in Me.Controls ... Next Gestione degli Errori E’ possibile usare On Error... Non Fatelo! .NET supporta la gestione strutturata delle eccezioni (SEH) Un eccezione è un anomalia che può capitare durante la vita dell’applicazione L’anomalia viene segnalata attraverso un oggetto Exception (o ereditato da esso) Exception.Message Exception.Source Exception.StackTrace Come faccio a intercettare le eccezioni? Try-Catch-Finally Try ... Catch ex as Exception (When) ... Exit Try Throw ... Finally .... End Try Per lanciare un eccezione usare Throw (Exception) E’ possibile passare l’eccezione originale usando InnerException Classi in .NET Tutti i files hanno estensione .vb In un unico file ci possono essere più classi Definite con <Private,Public...>Class Test End Class I membri di una classe possono essere dimensionati ovunque (non solo nella Declaration Section) E’ possibile esporre costanti pubbliche da una classe I Forms sono delle classi! Dim f as New Form1 f.Show() Overloading La possibilità di definire più funzioni con lo stesso nome e diverso numero di parametri Public Sub Test (ByVal X as Integer) End Sub Public Sub Test (ByVal X as Integer,ByVal Z as Integer) End Sub Non vale per parametri di ritorno Da preferire rispetto a parametri opzionali (attenzione!) per compatibilità con C# IsMissing non è più supportata I parametri opzionali devono avere un default Properties Public Class Test Property Name as XXX Get ... End Get Set (Value as XXX) End Set End Property End Class ReadOnly e WriteOnly Al momento non possono avere scope diversi Costruttori Metodo invocato quando si istanzia una classe (new) Public Class MyOwnClass Public Sub New (ByVal X as Integer) ... End Sub End Class Equivalente di Class_Initialize Possibilità di passare parametri e usare Overloads Vita degli oggetti In .NET non esiste Class_Terminate Non viene usato il reference counting ma il Garbage Collector Distruzione non deterministica: Non sappiamo quando un oggetto verrà scaricato dalla memoria Come risolviamo il problema? Finalize (~) Public Overrides Sub Finalize ... End Class Viene invocato dal GC quando l’oggetto viene scaricato dalla memoria Non risolve il problema della determinazione Eventi Event,RaiseEvent e WithEvents Private Sub Button1_Click(…) Handles Button1.Click, Button2.Click … End Sub Con Handles si possono gestire eventi multipli (No Control Arrays in .NET) AddHandler / RemoveHandler AddHandler Button1.Click, AddressOf Button1_Click RemoveHandler Button1.Click, AddressOf Button1_Click Shared Members Sono membri condivisi da tutte le istanze di una classe (Static in C#) Si accede usando NomeClasse.XXX I membri statici possono accedere ai soli fields statici GlobalMultiuse in VB6 Public Class MyOwnClass Private Shared ID as Integer Public Shared Function ID as Integer Return ID End Function End Class Sostituiscono i moduli .BAS Ereditarietà Permette di definire che una classe eredita Interfaccia e codice da un altra (Is a) Public Class MyNewClass Inherits MyBaseClass End Class La classe base può essere in un altro linguaggio .NET (C#,J#,C++) La classe ereditante eredita Public,Friend,... La classe eredita tutti gli eventi della classe base MyBase permette di accedere alla classe da cui si sta ereditando Override della classe base La classe ereditante può ridefinire (Overrides) i metodi della classe base (se Overridable) I metodi overrides sono a loro volta overridable NotOverridable impedisce l’override Classi Astratte NotInheritable indica che una classe non è ereditabile Esempio: Classe con soli membri statici MustInherit definisce una classe astratta che non può essere istanziata MustOverride definisce un membro che deve essere ereditato Scope Qualifier Private,Public,Friend... Protected: Visibile all’interno della stessa classe e alle classi che ereditano da essa Protected Friend: Nella stessa Assembly Interfacce Si definiscono usando Interface Possono contenere Eventi L’implementazione è slegata dal nome Le classi ereditate ereditano anche l’implementazione di interfaccia Interface IPerson Definizione Sub DoSomething() Property Name() As String End Interface Public Class Person Implements IPerson Public Sub DoSomething() Implements IPerson.DoSomething … End Sub Public Property Name() As String Implements IPerson.Name Get … End Get Può essere diverso Set(ByVal Value As String) … End Set End Property Implementazione End Class Communities news.microsoft.com microsoft.public.it.dotnet.vb microsoft.public.it.dotnet.* Comunità degli sviluppatori http://www.microsoft.com/italy/msdn/community/default.asp Webcasts http://www.microsoft.com/italy/msdn/webcast/default.asp 5 Febbraio, 14:30-16:00 VB.NET: Sviluppo di applicazioni desktop