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
Scarica

VB.NET Overview