Corrado Cavalli Microsoft .NET MVP corrado@mvps.org VB.NET Overview Corrado Cavalli Microsoft .NET MVP corrado@mvps.org
Importante! VB.NET è VB7 Non è E’ un linguaggio nuovo, maturo, OOP Sintassi molto (!) simile a VB6 Da usare come nuovo linguaggio
Sistema Operativo (Windows 98/NT/2000/XP/2003/CE e Altri) .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 RUN! JIT Compiler Codice x86
BCL - Libreria di classi Common Language Runtime .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!
Redist circa 20 MB (già installato su WS2003) Non gira su Windows 95 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 VB.NET definisce degli imports globali Imports Namespace=Alias Permette di evitare di scrivere il percorso completo a un namespace NameSpace ABC ... NameSpace DEF ... End NameSpace End NameSpace
Global Variables (usare Shared) Usare Option Explicit e Option Strict Variabili Global Variables (usare Shared) Usare Option Explicit e Option Strict Dichiarazioni multiple sulla stessa riga Block scope (cicli For,Do...Loop) Dim i as Integer=“1” Option Strict On= Error! VB6 Dim a,b,c as String a,b=Variant c=String Dim a,b,c as String Crea 3 variabili stringa VB6
Data Types Variant non esiste più Tutto deriva da System.Object
Data Types Byte 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...) New!
Le stringhe a lunghezza fissa non esistono in .NET Data Types String Le stringhe a lunghezza fissa non esistono in .NET Dim s as String *20 VB6 Dim s as New String(“ “c,20) Crea una stringa lunga 20 caratteri
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ù Set non si usa più X+=1,X-=1,X*=n,X\=n,Y^=n, s+=“xyz” s=s & “ciao” , s=s+”ciao” Label1.Caption=“ok” Label1=“ok” Label1.Text=“ok” VB6 VB.NET VS 2003 Only s=s & 1 (ok) s=s+1 (error) VB.NET Bit shifting! Dim i as Integer=8 i=i>>1 (4)
Ereditano da System.ValueType Enum,Structures,Integer... Tipi base 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 1
Reference Types Sono memorizzate nella Heap Contengono un riferimento alla variabile Stringhe, Objects Sono controllati dal Garbage Collector Dim s as String=“pippo” Heap &H1235 &H1230 Ciao &H1235 pippo ... pluto
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)
E’ possibile definire il tipo usato dall’Enum Simili a VB6 E’ possibile definire il tipo usato dall’Enum E’ possibile “decorare” un enumerato con <Flags()> Demo
Il valore usato nella Dim è l’upper bound! Array Sono 0 (zero!) based Il valore usato nella Dim è l’upper bound! Dim a(3,2) as Integer [Matrici] Array Initializers Dim x() as Int32={1,2,3} Array.Clone Array.Copy(...) Dim b(3) as Integer VB.NET: 0,1,2,3 C#: 0,1,2 Demo
Possono essere viste come classi “leggere” Strutture Sono Value Types Si definiscono usando Possono essere viste come classi “leggere” Type Prova Public X as Integer Public Y as Long End Type Structure Prova Public X as Integer Public Y as Long End Structure VB6 VB.NET Demo
I Parametri sono ByVal (ByRef in VB6) 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
AndAlso e OrElse sono short circuited IIF No (!) Short circuit e Loop AndAlso e OrElse sono short circuited IIF No (!) While ... Wend While ... End While For i as Integer=0 to 10 ... Next VS 2003 Only For Each t as TextBox in Me.Controls ... Next
E’ possibile usare On Error... Gestione degli Errori Non Fatelo! E’ possibile usare On Error... .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?
Per lanciare un eccezione usare Throw (Exception) 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 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! <Private,Public...>Class Test End Class Dim f as New Form1 f.Show()
Overloading La possibilità di definire più funzioni con lo stesso nome e diverso numero di parametri 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 Public Sub Test (ByVal X as Integer) End Sub Public Sub Test (ByVal X as Integer,ByVal Z as Integer) End Sub
Properties ReadOnly e WriteOnly 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) Equivalente di Class_Initialize Possibilità di passare parametri e usare Overloads Public Class MyOwnClass Public Sub New (ByVal X as Integer) ... End Sub End Class
Come risolviamo il problema? 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 Con Handles si possono gestire eventi multipli (No Control Arrays in .NET) AddHandler / RemoveHandler Private Sub Button1_Click(…) Handles Button1.Click, Button2.Click … End Sub 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) 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 Public Class MyNewClass Inherits MyBaseClass End Class
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
Definizione Interface IPerson Sub DoSomething() Property Name() As String End Interface Definizione Public Class Person Implements IPerson Public Sub DoSomething() Implements IPerson.DoSomething … End Sub Public Property Name() As String Implements IPerson.Name Get … End Get Set(ByVal Value As String) … End Set End Property End Class Può essere diverso Implementazione
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 VB.NET: Sviluppo di applicazioni desktop http://www.microsoft.com/italy/msdn/webcast/default.asp 5 Febbraio, 14:30-16:00 VB.NET: Sviluppo di applicazioni desktop