Il 0% ha trovato utile questo documento (0 voti)
29 visualizzazioni

Visual Basic NET

Caricato da

sestidavide.mail
Copyright
© © All Rights Reserved
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
29 visualizzazioni

Visual Basic NET

Caricato da

sestidavide.mail
Copyright
© © All Rights Reserved
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Sei sulla pagina 1/ 1352

Contents

Guida a Visual Basic


Novità in Visual Basic
Modifiche importanti nel compilatore
Introduzione
Risorse aggiuntive per i programmatori Visual Basic
Sviluppo di applicazioni
Programmazione in Visual Basic
Accesso alle risorse del computer
Registrazione di informazioni relative all'applicazione
Accesso ai dati utente
Accesso ai moduli dell'applicazione
Accesso ai servizi Web dell'applicazione
Procedura: Chiamare un servizio Web in modo asincrono
Accessing Application Settings
Elaborazione di unità, directory e file
Sviluppo con My
Esecuzione di attività mediante My.Application, My.Computer e My.User
Istanze predefinite degli oggetti fornite da My.Forms e My.WebServices
Sviluppo rapido di applicazioni con My.Resources e My.Settings
Cenni preliminari sul modello di applicazione Visual Basic
Dipendenza di My dal tipo di progetto
Accesso ai dati
Creazione e uso di componenti
Nozioni di base sulle applicazioni Windows Forms
Personalizzazione di progetti ed estensione di oggetti My in Visual Basic
Estensione dello spazio dei nomi My
Assemblaggio e distribuzione delle estensioni My personalizzate
Estensione del modello di applicazione Visual Basic
Personalizzazione degli oggetti disponibili in My
Nozioni di base sulla programmazione
Programmazione asincrona con Async e Await
Attributi
Informazioni sul chiamante
Raccolte
Covarianza e controvarianza
Alberi delle espressioni
Iterators
LINQ (Language-Integrated Query)
Programmazione orientata a oggetti
Reflection
Serializzazione
Struttura del programma e convenzioni di scrittura del codice
Struttura di un programma
Procedura principale
Riferimenti e istruzione Imports
Spazi dei nomi
Convenzioni di denominazione
Convenzioni per la scrittura del codice
Compilazione condizionale
Procedura: Interrompere e combinare istruzioni nel codice
Procedura: Comprimere e nascondere sezioni di codice
Procedura: Etichettare le istruzioni
Caratteri speciali nel codice
Commenti nel codice
Parole chiave come nomi di elementi nel codice
Me, My, MyBase e MyClass
Limitazioni
Funzionalità del linguaggio
Matrici
Inizializzatori di raccolta
Costanti ed enumerazioni
Flusso di controllo
Tipi di dati
Caratteri tipo
Tipi di dati elementari
Tipi di dati numerici
Tipi di dati carattere
Tipi di dati vari
Tipi di dati compositi
Procedura: Inserire più valori in una variabile
Tipi generici
Definire una classe in grado di fornire funzionalità identiche con tipi diversi
Usare una classe generica
Routine generiche
Tipi valore nullable
Value Types and Reference Types
Conversione di tipi
Widening and Narrowing Conversions
Conversioni implicite ed esplicite
Conversioni fra stringhe e altri tipi
Procedura: Convertire un oggetto in un altro tipo
Conversioni di matrice
Strutture
Procedura: Dichiarare una struttura
Variabili di struttura
Strutture e altri elementi di programmazione
Strutture e classi
Tuple
Uso efficiente dei tipi di dati
Risoluzione dei problemi relativi ai tipi di dati
Elementi dichiarati
Delegati
Associazione anticipata e tardiva
Tipi di errore
Events
Interfacce
Procedura dettagliata: Creazione e implementazione di interfacce
LINQ
Oggetti e classi
Operatori ed espressioni
Procedure
Istruzioni
Stringhe
Variabili
XML
Interoperabilità COM
Introduzione all'interoperabilità COM
Procedura: Fare riferimento a oggetti COM
Procedura: Utilizzare i controlli ActiveX
Procedura dettagliata: Chiamata delle API di Windows
Procedura: Chiamare le API di Windows
Procedura: Chiamare una funzione Windows che accetta tipi senza segno
Procedura dettagliata: Creazione di oggetti COM
Risoluzione dei problemi relativi all'interoperabilità
Interoperabilità COM nelle applicazioni .NET Framework
Procedura dettagliata: Implementazione dell'ereditarietà con gli oggetti COM
Riferimenti per il linguaggio
Configurare la versione del linguaggio
Convenzioni tipografiche e di scrittura del codice
Membri della libreria di runtime di Visual Basic
Parole chiave
Riepilogo delle matrici
Riepilogo dell'oggetto Collection
Riepilogo del flusso di controllo
Riepilogo della conversione
Data Types Summary
Riepilogo di data e ora
Riepilogo delle dichiarazioni e delle costanti
Riepilogo di directory e file
Riepilogo degli errori
Riepilogo degli elementi finanziari
Riepilogo delle informazioni e dell'interazione
Riepilogo di input e output
Riepilogo degli elementi matematici
Funzioni matematiche derivate
Informazioni di riferimento su My
Riepilogo degli operatori
Riepilogo del Registro di sistema
Riepilogo della modifica delle stringhe
Attributi
Costanti ed enumerazioni
Riepilogo dei tipi di dati
Tipo di dati Boolean
Tipo di dati Byte
Tipo di dati Char
Tipo di dati Date
Tipo di dati Decimal
Tipo di dati Double
Tipo di dati Integer
Tipo di dati Long
Object Data Type
Tipo di dati SByte
Tipo di dati Short
Tipo di dati Single
Tipo di dati String
Tipo di dati UInteger
Tipo di dati ULong
Tipo di dati definito dall'utente
Tipo di dati UShort
Direttive
#Costante
#ExternalSource
#Se... Quindi... #Else
#Region
#Disabilitare e #Enable
Funzioni
Funzioni di conversione
Funzioni matematiche
Funzioni stringa
CString
Valori restituiti per la funzione CStr
CType Function
Modificatori
Ansi
Assembly
Async
Auto
ByRef
ByVal
Impostazione predefinita
Friend
In (modificatore generico)
Iterator
Chiave
Modulo
MustInherit
MustOverride
Narrowing
NotInheritable
NotOverridable
Facoltativo
Out (modificatore generico)
Overloads
Overridable
Overrides
ParamArray
Partial
Private
Private Protected
Protetta
Protected Friend
Public
ReadOnly
Shadows
Shared
Static
Unicode
Widening
WithEvents
WriteOnly
Moduli
Nothing
Oggetti
Oggetto My.Application
Oggetto My.Application.Info
My.Application.Log (oggetto)
Oggetto My.Computer
Oggetto My.Computer.Audio
Oggetto My.Computer.Clipboard
Oggetto My.Computer.Clock
Oggetto My.Computer.FileSystem
Oggetto My.Computer.FileSystem.SpecialDirectories
Oggetto My.Computer.Info
Oggetto My.Computer.Keyboard
Oggetto My.Computer.Mouse
Oggetto My.Computer.Network
Oggetto My.Computer.Ports
Oggetto My.Computer.Registry
Oggetto My.Forms
Oggetto My.Log
Oggetto My.Request
Oggetto My.Response
Oggetto My.Resources
Oggetto My.Settings
Oggetto My.User
Oggetto My.WebServices
TextFieldParser Object
Operatori
Precedenza tra gli operatori
Tipi di dati dei risultati degli operatori
Elenco degli operatori per funzionalità
Operatori aritmetici
Operatori di assegnazione
Operatori di spostamento bit
Operatori di confronto
Operatori di concatenazione
Operatori logici bit per bit
Operatori vari
Elenco di operatori di Visual Basic
Operatore &
Operatore &=
* Operatore
Operatore *=
+ Operatore
Operatore +=
Operatore =
- Operatore
Operatore -=
Operatore <
Operatore <=
> Operatore
>Operatore =
Operatore <<
Operatore <<=
>> Operatore
>>Operatore =
Operatore /
Operatore /=
Operatore \
Operatore \=
Operatore ^
Operatore ^=
Operatore ?()
?. Operatore
Operatore AddressOf
Operatore And
Operatore AndAlso
Operatore Await
Operatore DirectCast
Espressione di funzione
GetType Operator
Operatore GetXmlNamespace
Operatore If
Operatore Is
Operatore IsFalse
Operatore IsNot
Operatore IsTrue
Operatore Like
Operatore Mod
Operatore NameOf
Operatore New
Operatore Not
Operatore Or
Operatore OrElse
Sottoespressione
Operatore TryCast
Operatore TypeOf
Operatore Xor
Proprietà
Query
Aggregate Clause
Clausola Distinct
Clausola Equals
Clausola From
Clausola Group By
Clausola Group Join
Clausola Join
Clausola Let
Clausola Order By
Clausola Select
Clausola Skip
Clausola Skip While
Clausola Take
Clausola Take While
Clausola Where
Istruzioni
Istruzioni A-E
Istruzione AddHandler
Istruzione Call
Istruzione Class
Istruzione Const
Istruzione Continue
Declare Statement
Istruzione Delegate
Istruzione Dim
Istruzione Do...Loop
Istruzione Else
Istruzione End
Istruzione End <keyword>
Istruzione Enum
Istruzione Erase
Istruzione Error
Istruzione Event
Istruzione Exit
Istruzioni F-P
Istruzione For Each...Next
Istruzione For...Next
Istruzione Function
Istruzione Get
Istruzione GoTo
Istruzione If...Then...Else
Istruzione Implements
Istruzione Imports (tipo e spazio dei nomi .NET)
Istruzione Imports (spazio dei nomi XML)
Inherits Statement
Istruzione Interface
Istruzione Mid
Istruzione Module
Istruzione Namespace
Istruzione On Error
Operator Statement
Istruzione Option <keyword>
Istruzione Option Compare
Istruzione Option Explicit
Option Infer (istruzione)
Option Strict Statement
Property Statement
Istruzioni Q-Z
Istruzione RaiseEvent
Istruzione ReDim
Istruzione REM
Istruzione RemoveHandler
Istruzione Resume
Istruzione Return
Istruzione Select...Case
Istruzione Set
Istruzione Stop
Istruzione Structure
Istruzione Sub
Istruzione SyncLock
Istruzione Then
Istruzione Throw
Istruzione Try...Catch...Finally
Istruzione Using
Istruzione While...End While
Istruzione With...End With
Istruzione Yield
Clausole
Clausola Alias
Clausola As
Clausola Handles
Clausola Implements
Clausola In
Clausola Into
Clausola Of
Contesti delle dichiarazioni e livelli di accesso predefiniti
Elenco degli attributi
Elenco parametri
Type List
Tag di commento XML
<c>
<code>
<example>
<exception>
<include>
<list>
<para>
<param>
<paramref>
<permission>
<remarks>
<returns>
<see>
<seealso>
<summary>
<typeparam>
<value>
Proprietà Axis XML
XML Attribute Axis Property
XML Child Axis Property
XML Descendant Axis Property
Proprietà dell'indicizzatore di estensione
Proprietà Value XML
Valori letterali XML
Valore letterale di elemento XML
Valore letterale di documento XML
Valore letterale CDATA XML
Valore letterale di commento XML
Valore letterale di istruzione di elaborazione XML
Messaggi di errore
Panoramica
BC30663
BC32500
'#ElseIf' deve essere preceduto da un '#If' o '#ElseIf' corrispondente
Le istruzioni '#Region' e '#End Region' non sono valide nei corpi di metodi o di
espressioni lambda su più righe
'<classname>' non è conforme a CLS perché l'interfaccia '<interfacename>'
implementata non è conforme a CLS
'<elementname>' è obsoleto (Avviso di Visual Basic)
'<eventname>' è un evento e non può essere chiamato direttamente
Impossibile utilizzare '<expression>' come vincolo di tipo
'<functionname>' non è dichiarata (errore del compilatore Visual Basic/Smart
Device)
'<interfacename>.<membername>' è già implementata dalla classe base
'<baseclassname>'. Prevista nuova implementazione di <type>
'<keyword>' è valido solo all'interno di un metodo di istanza
'<membername>' non può esporre il tipo '<typename>' all'esterno del progetto
mediante <containertype> '<containertypename>'
'<membername>' è ambiguo nelle interfacce ereditate '<interfacename1>' e
'<interfacename2>'
<message> Questo errore potrebbe essere dovuto anche all'unione di un
riferimento file con un riferimento progetto nell'assembly '<assemblyname>'
Il metodo '<methodname>' contiene più definizioni con firme identiche
'<name>' è ambiguo nello spazio dei nomi '<namespacename>'
'<name1>' è ambiguo ed è importato dagli spazi dei nomi o dai tipi '<name2>'
<proceduresignature1> non è conforme a CLS perché esegue l'overload di
<proceduresignature2> che differisce da esso solo per la matrice dei tipi di
parametro matrice o per il numero di dimensioni dei tipi di parametro matrice
<type1>'<typename>' deve implementare '<membername>' per l'interfaccia
'<interfacename>'
<type1>'<typename>' deve implementare '<methodname>' per l'interfaccia
'<interfacename>'
'<typename>' non può ereditare da <type> '<basetypename>' perché espande
l'accesso del <type> base all'esterno dell'assembly
'<typename>' è un tipo delegato
'<typename>' è un tipo e non può essere utilizzato come espressione
Le virgolette non sono un token di commento valido per i campi delimitati se
EscapeQuote è impostato su True
Una chiamata a una proprietà o a un metodo non può includere un riferimento a un
oggetto privato, né come argomento né come valore restituito
È stato creato un riferimento all'assembly di interoperabilità incorporato
'<assembly1>' a causa di un riferimento indiretto a tale assembly dall'assembly
'<assembly2>'
Non è stato specificato un form di avvio
Accesso di membro condiviso tramite un'istanza; l'espressione di qualificazione non
verrà valutata
L'operando 'AddressOf' deve essere il nome di un metodo, senza parentesi
Errore imprevisto. Impossibile acquisire una risorsa del sistema operativo necessaria
per l'avvio di istanze singole
Il nome di membro di tipo anonimo può essere dedotto solo da un nome semplice
o completo senza argomenti
Argomento non facoltativo
I limiti di matrice non possono trovarsi negli identificatori di tipo
La matrice dichiarata come variabile per il controllo del ciclo non può essere
dichiarata con dimensione iniziale
Espressione di indice di matrice mancante
Le matrici dichiarate come membri di struttura non possono essere dichiarate con
una grandezza iniziale
'As Any' non è supportato nelle istruzioni 'Declare'
Errore di automazione
Valore checksum non valido. Cifre esadecimali non presenti o in numero dispari
Convenzione di chiamata DLL non valida
Modalità file non valida
Numero o nome file errato
Lunghezza del record non valida
Non essendo possibile attendere la chiamata, l'esecuzione del metodo corrente
continuerà prima del completamento della chiamata
Non è possibile convertire il tipo anonimo in un albero delle espressioni perché una
proprietà del tipo viene usata per inizializzare un'altra proprietà
Impossibile creare il componente ActiveX
Impossibile fare riferimento a '<name>' perché è un membro del campo di valori
'<name>' della classe '<classname>' che ha 'System.MarshalByRefObject' come
classe base
Impossibile fare riferimento a un membro di istanza di una classe all'interno di un
metodo condiviso o di un inizializzatore di membri condivisi senza un'istanza esplicita
della classe
Impossibile creare il file temporaneo necessario
Impossibile aprire '<filename>' per la scrittura.
Impossibile trovare la classe '<classname>'
La classe non supporta l'automazione o l'interfaccia prevista
L'istruzione 'Class' deve terminare con un 'End Class' corrispondente
Formato degli Appunti non valido
Espressione costante non rappresentabile nel tipo '<typename>'
Le costanti devono essere di tipo intrinseco o enumerato, non di tipo classe,
struttura, parametro di tipo o matrice
Il costruttore '<name>' non può chiamare se stesso
Copiando il valore del parametro 'ByRef' '<parametername>' nell'argomento
corrispondente viene eseguita la conversione dal tipo '<typename1>' a
'<typename2>', più piccolo
Modificatore 'Custom' non valido negli eventi dichiarati senza tipi delegati espliciti
Impossibile dedurre da questi argomenti i tipi di dati dei parametri di tipo
Prevista dichiarazione
La proprietà predefinita '<propertyname1>' è in conflitto con la proprietà
predefinita '<propertyname2> nella base '<classname>', quindi deve essere
dichiarata 'Shadows'
L'accesso a una proprietà predefinita è ambiguo tra i membri di interfaccia ereditati
'<defaultpropertyname>' dell'interfaccia '<interfacename1>' e
'<defaultpropertyname>' dell'interfaccia '<interfacename2>'
La classe delegata '<classname>' non contiene un metodo Invoke. Un'espressione di
questo tipo non può essere la destinazione di una chiamata al metodo
Le classi derivate non possono generare eventi di classe base
Errore di I/O del dispositivo
La funzione 'Dir' deve essere anzitutto chiamata con un argomento 'PathName'
Prevista fine dell'istruzione
Errore durante la creazione del manifesto dell'assembly: <error message>
Errore durante la creazione delle risorse Win32: <error message>
Errore di caricamento della DLL
Errore durante il salvataggio del file di risorse Win32 temporaneo '<filename>':
<error message>
Errori durante la compilazione di XML schema nel progetto
Timeout della valutazione dell'espressione o dell'istruzione
L'evento '<eventname1>' non può implementare l'evento '<eventname2>'
nell'interfaccia '<interface>' poiché i tipi delegati '<delegate1>' e '<delegate2>' non
corrispondono
Impossibile dichiarare gli eventi con un tipo delegato che ha un tipo restituito
Impossibile gestire gli eventi delle variabili WithEvents condivise mediante metodi
non condivisi
L'espressione non produce un valore
L'espressione è di tipo '<typename>' che corrisponde a un tipo limitato e non può
essere utilizzato per accedere ai membri ereditati da 'Object' o 'ValueType'
L'espressione è un valore, quindi non può essere la destinazione di un'assegnazione
L'espressione di tipo <type> non può essere sottoposta a query
L'espressione chiama in modo ricorsivo la proprietà '<propertyname>' che la
contiene
Espressione troppo complessa
È possibile applicare l'attributo 'Extension' solo alle dichiarazioni 'Module', 'Sub' o
'Function'
File già aperto
Il file è troppo grande per essere letto in una matrice byte
Nome di file o nome di classe non trovato durante un'operazione di Automazione
Impossibile trovare il file (errore di run-time Visual Basic)
Il primo operando in un'espressione 'If' binaria deve essere nullable o un tipo
riferimento
La prima istruzione di questo 'Sub New' deve essere una chiamata a 'MyBase.New'
o a 'MyClass.New' (nessun costruttore accessibile senza parametri)
La prima istruzione di questo 'Sub New' deve essere una chiamata esplicita a
'MyBase.New' o a 'MyClass.New' perché '<constructorname>' nella classe base
'<baseclassname>' di '<derivedclassname>' è contrassegnato come obsoleto:
'<errormessage>'
For Each' sul tipo '<typename>' è ambiguo perché il tipo implementa più creazioni
di istanza di 'System.Collections.Generic.IEnumerable(Of T)'
Il riferimento all'assembly Friend <reference> non è valido
La funzione '<procedurename>' non restituisce un valore in tutti i percorsi del
codice
Valutazione della funzione disabilitata a causa del timeout di una valutazione di
funzione precedente
I parametri generici utilizzati come tipi di parametri facoltativi devono essere
vincolati a livello di classe
La funzione di accesso 'Get' della proprietà '<propertyname>' non è accessibile
La clausola Handles richiede una variabile WithEvents definita nel tipo che la
contiene o in uno dei relativi tipi di base
È previsto un identificatore
Identificatore troppo lungo
Previsto inizializzatore
Input oltre la fine del file
Si è verificato un errore interno nella <location>
Conversione implicita da '<typename1>' a '<typename2>' quando il valore del
parametro 'ByRef' '<parametername>' viene ricopiato nell'argomento corrispondente
Gli operandi di 'Is' devono avere tipi di riferimento, ma questo operando ha un tipo
di valore '<typename>'
È possibile confrontare l'operando 'IsNot' del tipo '' solo con 'Nothing' perché '' è un
tipo nullable
Le etichette che sono numeri devono essere seguite da un segno di due punti
L'espressione lambda non verrà rimossa da questo gestore eventi
Le espressioni lambda non sono valide nella prima espressione di un'istruzione
'Select Case'
Risoluzione ad associazione tardiva; potrebbero verificarsi degli errori in fase di
esecuzione
Impossibile applicare la risoluzione dell'overload con associazione tardiva a
'<procedurename>' perché l'istanza di accesso è un tipo interfaccia
Il carattere '.' o '!' iniziale può trovarsi solo all'interno di un'istruzione
Riga troppo lunga
Le istruzioni 'Line' non sono più supportate (errore del compilatore Visual Basic)
La firma del metodo non è compatibile con il delegato
È impossibile utilizzare i metodi di "System.Nullable (Of T)" come operandi
dell'operatore "AddressOf".
Le istruzioni 'Module' possono trovarsi solo a livello di file o di spazio dei nomi
Il nome <membername> non è conforme a CLS
Nome '<name>' non dichiarato
Il nome <namespacename> nello spazio dei nomi radice <fullnamespacename>
non è conforme a CLS
Lo spazio dei nomi o il tipo specificato nelle importazioni '<qualifiedelementname>'
non contiene alcun membro pubblico o non è definito
Lo spazio dei nomi o il tipo specificato nelle importazioni '<qualifiedelementname>'
a livello di progetto non contiene alcun membro pubblico o non è definito
Necessario indice della matrice di proprietà
La funzione annidata non dispone di una firma compatibile con il delegato
'<delegatename>'
Impossibile trovare in '<name>' un metodo 'Main' accessibile con una firma
appropriata
<membername> non conforme a CLS non consentito in un'interfaccia conforme a
CLS
L'inferenza di tipi nullable non è supportata in questo contesto
Il numero di indici è superiore al numero di dimensioni della matrice indicizzata
L'oggetto o la classe non supporta il set di eventi
Oggetto necessario
Variabile oggetto o variabile del blocco With non impostata
La dichiarazione dell'operatore deve essere una delle seguenti: +,-,*,-,-,^, &, Like,
Mod, And, Or, Xor, Not, <<, >>, =, <>, <, <=, >, >=, CType, IsTrue, IsFalse
Previsto 'Optional'
I parametri facoltativi devono specificare un valore predefinito
Ordinale non valido
Memoria insufficiente (errore del compilatore Visual Basic)
Spazio dello stack insufficiente
Spazio di stringa insufficiente
Overflow (errore Visual Basic)
Overflow (errore di run-time Visual Basic)
Impossibile trovare il percorso
Errore di accesso al percorso/file
Autorizzazione negata
Chiamata di routine o argomento non valido
La proprietà '<propertyname>' non restituisce un valore in tutti i percorsi del codice
Indice della matrice di proprietà non valido
La routine Property Let non è stata definita e la routine Property Get non ha
restituito un oggetto
Proprietà non trovata
Proprietà o metodo non trovato
La variabile di intervallo <variable> nasconde una variabile in un blocco di inclusione,
una variabile di intervallo precedentemente definita o una variabile dichiarata in modo
implicito in un'espressione di query
Il nome di variabile di intervallo può essere dedotto solo da un nome semplice o
completo senza argomenti
Necessario riferimento all'assembly '<assemblyidentity>' contenente il tipo
'<typename>'. Impossibile trovare un riferimento adatto a causa dell'ambiguità tra i
progetti '<projectname1>' e '<projectname2>'
Necessario un riferimento all'assembly '<assemblyname>' contenente la classe base
'<classname>'
L'operazione richiesta non è disponibile (BC35000)
Resume senza errore
Il tipo restituito della funzione '<procedurename>' non è conforme a CLS
La funzione di accesso 'Set' della proprietà '<propertyname>' non è accessibile
Impossibile eliminare alcune sottochiavi
L'istruzione non può terminare con un blocco all'esterno di un'istruzione di riga 'If'
Istruzione non valida in uno spazio dei nomi
Istruzione non valida all'interno di un metodo/espressione lambda su più righe
Le costanti stringa devono terminare con le virgolette
La struttura '<structurename>' deve contenere almeno una dichiarazione di evento
o di variabile membro di istanza non contrassegnata 'Custom'
Impossibile trovare "Sub Main" in "<name>"
Sub o Function non definita
Indice non incluso nell'intervallo
Impossibile completare l'operazione di lettura con TextFieldParser. È stata superata
la dimensione massima del buffer
Il tipo della variabile '<variablename>' non verrà dedotto perché associato a un
ambito di inclusione
La matrice è fissa o temporaneamente bloccata
Questa chiave è già associata a un elemento della raccolta
Troppi file.
Il tipo '<typename>' non ha costruttori
Il tipo <typename> non è conforme a CLS
Tipo '<typename>' non definito
Impossibile dedurre argomenti tipo dal delegato
Tipo non corrispondente
Impossibile dedurre il tipo di '<variablename>' perché i limiti del ciclo e la clausola
STEP non eseguono la conversione nello stesso tipo
Il tipo di membro "<membername>" non è conforme a CLS
Il tipo di valore facoltativo per il parametro facoltativo <parametername> non è
conforme a CLS
Il tipo di parametro '<parametername>' non è conforme a CLS
Impossibile utilizzare i parametri di tipo come qualificatori
Impossibile creare un assembly con nome sicuro dal file di chiave '<filename>':
<error>
Impossibile incorporare il file di risorse '<filename>': <error message>
Impossibile creare l'assembly: <error message>
Impossibile trovare il file richiesto '<filename>'
Impossibile ottenere i nomi delle porte seriali a causa di un errore di sistema interno
Impossibile collegare il file di risorse '<filename>': <error message>
Impossibile caricare le informazioni per la classe '<classname>'
Impossibile scrivere l'output in memoria
Impossibile scrivere il file temporaneo perché il percorso temporaneo non è
disponibile
Impossibile scrivere nel file di output '<filename>': <error>
Il tipo sottostante <typename> di Enum non è conforme a CLS
L'utilizzo della variabile di iterazione in un'espressione lambda può produrre risultati
imprevisti
Impossibile convertire il valore di tipo '<typename1>' in '<typename2>'
Impossibile convertire il valore del tipo '<typename1>' in '<typename2>'
Impossibile convertire il valore di tipo 'type1' in 'type2'
La variabile '<variablename>' nasconde una variabile in un blocco di inclusione
La variabile '<variablename>' viene utilizzata prima che le sia stato assegnato un
valore
La variabile utilizza un tipo di automazione non supportato in Visual Basic
Le proprietà axis XML non supportano l'associazione tardiva
L'eccezione del commento XML deve avere un attributo 'cref'
Riferimenti a entità XML non supportati
I valori letterali XML e le proprietà XML all'interno del codice incorporato non sono
supportati in ASP.NET.
L'URI dello spazio dei nomi XML '<uri>' può essere associato solo a 'xmlns'
Riferimento
Compilatore della riga di comando
Compilazione dalla riga di comando
Procedura: Richiamare il compilatore da riga di comando
Esempi di righe di comando di compilazione
Opzioni del compilatore elencate in ordine alfabetico
@ (Specifica di un file di risposta)
-addmodule
-baseaddress
-bugreport
-codepage
-debug
-define
-delaysign
-deterministic
-doc
-errorreport
-filealign
-help, -?
-highentropyva
-imports
-keycontainer
-keyfile
-langversion
-libpath
-link
-linkresource
-main
-moduleassemblyname
-netcf
-noconfig
-nologo
-nostdlib
-nowarn
-nowin32manifest
-optimize
-optioncompare
-optionexplicit
-optioninfer
-optionstrict
-out
-platform
-quiet
-recurse
-reference
-refonly
-refout
-removeintchecks
-resource
-rootnamespace
-sdkpath
-target
-subsystemversion
-utf8output
-vbruntime
-verbose
-warnaserror
-win32icon
-win32manifest
-win32resource
Opzioni del compilatore per categoria
Informazioni di riferimento su .NET Framework
Specifiche del linguaggio
Applicazioni di esempio
Procedure dettagliate
Novità in Visual Basic
12/03/2021 • 22 minutes to read • Edit Online

Questo argomento elenca i nomi delle funzionalità principali per ogni versione di Visual Basic, con descrizioni
dettagliate delle funzionalità nuove e migliorate nelle più recenti versioni del linguaggio.

Versione corrente
Visual Basic 16,9/Visual Studio 2019 versione 16,9
Per le nuove funzionalità, vedere Visual Basic 16,9.
È possibile scaricare la versione più recente di .NET SDK dalla pagina dei download di .NET.

Versioni precedenti
Visual Basic 16,0/Visual Studio 2019 versione 16,0
Per le nuove funzionalità, vedere Visual Basic 16,0.
Visual Basic 15,5/Visual Studio 2017 versione 15,5
Per le nuove funzionalità, vedere Visual Basic 15,5.
Visual Basic 15,3/Visual Studio 2017 versione 15,3
Per le nuove funzionalità, vedere Visual Basic 15,3.
Visual Basic 15/Visual Studio 2017
Per le nuove funzionalità, vedere Visual Basic 2017.
Visual Basic/Visual Studio 2015
Per le nuove funzionalità, vedere Visual Basic 14.
Visual Basic/Visual Studio 2013
Anteprime tecnologiche del .NET Compiler Platform ("Roslyn")
Visual Basic/Visual Studio 2012
Parole chiave Async e await , iteratori, attributi relativi alle informazioni sul chiamante
Visual Basic, Visual Studio 2010
Proprietà implementate automaticamente, inizializzatori di insieme, continuazione di riga implicita, elementi
dinamici, covarianza/controvarianza generica, accesso agli spazi dei nomi globali
Visual Basic/Visual Studio 2008
Language Integrated Query (LINQ), valori letterali XML, inferenza del tipo di variabile locale, inizializzatori di
oggetto, tipi anonimi, metodi di estensione, inferenza del tipo var locale, espressioni lambda, operatore if ,
metodi parziali, tipi di valore nullable
Visual Basic/Visual Studio 2005
Tipo My e tipi di helper (accesso all'app, al computer, al file system, alla rete)
Visual Basic/Visual Studio .NET 2003
Operatori di scorrimento bit, dichiarazione di variabile del ciclo
Visual Basic/Visual Studio .NET 2002
Prima versione di Visual Basic .NET
Visual Basic 16,9
Visual Basic 16,9 Abilita il consumo di proprietà solo init.

Visual Basic 16,0


Visual Basic 16,0 è incentrato sulla fornitura di più funzionalità del runtime di Visual Basic
(microsoft.visualbasic.dll) a .NET Core ed è la prima versione di Visual Basic incentrata su .NET Core. Molte parti
del runtime di Visual Basic dipendono da WinForms e verranno aggiunte in una versione successiva di Visual
Basic.
Commenti consentiti in più posizioni all'interno delle istruzioni
In Visual Basic 15,8 e versioni precedenti, i commenti sono consentiti solo su righe vuote, alla fine di
un'istruzione o in punti specifici all'interno di un'istruzione in cui è consentita una continuazione di riga implicita.
A partire da Visual Basic 16,0, i commenti sono consentiti anche dopo le continuazioni di riga esplicite e
all'interno di un'istruzione su una riga che inizia con uno spazio seguito da un carattere di sottolineatura.

Public Sub Main()


cmd.CommandText = ' Comment is allowed here without _
"SELECT * FROM Titles JOIN Publishers " _ ' This is a comment
& "ON Publishers.PubId = Titles.PubID " _
_ ' This is a comment on a line without code
& "WHERE Publishers.State = 'CA'"
End Sub

Ottimizzazione della conversione da virgola mobile a Integer


Nelle versioni precedenti di Visual Basic, le prestazioni della conversione dei valori Double e Single in valori
Integer erano relativamente scarse. Visual Basic 15.8 migliora significativamente le prestazioni delle conversioni
di valori da virgola mobile a Integer quando il valore restituito da uno dei metodi seguenti viene passato a una
delle funzioni intrinseche di conversione di interi di Visual Basic (CByte, CShort, CInt, CLng, CSByte, CUShort,
CUInt, CULng) o quando per il valore restituito da uno dei metodi seguenti viene eseguito il cast implicito a un
tipo Integer e Option Strict è Off :
Conversion.Fix(Double)
Conversion.Fix(Object)
Conversion.Fix(Single)
Conversion.Int(Double)
Conversion.Int(Object)
Conversion.Int(Single)
Math.Ceiling(Double)
Math.Floor(Double)
Math.Round(Double)
Math.Truncate(Double)
Questa ottimizzazione consente un'esecuzione più rapida del codice, fino a due volte più rapida nei casi di
esecuzione di un numero elevato di conversioni a tipi Integer. L'esempio seguente illustra alcune semplici
chiamate di metodi interessati da questa ottimizzazione:
Dim s As Single = 173.7619
Dim d As Double = s

Dim i1 As Integer = CInt(Fix(s)) ' Result: 173


Dim b1 As Byte = CByte(Int(d)) ' Result: 173
Dim s1 AS Short = CShort(Math.Truncate(s)) ' Result: 173
Dim i2 As Integer = CInt(Math.Ceiling(d)) ' Result: 174
Dim i3 As Integer = CInt(Math.Round(s)) ' Result: 174

Si noti che in questo caso i valori a virgola mobile vengono troncati anziché arrotondati.

Visual Basic 15.5


Argomenti denominati non finali
In Visual Basic 15.3 e versioni precedenti, quando una chiamata al metodo includeva argomenti in base alla
posizione e al nome, gli argomenti posizionali dovevano precedere gli argomenti denominati. A partire da
Visual Basic 15,5, gli argomenti posizionali e denominati possono trovarsi in qualsiasi ordine, purché tutti gli
argomenti fino all'ultimo argomento posizionale si trovino nella posizione corretta. Ciò è particolarmente utile
quando gli argomenti denominati vengono utilizzati per rendere il codice più leggibile.
Ad esempio, la seguente chiamata al metodo ha due argomenti posizionali tra un argomento denominato.
L'argomento denominato chiarisce che il valore 19 rappresenta un'età.

StudentInfo.Display("Mary", age:=19, #9/21/1998#)

Private Protected modificatore di accesso ai membri


Questa nuova combinazione di parole chiave definisce un membro accessibile da tutti i membri nella classe che
lo contiene, oltre che dai tipi derivati dalla classe che lo contiene, ma solo se si trovano anche nell'assembly che
lo contiene. Poiché le strutture non possono essere ereditate, è possibile applicare Private Protected solo ai
membri di una classe.
Separatore esadecimale/binario/ottali iniziale
Visual Basic 2017 ha aggiunto il supporto del carattere di sottolineatura ( _ ) come separatore di cifre. A partire
da Visual Basic 15.5, è possibile usare il carattere di sottolineatura come separatore iniziale tra il prefisso e la
cifra esadecimale, binaria o ottale. L'esempio seguente usa il separatore di cifra iniziali per definire
3.271.948.384 come numero esadecimale:

Dim number As Integer = &H_C305_F860

Per usare il carattere di sottolineatura come separatore iniziale, è necessario aggiungere l'elemento seguente al
file di progetto (*.vbproj) di Visual Basic:

<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>

Visual Basic 15.3


Inferenza di tupla denominata
Quando si assegna il valore di elementi di tupla provenienti da variabili, Visual Basic deduce il nome degli
elementi di tupla dai nomi di variabili corrispondenti; non è necessario assegnare esplicitamente un nome a un
elemento di tupla. L'esempio seguente usa l'inferenza per creare una tupla con tre elementi denominati, state ,
stateName , e capital .

Const state As String = "MI"


Const stateName As String = "Michigan"
Const capital As String = "Lansing"
Dim stateInfo = (state, stateName, capital)
Console.WriteLine($"{stateInfo.stateName}: 2-letter code: {stateInfo.State}, Capital {stateInfo.capital}")
' The example displays the following output:
' Michigan: 2-letter code: MI, Capital Lansing

Nuove opzioni del compilatore


Il compilatore della riga di comando di Visual Basic ora supporta le opzioni -refout e -refonly per il controllo
dell'output degli assembly di riferimento. -refout definisce la directory di output dell'assembly di riferimento,
mentre -refonly specifica che il risultato della compilazione può essere solo un assembly di riferimento.

Visual Basic 15
Tuple
Le tuple sono una semplice struttura dei dati che viene solitamente usata per restituire più valori da una singola
chiamata al metodo. In genere, per restituire più valori da un metodo, è necessario eseguire una delle operazioni
seguenti:
Definire un tipo personalizzato ( Class o Structure ). Si tratta di una soluzione complicata.
Definire uno o più parametri ByRef e restituire un valore dal metodo.
Grazie al supporto per tuple di Visual Basic è possibile definire rapidamente una tupla, assegnare
facoltativamente nomi semantici ai rispettivi valori e recuperare rapidamente i relativi valori. L'esempio
seguente esegue il wrapping di una chiamata al metodo TryParse e restituisce una tupla.

Imports System.Globalization

Public Module NumericLibrary


Public Function ParseInteger(value As String) As (Success As Boolean, Number As Int32)
Dim number As Integer
Return (Int32.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, number), number)
End Function
End Module

A questo punto è possibile chiamare il metodo e gestire la tupla restituita con codice simile al seguente.

Dim numericString As String = "123,456"


Dim result = ParseInteger(numericString)
Console.WriteLine($"{If(result.Success, $"Success: {result.Number:N0}", "Failure")}")
Console.ReadLine()
' Output: Success: 123,456

Valori letterali binari e separatori di cifre


È possibile definire un valore letterale binario usando il prefisso &B o &b . È anche possibile usare il carattere di
sottolineatura _ come separatore di cifre per rendere il codice più leggibile. Nell'esempio seguente vengono
usate entrambe le funzionalità per assegnare un valore Byte e visualizzarlo come un numero decimale,
esadecimale e binario.
Dim value As Byte = &B0110_1110
Console.WriteLine($"{NameOf(value)} = {value} (hex: 0x{value:X2}) " +
$"(binary: {Convert.ToString(value, 2)})")
' The example displays the following output:
' value = 110 (hex: 0x6E) (binary: 1101110)

Per altre informazioni, vedere la sezione dedicata alle assegnazioni di valori letterali dei tipi di dati Byte, Integer,
Long, Short, SByte, UInteger, ULong e UShort.
Suppor to per i valori restituiti di riferimento C#
A partire dalla versione 7.0, C# supporta i valori di riferimento restituiti. Pertanto, quando la chiamata al metodo
riceve un valore di riferimento restituito, lo può modificare. Visual Basic non consente di creare metodi con
valori di riferimento restituiti, ma consente di usare e modificare tali valori.
Ad esempio, la classe Sentence seguente scritta in C# include un metodo FindNext che rileva la parola
successiva in una frase che inizia con una sottostringa specificata. La stringa viene restituita come valore di
riferimento restituito. Una variabile Boolean passata dal riferimento al metodo indica se la ricerca ha avuto esito
positivo. Ciò significa che, oltre a leggere il valore restituito, il chiamante può anche modificarlo e tale modifica
viene riflessa nella Sentence classe.

using System;

public class Sentence


{
private string[] words;
private int currentSearchPointer;

public Sentence(string sentence)


{
words = sentence.Split(' ');
currentSearchPointer = -1;
}

public ref string FindNext(string startWithString, ref bool found)


{
for (int count = currentSearchPointer + 1; count < words.Length; count++)
{
if (words[count].StartsWith(startWithString))
{
currentSearchPointer = count;
found = true;
return ref words[currentSearchPointer];
}
}
currentSearchPointer = -1;
found = false;
return ref words[0];
}

public string GetSentence()


{
string stringToReturn = null;
foreach (var word in words)
stringToReturn += $"{word} ";

return stringToReturn.Trim();
}
}

In parole semplici, è possibile modificare la parola trovata nella frase usando un codice simile al seguente. Si
noti che non si sta assegnando un valore al metodo, ma all'espressione che il metodo restituisce, ovvero il
valore di riferimento restituito.

Dim sentence As New Sentence("A time to see the world is now.")


Dim found = False
sentence.FindNext("A", found) = "A good"
Console.WriteLine(sentence.GetSentence())
' The example displays the following output:
' A good time to see the world is now.

Esiste tuttavia un problema con questo codice. Se non viene trovata una corrispondenza, il metodo restituisce la
prima parola. L'esempio non esamina il valore dell'argomento Boolean per determinare se viene trovata una
corrispondenza. Modifica quindi la prima parola se non esiste corrispondenza. Nell'esempio seguente questo
problema viene risolto sostituendo la prima parola con la parola stessa se non esiste corrispondenza.

Dim sentence As New Sentence("A time to see the world is now.")


Dim found = False
sentence.FindNext("A", found) = IIf(found, "A good", sentence.FindNext("B", found))
Console.WriteLine(sentence.GetSentence())
' The example displays the following output:
' A good time to see the world is now.

Una soluzione migliore consiste nell'usare un metodo helper al quale il riferimento passa il valore di riferimento
restituito. Il metodo helper può quindi modificare l'argomento passato dal riferimento. Nell'esempio seguente
viene eseguita questa operazione.

Module Example
Public Sub Main()
Dim sentence As New Sentence("A time to see the world is now.")
Dim found = False
Dim returns = RefHelper(sentence.FindNext("A", found), "A good", found)
Console.WriteLine(sentence.GetSentence())
End Sub

Private Function RefHelper(ByRef stringFound As String, replacement As String, success As Boolean) _


As (originalString As String, found As Boolean)
Dim originalString = stringFound
If found Then stringFound = replacement
Return (originalString, found)
End Function
End Module
' The example displays the following output:
' A good time to see the world is now.

Per altre informazioni, vedere valori restituiti di riferimento.

Visual Basic 14
NameOf
È possibile ottenere il nome di stringa non qualificato di un tipo o di un membro, da usare in un messaggio di
errore senza definire una stringa a livello di codice. In questo modo il codice sarà corretto anche durante il
refactoring. Questa funzionalità è utile anche per l'associazione di collegamenti MVC (Modello-Vista-Controller)
e la generazione di eventi di modifica di proprietà.
Interpolazione di stringhe
È possibile usare espressioni di interpolazione di stringhe per costruire stringhe. Un'espressione di stringa
interpolata è simile a una stringa di modello che contiene espressioni. In relazione agli argomenti, è più facile
comprendere una stringa interpolata che la formattazione composita.
Indicizzazione e accesso ai membri condizionali null
È possibile verificare la presenza di valori null con una sintassi molto leggera prima di eseguire un'operazione di
accesso ai membri ( ?. ) o di indice ( ?[] ). Questi operatori consentono di scrivere meno codice per gestire i
controlli null, soprattutto per l'ordinamento decrescente delle strutture di dati. Se l'operando di sinistra o il
riferimento a un oggetto è null, le operazioni restituiscono null.
Valori letterali stringa a più righe
I valori letterali stringa possono contenere sequenze di nuove righe. Non è più necessario usare
<xml><![CDATA[...text with newlines...]]></xml>.Value come soluzione alternativa.

Commenti
È possibile inserire commenti dopo le continuazioni di riga implicita, all'interno delle espressioni
dell'inizializzatore e tra i termini delle espressioni LINQ.
Risoluzione dei nomi completi più intelligente
In precedenza, con un codice come Threading.Thread.Sleep(1000) , Visual Basic cercava lo spazio dei nomi
"Threading", individuava un'ambiguità tra System.Threading e System.Windows.Threading e quindi segnalava
un errore. Visual Basic ora prende in considerazione entrambi gli spazi dei nomi possibili. Se si visualizza l'elenco
di completamento, l'editor di Visual Studio elenca i membri di entrambi i tipi in questo elenco.
Valori letterali data anno-primo
I valori letterali data possono avere il formato aaaa-mm-gg, #2015-03-17 16:10 PM# .
Proprietà dell'interfaccia ReadOnly
È possibile implementare proprietà dell'interfaccia readonly usando una proprietà readonly. L'interfaccia
garantisce la funzionalità minima e le classi di implementazione non smettono di consentire l'impostazione della
proprietà.
Non <expr> typeof <type>
Per una maggiore leggibilità del codice, ora è possibile usare TypeOf con IsNot .
Avviso #Disable <ID> e #Enable avviso <ID>
È possibile disabilitare e abilitare avvisi specifici per le aree all'interno di un file di origine.
Miglioramenti dei commenti in formato documentazione XML
Quando si scrivono commenti ai documenti, si accede a Smart Editor e al supporto per la compilazione per la
convalida di nomi di parametro, la corretta gestione di crefs (generics, operatori e così via), la colorazione e il
refactoring.
Definizioni di interfacce e moduli parziali
Oltre a classi e struct, è possibile dichiarare interfacce e moduli parziali.
#Region direttive all'interno di corpi del metodo
È possibile inserire delimitatori #Region...#End Region in qualsiasi punto di un file, nelle funzioni o nei corpi delle
funzioni.
Le definizioni delle sostituzioni sono overload impliciti
Se si aggiunge il modificatore Overrides a una definizione, il compilatore aggiunge in modo implicito
Overloads . In questo modo è possibile digitare meno codice nella maggior parte dei casi.
CObj consentito negli argomenti degli attributi
Il compilatore generava un errore indicante che CObj(...), se usato nelle costruzioni degli attributi, non era una
costante.
Dichiarazione e utilizzo di metodi ambigui da interfacce diverse
In precedenza il codice seguente restituiva errori che impedivano di dichiarare IMock o di chiamare GetDetails
(se questi erano stati dichiarati in c#):

Interface ICustomer
Sub GetDetails(x As Integer)
End Interface

Interface ITime
Sub GetDetails(x As String)
End Interface

Interface IMock : Inherits ICustomer, ITime


Overloads Sub GetDetails(x As Char)
End Interface

Interface IMock2 : Inherits ICustomer, ITime


End Interface

Ora il compilatore userà le normali regole di risoluzione dell'overload per scegliere l'oggetto GetDetails più
appropriato da chiamare ed è possibile dichiarare le relazioni tre le interfacce in Visual Basic, come quelle
mostrate nell'esempio.

Vedi anche
Novità di Visual Studio 2017
Novità di Visual Studio 2019
Informazioni sulle modifiche di rilievo nel
compilatore di Visual Basic
02/11/2020 • 2 minutes to read • Edit Online

Il team Roslyn gestisce un elenco di modifiche di rilievo nei compilatori C# e Visual Basic. Per informazioni sulle
modifiche, vedere questi collegamenti nel repository GitHub:
Modifiche di rilievo in VS2019 Update 1 e versioni successive rispetto a VS2019
Modifiche di rilievo rispetto a VS2017 (VB 15)
Modifiche di rilievo in Roslyn 3,0 (VS2019) da Roslyn 2. * (VS2017)
Modifiche di rilievo in Roslyn 1,0 (VS2015) dal compilatore C# nativo (VS2013 e precedenti).
Membri enum in conflitto
Introduzione a Visual Basic
06/03/2021 • 2 minutes to read • Edit Online

Questa sezione della documentazione fornisce informazioni introduttive per lo sviluppo di applicazione di Visual
Basic.

Introduzione a Visual Basic e .NET Core


Creare un'applicazione Hello World con .NET Core in Visual Studio
Creare una libreria di classi con .NET Standard in Visual Studio

Informazioni aggiuntive
Novità di Visual Basic Elenca le nuove funzionalità in ognuna delle versioni di Visual Basic .NET.
Risorse aggiuntive per i programmatori di Visual Basic Viene fornito un elenco di siti Web e newsgroup
che consentono di trovare le risposte ai problemi più comuni.

Vedi anche
Ottenere Visual Basic Fornisce collegamenti di download per le versioni di Visual Studio fornite con
supporto Visual Basic, incluse le versioni gratuite.
Programmazione orientata ad oggetti Include collegamenti a pagine introduttive sulla programmazione
orientata a oggetti e che descrivono la creazione di oggetti personalizzati e l'uso degli oggetti per
semplificare la scrittura del codice.
Esempi Include collegamenti a codice di esempio in Visual Basic.
Procedure dettagliate Include un elenco delle pagine della Guida con dimostrazioni dei vari aspetti del
linguaggio Visual Basic.
Opzioni di feedback per Visual Studio Viene illustrato come ricevere supporto e inviare commenti e
suggerimenti.
Visual Studio Include collegamenti alla documentazione di Visual Studio.
C# Vengono forniti i collegamenti alla documentazione relativa allo sviluppo di applicazioni con Visual
C#.
Visual C++ Include collegamenti alla documentazione di Visual C++.
Sviluppo per Office e SharePoint Informazioni sull'uso di Microsoft Office e Visual Studio come parte di
un'applicazione aziendale.
Risorse aggiuntive
06/03/2021 • 2 minutes to read • Edit Online

Nei siti Web seguenti è disponibile materiale sussidiario per trovare la soluzione ai problemi comuni.

Risorse Microsoft
Sul Web
URL DESC RIZ IO N E

Progettazione del linguaggio Visual Basic .NET Repository ufficiale per la progettazione del linguaggio Visual
Basic .NET su GitHub.

Blog del team di Microsoft Visual Basic Viene fornito l'accesso al blog del team di Visual Basic.

Esempi di codice
URL DESC RIZ IO N E

Esempi nella documentazione di Visual Basic Contiene gli esempi usati nell'intera documentazione di
Visual Basic e .NET.

Browser esempi Contiene esempi di codice scritti in Visual Basic

Forum
URL DESC RIZ IO N E

Domande e risposte Microsoft Domande tecniche sul linguaggio di programmazione Visual


Basic.

Video e webcast
URL DESC RIZ IO N E

Channel9 Viene fornito l'accesso continuo a una community attraverso


video, Wiki e forum.

Supporto
URL DESC RIZ IO N E

supporto tecnico Microsoft È possibile accedere agli articoli di Microsoft Knowledge Base
(KB), a download e ad aggiornamenti, a servizi di supporto
su Web e ad altri servizi.

Domande su Visual Studio Consente di segnalare bug o inoltrare suggerimenti a


Microsoft su .NET e Visual Studio. È anche possibile segnalare
un bug selezionando Guida > Invia commenti e
suggerimenti > segnala un problema in Visual Studio.
Risorse di terze parti
URL DESC RIZ IO N E

VBForums Forum di discussione su Visual Basic, .NET e altro ancora.

vbCity Sito della community per utenti che vogliono conoscere


Visual Basic e .NET e rivolgere delle domande.

Stack Overflow Overflow dello stack è un sito che contiene domande e


risposte dedicato agli sviluppatori.

Vedi anche
Introduzione a Visual Basic
Opzioni per commenti e suggerimenti in Visual Studio
Sviluppo di applicazioni con Visual Basic
05/03/2021 • 2 minutes to read • Edit Online

In questa sezione viene illustrata la documentazione su concetti che riguardano il linguaggio Visual Basic.

Contenuto della sezione


Programmazione in Visual Basic
Tratta vari argomenti di programmazione.
Sviluppo con My
Descrive una nuova funzione denominata My , che consente di accedere alle informazioni e alle istanze di
oggetto predefinite che sono associate a un'applicazione e al relativo ambiente di runtime.
Accesso ai dati nelle applicazioni Visual Basic
Contiene la Guida con le informazioni per accedere ai dati in Visual Basic.
Creazione e utilizzo di componenti in Visual Basic
Definisce il termine componente e illustra come e quando creare i componenti.
Nozioni di base sulle applicazioni Windows Forms
Contiene informazioni sulla creazione di applicazioni Windows Form con Visual Studio.
Personalizzazione di progetti ed estensione di oggetti My
Descrive come personalizzare modelli di progetto per creare altri oggetti My .

Sezioni correlate
Guida per programmatori Visual Basic
Illustra gli elementi fondamentali di programmazione con Visual Basic.
Riferimenti al linguaggio Visual Basic
Contiene la documentazione di riferimento per il linguaggio Visual Basic.
Programmazione in Visual Basic
05/03/2021 • 2 minutes to read • Edit Online

Questa sezione discute le attività di programmazione da approfondire per la creazione di un'applicazione Visual
Basic.

Contenuto della sezione


Accesso alle risorse del computer
Include documentazione sull'uso dell'oggetto My.Computer per accedere a informazioni riguardanti il computer
in cui è in esecuzione un'applicazione. Viene inoltre descritto in che modo è possibile controllare tale computer.
Registrazione di informazioni relative all'applicazione
Include documentazione su come registrare le informazioni provenienti dall'applicazione usando gli oggetti
My.Application.Log e My.Log . Viene inoltre spiegato come estendere le funzionalità di registrazione
dell'applicazione.
Accesso ai dati utente
Include documentazione sulle attività che è possibile eseguire usando l'oggetto My.User .
Accesso ai moduli dell'applicazione
Include documentazione sull'accesso ai form di un'applicazione mediante gli oggetti My.Forms e
My.Application .

Accesso ai servizi Web dell'applicazione


Include documentazione sulla modalità di accesso ai servizi Web a cui fa riferimento l'applicazione mediante
l'oggetto My.WebServices .
Accessing Application Settings
Include documentazione sull'accesso alle impostazioni di un'applicazione mediante l'oggetto My.Settings .
Elaborazione di unità, directory e file
Include documentazione su come accedere al file system mediante l'oggetto My.Computer.FileSystem .

Vedi anche
Funzionalità del linguaggio Visual Basic
Concetti di programmazione
raccolte
Sviluppo di applicazioni con Visual Basic
Accesso alle risorse del computer (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

L'oggetto My.Computer è uno dei tre oggetti principali di My e permette l'accesso a informazioni e funzionalità
usate di frequente. My.Computer specifica metodi, proprietà ed eventi per l'accesso al computer in cui è eseguita
l'applicazione. Gli oggetti includono:
Audio
Appunti (ClipboardProxy)
Clock
FileSystem
Info
Keyboard
Mouse
Network
Ports
Registro di sistema (RegistryProxy)

Contenuto della sezione


Riproduzione di suoni
Elenca le attività associate a My.Computer.Audio , ad esempio la riproduzione di un suono in background.
Archiviazione e lettura di dati negli Appunti
Elenca le attività associate a My.Computer.Clipboard , ad esempio la lettura o la scrittura di dati negli Appunti.
Ottenere informazioni sul computer
Elenca le attività associate a My.Computer.Info , ad esempio il rilevamento del nome completo di un computer o
di indirizzi IP.
Accesso alla tastiera
Elenca le attività associate a My.Computer.Keyboard , ad esempio il rilevamento di BLOC MAIUSC attivo.
Accesso al mouse
Elenca le attività associate a My.Computer.Mouse , ad esempio il rilevamento della presenza di un mouse.
Esecuzione di operazioni di rete
Elenca le attività associate a My.Computer.Network , ad esempio il caricamento o il download di file.
Accesso alle porte del computer
Elenca le attività associate a My.Computer.Ports , ad esempio la visualizzazione delle porte seriali disponibili o
l'invio di stringhe a porte seriali.
Lettura e scrittura nel Registro di sistema
Elenca le attività associate a My.Computer.Registry , ad esempio la lettura o la scrittura di dati nelle chiavi del
Registro di sistema.
Registrazione di informazioni relative
all'applicazione (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Questa sezione contiene argomenti che descrivono come registrare le informazioni provenienti dall'applicazione
usando l'oggetto My.Application.Log o My.Log . Viene anche spiegato come estendere le funzionalità di
registrazione dell'applicazione.
L'oggetto Log fornisce i metodi per scrivere le informazioni sui listener di log dell'applicazione, mentre la
proprietà avanzata TraceSource dell'oggetto Log fornisce informazioni di configurazione dettagliate. L'oggetto
Log può essere configurato dal file di configurazione dell'applicazione.

L'oggetto è disponibile solo per le applicazioni ASP.NET. Per le applicazioni client, usare
My.Log
My.Application.Log . Per altre informazioni, vedere Log.

Attività
A VEDERE

Scrivere le informazioni sugli eventi nei log dell'applicazione. Procedura: Scrivere messaggi di log

Scrivere le informazioni sulle eccezioni nei log Procedura: Registrare eccezioni


dell'applicazione.

Scrivere le informazioni di traccia nei log dell'applicazione Procedura: Registrare messaggi all'avvio o all'arresto
all'avvio e alla chiusura dell'applicazione. dell'applicazione

Configurare My.Application.Log per scrivere le Procedura: Scrivere informazioni sugli eventi in un file di
informazioni in un file di testo. testo

Configurare My.Application.Log per scrivere le Procedura: Scrivere nel log eventi di un'applicazione
informazioni in un log eventi.

Modificare la posizione in cui My.Application.Log scrive le Procedura dettagliata: Modifica della posizione di
informazioni. inserimento delle informazioni con My.Application.Log

Determinare la posizione in cui My.Application.Log scrive Procedura dettagliata: Individuazione della posizione di
le informazioni. inserimento delle informazioni con My.Application.Log

Creare un listener di log personalizzato per Procedura dettagliata: Creazione di listener di log
My.Application.Log . personalizzati

Filtrare l'output dei log My.Application.Log . Procedura dettagliata: Filtro dell'output di


My.Application.Log

Vedi anche
Microsoft.VisualBasic.Logging.Log
Utilizzo dei log applicazione
Risoluzione dei problemi: Listener di log
Accesso ai dati utente (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Questa sezione contiene argomenti relativi all'oggetto My.User e alle attività che tale oggetto consente di
eseguire.
L'oggetto My.User consente di accedere alle informazioni sull'utente connesso restituendo un oggetto in grado
di implementare l'interfaccia IPrincipal.

Attività
A VEDERE

Ottenere il nome dell'account di accesso dell'utente Name

Ottenere il nome di dominio dell'utente se l'applicazione usa CurrentPrincipal


l'autenticazione di Windows

Determinare il ruolo dell'utente IsInRole

Vedere anche
User
Accesso ai form di un'applicazione (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

L'oggetto My.Forms rappresenta un modo semplice di accedere a un'istanza di ogni Windows Form dichiarato
nel progetto dell'applicazione. È anche possibile usare le proprietà dell'oggetto My.Application per visualizzare
la schermata iniziale e il modulo principale dell'applicazione e per ottenere un elenco dei moduli aperti
dell'applicazione.

Attività
La tabella seguente elenca esempi che illustrano come accedere ai moduli di un'applicazione.

A VEDERE

Accedere a un modulo da un altro modulo di Oggetto My.Forms


un'applicazione.

Visualizzare i titoli di tutti i moduli aperti dell'applicazione. OpenForms

Aggiornare la schermata iniziale con informazioni sullo stato SplashScreen


all'avvio dell'applicazione.

Vedi anche
OpenForms
SplashScreen
Oggetto My.Forms
Accesso ai servizi Web dell'applicazione (Visual
Basic)
05/03/2021 • 2 minutes to read • Edit Online

L'oggetto My.WebServices fornisce un'istanza di ogni servizio Web a cui si fa riferimento nel progetto corrente.
Ogni istanza viene creata su richiesta. È possibile accedere a questi servizi Web tramite le proprietà dell'oggetto
My.WebServices . Il nome della proprietà è uguale al nome del servizio Web a cui la proprietà accede. Qualsiasi
classe che eredita da SoapHttpClientProtocol è un servizio Web.

Attività
La tabella seguente presenta i modi possibili per accedere ai servizi Web a cui fa riferimento un'applicazione.

A VEDERE

Chiamare un servizio Web Oggetto My.WebServices

Chiamare un servizio Web in modo asincrono e gestire un Procedura: Chiamare un servizio Web in modo asincrono
evento quando quest'ultimo viene completato

Vedi anche
Oggetto My.WebServices
Procedura: chiamare un servizio Web in modo
asincrono (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Questo esempio associa un gestore a un evento gestore asincrono di un servizio Web in modo che possa
recuperare il risultato di una chiamata di metodo sincrono. L'esempio usa il servizio Web
DemoTemperatureService disponibile all'indirizzo http://www.xmethods.net .
Quando in un progetto si fa riferimento a un servizio Web nell'ambiente di sviluppo integrato (IDE, Integrated
Development Environment) di Visual Studio, questo viene aggiunto all'oggetto My.WebServices e l'IDE genera
una classe proxy del client per accedere a un servizio Web specifico
La classe proxy consente di chiamare i metodi del servizio Web in modo sincrono; in altre parole l'applicazione
aspetta che la funzione sia terminata. Inoltre, il proxy crea membri aggiuntivi che contribuiscono a chiamare il
metodo in modo asincrono. Per ogni funzione di servizio Web, NameOfWebServiceFunction, il proxy crea una
subroutine NameOfWebServiceFunction Async , un evento NameOfWebServiceFunction Completed e una classe
NameOfWebServiceFunction CompletedEventArgs . L'esempio dimostra come usare i membri asincroni per
accedere alla funzione getTemp del servizio Web DemoTemperatureService.

NOTE
Tale codice non funziona nelle applicazioni Web perché ASP.NET non supporta l'oggetto My.WebServices .

Chiamare un servizio Web in modo asincrono


1. Fare riferimento al servizio Web DemoTemperatureService Web in http://www.xmethods.net . L'indirizzo è

http://www.xmethods.net/sd/2001/DemoTemperatureService.wsdl

2. Aggiungere un gestore eventi per l'evento getTempCompleted :

Private Sub getTempCompletedHandler(ByVal sender As Object,


ByVal e As net.xmethods.www.getTempCompletedEventArgs)

MsgBox("Temperature: " & e.Result)


End Sub

NOTE
Non è possibile usare l'istruzione Handles per associare un gestore eventi agli eventi dell'oggetto
My.WebServices .

3. Aggiungere un campo di cui tenere traccia se il gestore eventi è stato aggiunto all'evento
getTempCompleted :

Private handlerAttached As Boolean = False


4. Aggiungere un metodo che consenta di aggiungere, se necessario, il gestore eventi all'evento
getTempCompleted e di chiamare il metodo getTempAsync :

Sub CallGetTempAsync(ByVal zipCode As Integer)


If Not handlerAttached Then
AddHandler My.WebServices.
TemperatureService.getTempCompleted,
AddressOf Me.TS_getTempCompleted
handlerAttached = True
End If
My.WebServices.TemperatureService.getTempAsync(zipCode)
End Sub

Per chiamare il metodo Web getTemp in modo asincrono, chiamare il metodo CallGetTempAsync . Al
termine dell'esecuzione del metodo Web il relativo valore restituito viene passato al gestore eventi
getTempCompletedHandler .

Vedi anche
Accesso ai servizi Web dell'applicazione
Oggetto My.WebServices
Accesso alle impostazioni dell'applicazione (Visual
Basic)
05/03/2021 • 2 minutes to read • Edit Online

Questa sezione include argomenti che descrivono l'oggetto My.Settings e le attività che consente di eseguire.

My.Settings
Le proprietà dell'oggetto My.Settings offrono accesso alle impostazioni dell'applicazione. Per aggiungere o
rimuovere le impostazioni, usare il riquadro Impostazioni della Creazione progetti .
I metodi dell'oggetto My.Settings consentono di salvare le impostazioni utente correnti o di ripristinare le
impostazioni utente agli ultimi valori salvati.

Attività
La tabella seguente elenca esempi che illustrano come accedere ai moduli di un'applicazione.

A VEDERE

Aggiornare il valore di un'impostazione utente Procedura: modificare le impostazioni dell'utente in Visual


Basic

Visualizzare le impostazioni utente e dell'applicazione in una Procedura: Creare griglie di proprietà per impostazioni
griglia delle proprietà utente in Visual Basic

Salvare i valori delle impostazioni utente aggiornate Procedura: Mantenere le impostazioni dell'utente in Visual
Basic

Determinare i valori delle impostazioni utente Procedura: Leggere le impostazioni dell'applicazione in Visual
Basic

Vedi anche
Gestione delle impostazioni di un'applicazione (.NET)
Oggetto My.Settings
Elaborazione di unità, directory e file (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

È possibile usare Visual Basic per elaborare unità, cartelle e file con l'oggetto My.Computer.FileSystem che offre
prestazioni migliori ed è più semplice da usare rispetto ai metodi tradizionali, ad esempio le funzioni FileOpen e
Write , che sono tuttavia ancora disponibili. Le sezioni seguenti descrivono questi metodi in dettaglio.

Contenuto della sezione


Accesso ai file con Visual Basic
Descrive come usare l'oggetto My.Computer.FileSystem per lavorare con file, unità e cartelle.
Nozioni fondamentali sul file system e sulla funzionalità di I/O di file di .NET Framework (Visual Basic)
Offre una panoramica dei concetti relativi alla funzionalità di I/O di file in .NET Framework, inclusi flussi, spazio
di memorizzazione isolato, eventi di file, attributi di file e accesso ai file.
Procedura dettagliata: Modifica di file con i metodi .NET Framework
Descrive come usare .NET Framework per modificare file e cartelle.
Procedura dettagliata: Modifica di file e directory in Visual Basic
Descrive come usare l'oggetto My.Computer.FileSystem per modificare file e cartelle.

Sezioni correlate
Struttura del programma e convenzioni del codice
Offre le linee guida relative alla struttura fisica e all'aspetto dei programmi.
FileSystem
Documentazione di riferimento dell'oggetto My.Computer.FileSystem e i relativi membri.
Sviluppo con My (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Visual Basic fornisce nuove funzionalità per lo sviluppo rapido di applicazioni che migliorano la produttività e
aumentano la facilità d'uso, garantendo al tempo stesso maggiore potenza. Una di queste funzionalità,
denominata My , consente di accedere a informazioni e istanze di oggetti predefinite correlate all'applicazione e
al relativo ambiente di run-time. Queste informazioni sono organizzate in un formato riconoscibile tramite
IntelliSense e delineato in modo logico in base all'uso.
I membri di My di primo livello sono esposti come oggetti. Ogni oggetto si comporta in modo analogo a uno
spazio dei nomi o a una classe con membri Shared ed espone un set di membri correlati.
Questa tabella mostra gli oggetti My di primo livello e le relazioni tra tali oggetti.

Contenuto della sezione


Esecuzione di attività mediante My.Application, My.Computer e My.User
Vengono descritti i tre principali oggetti My , My.Application , My.Computer e My.User , che consentono di
accedere a informazioni e funzionalità.
Istanze predefinite degli oggetti fornite da My.Forms e My.WebServices
Vengono descritti gli oggetti My.Forms e My.WebServices , che consentono di accedere a form, origini dati e
servizi Web XML usati dall'applicazione.
Sviluppo rapido di applicazioni con My.Resources e My.Settings
Vengono descritti gli oggetti My.Resources e My.Settings , che consentono di accedere alle risorse e alle
impostazioni di un'applicazione.
Cenni preliminari sul modello di applicazione Visual Basic
Viene descritto il modello di avvio/arresto dell'applicazione Visual Basic.
Dipendenza di My dal tipo di progetto
Vengono forniti dettagli sulle caratteristiche di My disponibili per i diversi tipi di progetto.

Vedi anche
ApplicationBase
Computer
User
Oggetto My.Forms
Oggetto My.WebServices
Dipendenza di My dal tipo di progetto
Esecuzione di attività mediante My.Application,
My.Computer e My.User (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

I tre My oggetti centrali che consentono di accedere alle informazioni e alle funzionalità comunemente utilizzate
sono My.Application ( ApplicationBase ), My.Computer ( Computer ) e My.User () User . Questi oggetti possono
essere usati per accedere alle informazioni relative all'applicazione corrente, al computer in cui è installata
l'applicazione o all'utente corrente dell'applicazione.

My. Application, My. computer e My. User


Gli esempi seguenti illustrano come è possibile recuperare le informazioni usando My .

' Displays a message box that shows the full command line for the
' application.
Dim args As String = ""
For Each arg As String In My.Application.CommandLineArgs
args &= arg & " "
Next
MsgBox(args)

' Gets a list of subfolders in a folder


My.Computer.FileSystem.GetDirectories(
My.Computer.FileSystem.SpecialDirectories.MyDocuments, True, "*Logs*")

Oltre a recuperare le informazioni, i membri esposti tramite questi tre oggetti consentono inoltre di eseguire
metodi correlati a tale oggetto. Ad esempio, è possibile accedere a diversi metodi per modificare i file o
aggiornare il registro di sistema tramite My.Computer .
L'I/O dei file è significativamente più semplice e veloce con My , che include un'ampia gamma di metodi e
proprietà per la modifica di file, directory e unità. L' TextFieldParser oggetto consente di leggere da file strutturati
di grandi dimensioni con campi delimitati o a larghezza fissa. In questo esempio viene aperto TextFieldParser
reader e utilizzato per leggere da C:\TestFolder1\test1.txt .

Dim reader =
My.Computer.FileSystem.OpenTextFieldParser("C:\TestFolder1\test1.txt")
reader.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited
reader.Delimiters = New String() {","}
Dim currentRow As String()
While Not reader.EndOfData
Try
currentRow = reader.ReadFields()
Dim currentField As String
For Each currentField In currentRow
MsgBox(currentField)
Next
Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
MsgBox("Line " & ex.Message &
"is not valid and will be skipped.")
End Try
End While
My.Application consente di modificare le impostazioni cultura per l'applicazione. Nell'esempio seguente viene
illustrato come è possibile chiamare questo metodo.

' Changes the current culture for the application to Jamaican English.
My.Application.ChangeCulture("en-JM")

Vedi anche
ApplicationBase
Computer
User
Dipendenza di My dal tipo di progetto
Istanze predefinite degli oggetti fornite da
My.Forms e My.WebServices (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Gli oggetti My. Forms e My. WebServices consentono di accedere ai moduli, alle origini dati e ai servizi Web
XML utilizzati dall'applicazione. Forniscono l'accesso tramite raccolte di istanze predefinite di ognuno di questi
oggetti.

Istanze predefinite
Un'istanza predefinita è un'istanza della classe fornita dal runtime e non è necessario dichiararla e crearne
un'istanza usando le Dim New istruzioni e. Nell'esempio seguente viene illustrato come dichiarare e creare
un'istanza di una Form classe denominata e Form1 come ora è possibile ottenere un'istanza predefinita di
questa Form classe tramite My.Forms .

' The old method of declaration and instantiation


Dim myForm As New Form1
myForm.show()

' With My.Forms, you can directly call methods on the default
' instance()
My.Forms.Form1.Show()

L' My.Forms oggetto restituisce una raccolta di istanze predefinite per ogni Form classe esistente nel progetto.
Analogamente, My.WebServices fornisce un'istanza predefinita della classe proxy per ogni servizio Web a cui è
stato creato un riferimento nell'applicazione.

Vedi anche
Oggetto My.Forms
Oggetto My.WebServices
Dipendenza di My dal tipo di progetto
Sviluppo rapido di applicazioni con My.Resources e
My.Settings (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

L' My.Resources oggetto fornisce l'accesso alle risorse dell'applicazione e consente di recuperare in modo
dinamico le risorse per l'applicazione.

Recupero di risorse
Tramite l'oggetto è possibile recuperare diverse risorse, ad esempio file audio, icone, immagini e stringhe
My.Resources . Ad esempio, è possibile accedere ai file di risorse specifici delle impostazioni cultura
dell'applicazione. Nell'esempio seguente viene impostata l'icona del form sull'icona denominata Form1Icon
archiviato nel file di risorse dell'applicazione.

Sub SetFormIcon()
Me.Icon = My.Resources.Form1Icon
End Sub

L' My.Resources oggetto espone solo le risorse globali. Non fornisce l'accesso ai file di risorse associati ai
moduli. Accedere alle risorse del modulo dal form.
Analogamente, l' My.Settings oggetto fornisce l'accesso alle impostazioni dell'applicazione e consente di
archiviare e recuperare dinamicamente le impostazioni delle proprietà e altre informazioni per l'applicazione.
Per altre informazioni, vedere oggetto My. resources e My. Settings.

Vedi anche
Oggetto My.Resources
Oggetto My.Settings
Accessing Application Settings
Cenni preliminari sul modello di applicazione Visual
Basic
05/03/2021 • 7 minutes to read • Edit Online

Visual Basic fornisce un modello ben definito per controllare il comportamento delle applicazioni Windows
Form: il modello di applicazione Visual Basic. Questo modello include gli eventi per gestire l'avvio e l'arresto
dell'applicazione, nonché gli eventi per intercettare le eccezioni non gestite. Fornisce inoltre il supporto per lo
sviluppo di applicazioni a istanza singola. Il modello applicativo è estendibile, quindi gli sviluppatori che
necessitano di un maggior controllo possono personalizzare i metodi sottoponibili a override.

Usi per il modello di applicazione


Un'applicazione tipica deve eseguire attività quando viene avviata e arrestata. Ad esempio, all'avvio,
l'applicazione può visualizzare una schermata iniziale, stabilire connessioni al database, caricare uno stato
salvato e così via. Quando l'applicazione viene arrestata, è possibile chiudere le connessioni di database, salvare
lo stato corrente e così via. Inoltre, l'applicazione può eseguire codice specifico quando l'applicazione si arresta
in modo imprevisto, ad esempio durante un'eccezione non gestita.
Il modello di applicazione Visual Basic semplifica la creazione di un'applicazione a istanza singola .
Un'applicazione a istanza singola è diversa da un'applicazione normale, in quanto è possibile eseguire una sola
istanza dell'applicazione alla volta. Il tentativo di avviare un'altra istanza di un'applicazione a istanza singola
comporta la notifica dell'istanza originale, per mezzo dell' StartupNextInstance evento, che è stato eseguito un
altro tentativo di avvio. La notifica include gli argomenti della riga di comando dell'istanza successiva. L'istanza
successiva dell'applicazione viene quindi chiusa prima che possa verificarsi un'inizializzazione.
Viene avviata un'applicazione a istanza singola e viene verificato se si tratta della prima istanza o di un'istanza
successiva dell'applicazione:
Se è la prima istanza, viene avviata come di consueto.
Ogni tentativo successivo di avviare l'applicazione, mentre viene eseguita la prima istanza, comporta un
comportamento molto diverso. Il tentativo successivo invia una notifica alla prima istanza sugli
argomenti della riga di comando e quindi si chiude immediatamente. La prima istanza gestisce l'
StartupNextInstance evento per determinare quali sono gli argomenti della riga di comando dell'istanza
successiva e continuano a essere eseguiti.
Questo diagramma mostra il modo in cui un'istanza successiva segnala la prima istanza:

Gestendo l' StartupNextInstance evento, è possibile controllare il comportamento dell'applicazione a istanza


singola. Microsoft Outlook, ad esempio, viene in genere eseguito come applicazione a istanza singola. Quando
Outlook è in esecuzione e si tenta di riavviare Outlook, lo stato attivo passa all'istanza originale, ma non viene
aperta un'altra istanza.

Eventi nel modello applicativo


Nel modello di applicazione sono disponibili gli eventi seguenti:
Avvio dell'applicazione . L'applicazione genera l' Startup evento all'avvio. Gestendo questo evento, è
possibile aggiungere il codice che Inizializza l'applicazione prima che venga caricato il form principale. L'
Startup evento fornisce anche l'annullamento dell'esecuzione dell'applicazione durante la fase del
processo di avvio, se necessario.
È possibile configurare l'applicazione in modo da visualizzare una schermata iniziale mentre viene
eseguito il codice di avvio dell'applicazione. Per impostazione predefinita, il modello di applicazione
elimina la schermata iniziale quando /nosplash -nosplash si usa l'argomento della riga di comando o.
Applicazioni a istanza singola . L' StartupNextInstance evento viene generato quando viene avviata
un'istanza successiva di un'applicazione a istanza singola. L'evento passa gli argomenti della riga di
comando dell'istanza successiva.
Eccezioni non gestite . Se l'applicazione rileva un'eccezione non gestita, genera l' UnhandledException
evento. Il gestore per l'evento può esaminare l'eccezione e determinare se continuare l'esecuzione.
In alcune circostanze l'evento non viene generato. Per altre informazioni, vedere
UnhandledException
UnhandledException.
Modifiche della connettività di rete . Se la disponibilità di rete del computer viene modificata,
l'applicazione genera l' NetworkAvailabilityChanged evento.
NetworkAvailabilityChanged In alcune circostanze l'evento non viene generato. Per altre informazioni,
vedere NetworkAvailabilityChanged.
L'applicazione è stata arrestata . L'applicazione fornisce l' Shutdown evento da segnalare quando sta per
essere arrestato. In tale gestore eventi, è possibile verificare che le operazioni che l'applicazione deve
eseguire, ad esempio la chiusura e il salvataggio, siano completate. È possibile configurare l'applicazione
in modo che venga arrestata quando il form principale viene chiuso o per arrestarsi solo quando tutti i
form si chiudono.

Disponibilità
Per impostazione predefinita, il modello di applicazione Visual Basic è disponibile per i progetti Windows Form.
Se si configura l'applicazione in modo che usi un oggetto di avvio diverso o si avvia il codice dell'applicazione
con un oggetto personalizzato Sub Main , tale oggetto o classe potrebbe dover fornire un'implementazione
della WindowsFormsApplicationBase classe per usare il modello di applicazione. Per informazioni sulla modifica
dell'oggetto di avvio, vedere pagina applicazione, Progettazione progetti (Visual Basic).

Vedi anche
WindowsFormsApplicationBase
Startup
StartupNextInstance
UnhandledException
Shutdown
NetworkAvailabilityChanged
WindowsFormsApplicationBase
Estensione del modello di applicazione Visual Basic
Dipendenza di My dal tipo di progetto (Visual Basic)
05/03/2021 • 5 minutes to read • Edit Online

My espone solo gli oggetti richiesti da un determinato tipo di progetto. Ad esempio, l' My.Forms oggetto è
disponibile in un Windows Forms Application ma non è disponibile in un'applicazione console. In questo
argomento vengono descritti My gli oggetti disponibili in diversi tipi di progetto.

My in siti Web e applicazioni Windows


My espone solo gli oggetti utili nel tipo di progetto corrente. Elimina gli oggetti non applicabili. Nell'immagine
seguente, ad esempio, viene illustrato il My modello a oggetti in un progetto Windows Form.

In un progetto di sito Web, My espone oggetti rilevanti per uno sviluppatore web (ad esempio, gli My.Request
My.Response oggetti e) durante l'eliminazione degli oggetti che non sono rilevanti, ad esempio l' My.Forms
oggetto. Nell'immagine seguente viene illustrato il My modello a oggetti in un progetto di sito Web:

Dettagli progetto
La tabella seguente mostra My gli oggetti abilitati per impostazione predefinita per otto tipi di progetto:
applicazione Windows, libreria di classi, applicazione console, libreria di controlli Windows, libreria di controlli
Web, servizio Windows, vuoto e sito Web.
Sono disponibili tre versioni dell' My.Application oggetto, due versioni dell' My.Computer oggetto e due
versioni dell'oggetto. le My.User informazioni dettagliate su queste versioni vengono fornite nelle note a piè di
pagina dopo la tabella.

L IB RERIA
DI
A P P L IC A C O N T RO L IB RERIA
Z IO N E A P P L IC A LLI DI SERVIZ IO
O GGET TO W IN DO W L IB RERIA Z IO N E W IN DO W C O N T RO W IN DO W
MY S DI C L A SSI C O N SO L E S L L I W EB S EM P T Y SITO W EB

Sì 1
My.Application Sì 2 Sì 3 Sì 2 No Sì 3 No No

My.Computer Sì 4 Sì 4 Sì 4 Sì 4 Sì 5 Sì 4 No Sì 5

My.Forms Sì No No Sì No No No No

My.Log No No No No No No No Sì

My.Request No No No No No No No Sì

My.ResourcesSì Sì Sì Sì Sì Sì No No

My.Response No No No No No No No Sì

My.Settings Sì Sì Sì Sì Sì Sì No No

My.User Sì 6 Sì 6 Sì 6 Sì 6 Sì 7 Sì 6 No Sì 7


My.WebServices Sì Sì Sì Sì Sì No No

1 Windows Form versione di My.Application . Deriva dalla versione della console (vedere la nota 3); aggiunge il
supporto per l'interazione con le finestre dell'applicazione e fornisce il modello di applicazione Visual Basic.
versione 2 della libreria My.Application . Fornisce le funzionalità di base necessarie per un'applicazione: fornisce
i membri per la scrittura nel registro applicazioni e l'accesso alle informazioni sull'applicazione.
3 versione della console di My.Application
. Deriva dalla versione della libreria (vedere la nota 2) e aggiunge
membri aggiuntivi per accedere agli argomenti della riga di comando dell'applicazione e alle informazioni sulla
distribuzione ClickOnce.
4 versione Windows di My.Computer . Deriva dalla versione del server (vedere la nota 5) e fornisce l'accesso a
oggetti utili in un computer client, ad esempio la tastiera, lo schermo e il mouse.
versione di 5 server di My.Computer . Fornisce informazioni di base sul computer, ad esempio il nome, l'accesso
al clock e così via.
6 versione di Windows My.User . Questo oggetto è associato all'identità corrente del thread.
7 versione Web di My.User . Questo oggetto è associato all'identità utente della richiesta HTTP corrente
dell'applicazione.
Vedi anche
ApplicationBase
Computer
Log
User
Personalizzazione degli oggetti disponibili in My
Compilazione condizionale
-define (Visual Basic)
Oggetto My.Forms
Oggetto My.Request
Oggetto My.Response
Oggetto My.WebServices
Accesso ai dati nelle applicazioni Visual Basic
05/03/2021 • 3 minutes to read • Edit Online

Visual Basic include numerose nuove funzionalità per semplificare lo sviluppo di applicazioni che accedono ai
dati. I moduli associati ai dati per applicazioni Windows vengono creati trascinando elementi dalla finestra
Origine dati nel modulo. I controlli ai dati si associano trascinando elementi dalla finestra Origini dati nei
controlli esistenti.

Sezioni correlate
Accesso ai dati in Visual Studio
Include collegamenti alle pagine sulla incorporazione della funzionalità di accesso ai dati nelle applicazioni.
Visual Studio data tools per .NET
Include collegamenti alle pagine sulla creazione di applicazioni che usano i dati tramite Visual Studio.
LINQ
Include collegamenti agli argomenti che descrivono come usare LINQ con Visual Basic.
LINQ to SQL
Include informazioni su LINQ to SQL. Include esempi di programmazione.
Strumenti di LINQ to SQL in Visual Studio
Include collegamenti agli argomenti che illustrano come creare un modello di oggetto LINQ to SQL nelle
applicazioni.
Uso dei set di dati nelle applicazioni a più livelli
Include collegamenti agli argomenti che illustrano come creare applicazioni dati a più livelli.
Aggiungere nuove connessioni
Include collegamenti alle pagine che illustrano come connettere le applicazioni ai dati con gli strumenti di
progettazione e gli oggetti di connessione ADO.NET tramite Visual Studio.
Strumenti per set di dati in Visual Studio
Include collegamenti alle pagine che descrivono come caricare dati nei set di dati e come eseguire le istruzioni
SQL e le stored procedure.
Associare controlli ai dati in Visual Studio
Include collegamenti alle pagine che illustrano come visualizzare dati in Windows Form tramite i controlli
associati ai dati.
Modificare i dati nei set di dati
Include collegamenti alle pagine che descrivono come manipolare i dati nelle tabelle dati di un set di dati.
Convalidare i dati nei set di dati
Include collegamenti alle pagine che illustrano come aggiungere una convalida a un set di dati durante le
modifiche di colonne e righe.
Salvare i dati di nuovo nel database
Include collegamenti alle pagine che illustrano come inviare dati aggiornati da un'applicazione al database.
ADO.NET
Descrive le classi ADO.NET, che espongono i servizi di accesso ai dati per il programmatore .NET Framework.
Dati nelle soluzioni Office
Include collegamenti alle pagine che illustrano il funzionamento dei dati nelle soluzioni Office, incluse le
informazioni sulla programmazione orientata agli schemi, sulla memorizzazione di dati nella cache e
sull'accesso ai dati sul lato server.
Creazione e utilizzo di componenti in Visual Basic
05/03/2021 • 5 minutes to read • Edit Online

Un componente è una classe che implementa l'interfaccia System.ComponentModel.IComponent o che deriva


direttamente o indirettamente da una classe che implementa IComponent. Un componente .NET è un oggetto
riutilizzabile, può interagire con altri oggetti e fornisce il controllo sulle risorse esterne e sul supporto della fase
di progettazione.
Una caratteristica importante dei componenti è che possono essere manipolati in fase di progettazione, quindi
se una classe è un componente può essere usata nell'ambiente di sviluppo integrato (IDE) di Visual Studio. Un
componente può essere aggiunto alla casella degli strumenti, trascinato e rilasciato in un form e manipolato in
un'area di progettazione. Il supporto della fase di progettazione di base per i componenti è incorporato in .NET.
Uno sviluppatore di componenti non deve eseguire operazioni aggiuntive per sfruttare la funzionalità di base
della fase di progettazione.
Un controllo è simile a un componente, poiché entrambi possono essere manipolati. A differenza di un
componente, un controllo produce però un'interfaccia utente. Un controllo deve derivare da una delle classi di
controllo di base: Control o Control.

Quando si crea un componente


Se la classe viene usata in un'area di progettazione, ad esempio Windows Form o Progettazione Web Form, ma
non ha un'interfaccia utente, deve essere un componente e implementare IComponent oppure derivare da una
classe che implementa direttamente o indirettamente IComponent.
Le classi Component e MarshalByValueComponent sono implementazioni di base dell'interfaccia IComponent.
La differenza principale tra queste classi è che la classe Component viene sottoposta a marshalling in base al
riferimento, mentre IComponent è sottoposta a marshalling in base al valore. L'elenco seguente contiene
indicazioni generali per gli implementatori.
Se il componente deve essere sottoposto a marshalling in base al riferimento, derivare la classe da
Component.
Se il componente deve essere sottoposto a marshalling in base al valore, derivare la classe da
MarshalByValueComponent.
Se il componente non può derivare da una delle implementazioni di base a causa di un'ereditarietà
singola, implementare IComponent.

Classi di componenti
Lo spazio dei nomi System.ComponentModel offre classi usate per implementare il comportamento dei
componenti e dei controlli in fase di progettazione e di esecuzione. Questo spazio dei nomi include le classi e le
interfacce di base per l'implementazione di attributi e convertitori, l'associazione a origini dati e le licenze per i
componenti.
Le classi di componenti principali sono:
Component. Un'implementazione di base per l'interfaccia IComponent. Questa classe abilita la
condivisione degli oggetti tra applicazioni.
MarshalByValueComponent. Un'implementazione di base per l'interfaccia IComponent.
Container. L'implementazione di base per l'interfaccia IContainer. Questa classe incapsula zero o più
componenti.
Alcune delle classi utilizzate per le licenze dei componenti sono:
License. Classe di base astratta per tutte le licenze. La licenza viene concessa a un'istanza specifica di un
componente.
LicenseManager. Offre proprietà e metodi per aggiungere una licenza a un componente e gestire
LicenseProvider.
LicenseProvider. Classe di base astratta per l'implementazione di un provider di licenza.
LicenseProviderAttribute. Specifica la classe LicenseProvider da usare con una classe.
Classi usate in genere per descrivere e rendere persistenti i componenti.
TypeDescriptor. Offre informazioni sulle caratteristiche di un componente, ad esempio gli attributi, le
proprietà e gli eventi.
EventDescriptor. Include informazioni su un evento.
PropertyDescriptor. Include informazioni su una proprietà.

Sezioni correlate
Risoluzione dei problemi relativi alla modifica di controlli e componenti
Viene illustrato come risolvere i problemi comuni.

Vedi anche
Procedura: Accedere al supporto in fase di progettazione in Windows Forms
Nozioni fondamentali relative alle applicazioni
Windows Forms (Visual Basic)
05/03/2021 • 13 minutes to read • Edit Online

Una parte importante del Visual Basic è la possibilità di creare Windows Form applicazioni eseguite localmente
sui computer degli utenti. È possibile usare Visual Studio per creare l'applicazione e l'interfaccia utente usando
Windows Form. Un Windows Forms Application viene compilato in base alle classi dello
System.Windows.Forms spazio dei nomi.

Progettazione di applicazioni Windows Form


È possibile creare applicazioni di servizio Windows Form e Windows con Visual Studio. Per altre informazioni,
vedere i seguenti argomenti:
Introduzione con Windows Form. Vengono fornite informazioni su come creare e programmare
Windows Form.
Controlli Windows Form. Raccolta di argomenti che illustrano in dettaglio l'uso dei controlli Windows
Form.
Applicazioni di servizio Windows. Vengono elencati gli argomenti che illustrano come creare i servizi
Windows.

Compilazione di interfacce utente complete e interattive


Windows Form è il componente smart client della .NET Framework e di .NET Core (a partire da .NET Core 3,0). Si
tratta di un set di librerie gestite che consentono attività comuni dell'applicazione, ad esempio la lettura e la
scrittura nel file system. Usando un ambiente di sviluppo come Visual Studio, è possibile creare Windows Form
applicazioni che visualizzano informazioni, richiedono l'input dagli utenti e comunicano con computer remoti
tramite una rete.
In Windows Form un form è una superficie visiva sulla quale è possibile visualizzare informazioni per l'utente. In
genere si compilano Windows Form applicazioni posizionando i controlli sui moduli e sviluppando le risposte
alle azioni dell'utente, ad esempio clic del mouse o pressione del tasto. Un controllo è un elemento separato
dell'interfaccia utente usato per visualizzare dati o accettare input di dati.
Eventi
Quando un utente esegue un'operazione nel form o in uno dei relativi controlli, genera un evento. L'applicazione
reagisce a tali eventi usando il codice ed elabora gli eventi quando si verificano. Per altre informazioni, vedere
Creazione di gestori eventi in Windows Forms.
Controlli
Windows Form contiene un'ampia gamma di controlli che è possibile inserire nei form: controlli che
visualizzano caselle di testo, pulsanti, caselle di riepilogo a discesa, pulsanti di opzione e persino pagine Web. Per
un elenco di tutti i controlli utilizzabili in un modulo, vedere Controlli da usare in Windows Forms. Se un
controllo esistente non dovesse soddisfare le proprie esigenze, Windows Form consente anche di creare
controlli personalizzati usando la classe UserControl.
Windows Form dispone di controlli UI completi che simulano le funzionalità delle applicazioni di fascia alta quali
Microsoft Office. Con il ToolStrip MenuStrip controllo e è possibile creare barre degli strumenti e menu
contenenti testo e immagini, visualizzare sottomenu e ospitare altri controlli, ad esempio caselle di testo e
caselle combinate.
Con la finestra di progettazione dei form di Visual Studio con trascinamento della selezione è possibile creare
facilmente Windows Form applicazioni: è sufficiente selezionare i controlli con il cursore e posizionarli nel punto
desiderato del form. Nella finestra di progettazione vengono forniti strumenti quali linee della griglia e "linee di
allineamento" che semplificano l'allineamento dei controlli. Se si usa Visual Studio o si compila dalla riga di
comando, è possibile usare i FlowLayoutPanel TableLayoutPanel controlli, e SplitContainer per creare layout di
form avanzati con tempi e sforzi minimi.
Elementi dell'interfaccia utente personalizzati
Infine, se è necessario creare elementi dell'interfaccia utente personalizzati, lo System.Drawing spazio dei nomi
contiene tutte le classi necessarie per eseguire il rendering di righe, cerchi e altre forme direttamente in un form.
Per informazioni dettagliate sull'uso di queste funzionalità, vedere gli argomenti della guida seguenti.

A VEDERE

Creare una nuova Windows Forms Application con Visual Esercitazione 1: creare un visualizzatore di immagini
Studio

Usare i controlli nei moduli Procedura: aggiungere controlli a un Windows Form

Crea grafica con System.Drawing Guida introduttiva alla programmazione grafica

Creare controlli personalizzati Procedura: Ereditare dalla classe UserControl

Visualizzazione e modifica dei dati


Molte applicazioni devono visualizzare i dati da un database, da un file XML, servizi Web XML o altre origini di
dati. Windows Form fornisce un controllo flessibile denominato DataGridView controllo per il rendering di tali
dati tabulari in un formato di riga e di colonna tradizionale, in modo che ogni porzione di dati occupi una
propria cella. Utilizzando DataGridView è possibile personalizzare l'aspetto delle singole celle, bloccare righe e
colonne arbitrarie e visualizzare controlli complessi all'interno delle celle, tra le altre funzionalità.
Il collegamento alle origini dati tramite una rete è un'attività semplice con gli smart client Windows Form. Il
BindingSource componente, nuovo con Windows Form in Visual Studio 2005 e .NET Framework 2,0,
rappresenta una connessione a un'origine dati ed espone metodi per l'associazione di dati ai controlli, lo
spostamento ai record precedenti e successivi, la modifica di record e il salvataggio delle modifiche nell'origine
originale. Il controllo BindingNavigator fornisce un'interfaccia semplice tramite il componente BindingSource
per gli utenti per spostarsi tra i record.
Controlli di Data-Bound
È possibile creare facilmente controlli con associazione a dati utilizzando la finestra Origini dati, in cui vengono
visualizzate origini dati quali database, servizi Web e oggetti nel progetto. È possibile creare controlli associati a
dati mediante il trascinamento di elementi da questa finestra nei form del progetto. È anche possibile connettere
i controlli esistenti ai dati mediante il trascinamento di oggetti dalla finestra Origini dati nei controlli esistenti.
Impostazioni
Un altro tipo di data binding che è possibile gestire in Windows Form sono le impostazioni. La maggior parte
delle applicazioni smart client deve conservare alcune informazioni sullo stato della fase di esecuzione, ad
esempio le ultime dimensioni note dei form, e conservare i dati relativi alle preferenze dell'utente, ad esempio i
percorsi predefiniti per i file salvati. La funzionalità Impostazioni applicazione soddisfa questi requisiti, offrendo
un modo semplice per archiviare entrambi i tipi di impostazioni nel computer client. Una volta definito
utilizzando Visual Studio o un editor di codice, queste impostazioni vengono rese permanente come XML e
rilette automaticamente in memoria in fase di esecuzione.
Per informazioni dettagliate sull'uso di queste funzionalità, vedere gli argomenti della guida seguenti.

A VEDERE

Usa il BindingSource componente Procedura: Associare i controlli di Windows Forms al


componente BindingSource usando la finestra di
progettazione

Usare le origini dati di ADO.NET Procedura: Ordinare e filtrare i dati ADO.NET con il
componente BindingSource di Windows Forms

Utilizzare la finestra Origini dati Procedura dettagliata: visualizzazione di dati in un Windows


Form

Distribuzione delle applicazioni ai client


Una volta scritta, l'applicazione deve essere inviata agli utenti in modo che possano installarla ed eseguirla sui
propri computer client. Utilizzando la tecnologia ClickOnce, è possibile distribuire le applicazioni dall'interno di
Visual Studio utilizzando solo pochi clic e fornire agli utenti un URL che punta all'applicazione sul Web.
ClickOnce gestisce tutti gli elementi e le dipendenze dell'applicazione e garantisce che l'applicazione sia
installata correttamente nel computer client.
Le applicazioni ClickOnce possono essere configurate per essere eseguite solo quando l'utente è connesso alla
rete oppure per l'esecuzione sia online che offline. Quando si specifica che un'applicazione deve supportare
l'operazione offline, ClickOnce aggiunge un collegamento all'applicazione nel menu Star t dell'utente, in modo
che l'utente possa aprirlo senza usare l'URL.
Quando si aggiorna l'applicazione, vengono pubblicati un nuovo manifesto della distribuzione e una nuova
copia dell'applicazione sul server Web. ClickOnce rileva che è disponibile un aggiornamento e aggiorna
l'installazione dell'utente; non è necessaria alcuna programmazione personalizzata per aggiornare gli assembly
precedenti.
Per un'introduzione completa a ClickOnce, vedere sicurezza e distribuzione di ClickOnce. Per informazioni
dettagliate sull'uso di queste funzionalità, vedere gli argomenti della guida seguenti:

A VEDERE

Distribuire un'applicazione con ClickOnce Procedura: Pubblicare un'applicazione ClickOnce mediante la


Pubblicazione guidata

Procedura dettagliata: distribuzione manuale di


un'applicazione ClickOnce

Aggiornare una distribuzione ClickOnce Procedura: gestire gli aggiornamenti per un'applicazione
ClickOnce

Gestione della sicurezza con ClickOnce Procedura: abilitare le impostazioni di sicurezza ClickOnce

Altri controlli e funzionalità


In Windows Form sono disponibili molte altre funzionalità che semplificano e velocizzano l'implementazione
delle attività comuni, ad esempio il supporto per la creazione di finestre di dialogo, la stampa, l'aggiunta di
documentazione e la localizzazione dell'applicazione in più linguaggi. Inoltre, Windows Form si basa sul solido
sistema di sicurezza di .NET, consentendo di rilasciare applicazioni più sicure ai clienti.
Per informazioni dettagliate sull'uso di queste funzionalità, vedere gli argomenti della guida seguenti:

A VEDERE

Stampa il contenuto di un form Procedura: Stampare grafica in Windows Form

Procedura: Stampare un file di testo con più pagine in


Windows Form

Altre informazioni sulla sicurezza di Windows Form Cenni preliminari sulla sicurezza in Windows Form

Vedi anche
WindowsFormsApplicationBase
Panoramica sui Windows Form
Oggetto My.Forms
Personalizzazione di progetti ed estensione di
oggetti My in Visual Basic
05/03/2021 • 2 minutes to read • Edit Online

È possibile personalizzare i modelli di progetto per fornire My oggetti aggiuntivi. Questo consente agli altri
sviluppatori di trovare e usare gli oggetti in modo semplice.

Contenuto della sezione


Estensione dello spazio dei nomi My in Visual Basic
Viene descritto come aggiungere membri e valori personalizzati allo My spazio dei nomi in Visual Basic.
Assemblaggio e distribuzione delle estensioni My personalizzate
Viene descritto come pubblicare My estensioni dello spazio dei nomi personalizzate utilizzando i modelli di
Visual Studio.
Estensione del modello di applicazione Visual Basic
Viene descritto come specificare estensioni personalizzate per il modello di applicazione eseguendo
l'override dei membri della WindowsFormsApplicationBase classe.
Personalizzazione degli oggetti disponibili in My
Viene descritto come controllare quali My oggetti sono abilitati impostando la _ costante di compilazione
condizionale MyType del progetto.

Sezioni correlate
Sviluppo con My
Vengono descritti My gli oggetti disponibili in diversi tipi di progetto per impostazione predefinita.
Cenni preliminari sul modello di applicazione Visual Basic
Viene descritto il modello di Visual Basic per controllare il comportamento delle applicazioni Windows Form.
Dipendenza di My dal tipo di progetto
Vengono descritti My gli oggetti disponibili in diversi tipi di progetto per impostazione predefinita.
Compilazione condizionale
Viene illustrato il modo in cui il compilatore utilizza la compilazione condizionale per selezionare sezioni
specifiche di codice per compilare ed escludere altre sezioni.
ApplicationBase
Descrive l' My oggetto che fornisce proprietà, metodi ed eventi correlati all'applicazione corrente.

Vedi anche
Sviluppo di applicazioni con Visual Basic
Estensione dello My spazio dei nomi in Visual Basic
05/03/2021 • 16 minutes to read • Edit Online

Lo My spazio dei nomi in Visual Basic espone proprietà e metodi che consentono di sfruttare facilmente la
potenza del .NET Framework. Lo My spazio dei nomi semplifica i problemi di programmazione comuni,
riducendo spesso un'attività complessa a una singola riga di codice. Lo My spazio dei nomi è inoltre
completamente estendibile, in modo che sia possibile personalizzare il comportamento di My e aggiungere
nuovi servizi alla gerarchia per adattarsi alle specifiche esigenze dell'applicazione. In questo argomento viene
illustrato come personalizzare i membri esistenti dello My spazio dei nomi e come aggiungere classi
personalizzate allo My spazio dei nomi.

Personalizzazione di My membri dello spazio dei nomi esistenti


Lo My spazio dei nomi in Visual Basic espone le informazioni usate di frequente sull'applicazione, sul computer
e altro ancora. Per un elenco completo degli oggetti nello My spazio dei nomi, vedere My Reference. Potrebbe
essere necessario personalizzare i membri esistenti dello My spazio dei nomi in modo che corrispondano
meglio alle esigenze dell'applicazione. Qualsiasi proprietà di un oggetto nello My spazio dei nomi che non è di
sola lettura può essere impostata su un valore personalizzato.
Si supponga, ad esempio, di utilizzare spesso l' My.User oggetto per accedere al contesto di sicurezza corrente
per l'utente che esegue l'applicazione. Tuttavia, l'azienda usa un oggetto utente personalizzato per esporre
informazioni e funzionalità aggiuntive per gli utenti all'interno dell'azienda. In questo scenario, è possibile
sostituire il valore predefinito della My.User.CurrentPrincipal proprietà con un'istanza dell'oggetto Principal
personalizzato, come illustrato nell'esempio seguente:

My.User.CurrentPrincipal = CustomPrincipal

L'impostazione della CurrentPrincipal proprietà nell' My.User oggetto modifica l'identità con cui viene
eseguita l'applicazione. L' My.User oggetto, a sua volta, restituisce le informazioni relative all'utente appena
specificato.

Aggiunta di membri a My oggetti


I tipi restituiti da My.Application e My.Computer sono definiti come Partial classi. Pertanto, è possibile
estendere gli My.Application My.Computer oggetti e creando una Partial classe denominata MyApplication o
MyComputer . La classe non può essere una Private classe. Se si specifica la classe come parte dello My spazio
dei nomi, è possibile aggiungere proprietà e metodi che verranno inclusi con gli My.Application My.Computer
oggetti o.
Nell'esempio seguente viene aggiunta una proprietà denominata DnsServerIPAddresses all' My.Computer
oggetto:
Imports System.Net.NetworkInformation

Namespace My

Partial Class MyComputer


Friend ReadOnly Property DnsServerIPAddresses() As IPAddressCollection
Get
Dim dnsAddressList As IPAddressCollection = Nothing

For Each adapter In System.Net.NetworkInformation.


NetworkInterface.GetAllNetworkInterfaces()

Dim adapterProperties = adapter.GetIPProperties()


Dim dnsServers As IPAddressCollection = adapterProperties.DnsAddresses
If dnsAddressList Is Nothing Then
dnsAddressList = dnsServers
Else
dnsAddressList.Union(dnsServers)
End If
Next adapter

Return dnsAddressList
End Get
End Property
End Class

End Namespace

Aggiunta di oggetti personalizzati allo My spazio dei nomi


Sebbene lo My spazio dei nomi fornisca soluzioni per molte attività di programmazione comuni, è possibile che
si verifichino attività My non indirizzate dallo spazio dei nomi. Ad esempio, l'applicazione potrebbe accedere ai
servizi directory personalizzati per i dati utente o l'applicazione potrebbe usare assembly che non sono installati
per impostazione predefinita con Visual Basic. È possibile estendere lo My spazio dei nomi per includere
soluzioni personalizzate a attività comuni specifiche per l'ambiente in uso. Lo My spazio dei nomi può essere
facilmente esteso per aggiungere nuovi membri per soddisfare le esigenze di applicazioni in continua crescita.
Inoltre, è possibile distribuire le My estensioni dello spazio dei nomi ad altri sviluppatori come modello di Visual
Basic.
Aggiunta di membri allo My spazio dei nomi
Poiché My è uno spazio dei nomi come qualsiasi altro spazio dei nomi, è possibile aggiungervi proprietà di
primo livello aggiungendo semplicemente un modulo e specificando un Namespace di My . Aggiungere
annotazioni al modulo con l' HideModuleName attributo, come illustrato nell'esempio seguente. L'
HideModuleName attributo garantisce che in IntelliSense non venga visualizzato il nome del modulo quando
vengono visualizzati i membri dello My spazio dei nomi.

Namespace My
<HideModuleName()>
Module MyCustomModule

End Module
End Namespace

Per aggiungere membri allo My spazio dei nomi, aggiungere le proprietà necessarie al modulo. Per ogni
proprietà aggiunta allo My spazio dei nomi, aggiungere un campo privato di tipo
ThreadSafeObjectProvider(Of T) , in cui il tipo è il tipo restituito dalla proprietà personalizzata. Questo campo
viene utilizzato per creare istanze di oggetti thread-safe che devono essere restituite dalla proprietà chiamando
il GetInstance metodo. Di conseguenza, ogni thread che accede alla proprietà estesa riceve la propria istanza
del tipo restituito. Nell'esempio seguente viene aggiunta una proprietà denominata SampleExtension di tipo
SampleExtension allo My spazio dei nomi:

Namespace My
<HideModuleName()>
Module MyCustomExtensions
Private _extension As New ThreadSafeObjectProvider(Of SampleExtension)
Friend ReadOnly Property SampleExtension() As SampleExtension
Get
Return _extension.GetInstance()
End Get
End Property
End Module
End Namespace

Aggiunta di eventi a My oggetti personalizzati


È possibile utilizzare l' My.Application oggetto per esporre gli eventi per My gli oggetti personalizzati
estendendo la MyApplication classe parziale nello My spazio dei nomi. Per i progetti basati su Windows, è
possibile fare doppio clic sul nodo progetto in per il progetto in Esplora soluzioni . Nella finestra di
progettazione del progetto Visual Basic fare clic sulla scheda applicazione , quindi fare clic sul pulsante
Visualizza eventi applicazione . Verrà creato un nuovo file denominato ApplicationEvents. vb . Contiene il
codice seguente per estendere la MyApplication classe:

Namespace My
Partial Friend Class MyApplication
End Class
End Namespace

È possibile aggiungere gestori eventi per My gli oggetti personalizzati aggiungendo gestori eventi
personalizzati alla MyApplication classe. Gli eventi personalizzati consentono di aggiungere codice che verrà
eseguito quando un gestore eventi viene aggiunto, rimosso o viene generato l'evento. Si noti che il AddHandler
codice per un evento personalizzato viene eseguito solo se il codice viene aggiunto da un utente per gestire
l'evento. Si consideri, ad esempio, che l' SampleExtension oggetto della sezione precedente presenta un Load
evento per il quale si desidera aggiungere un gestore eventi personalizzato. Nell'esempio di codice seguente
viene illustrato un gestore eventi personalizzato denominato SampleExtensionLoad che verrà richiamato quando
My.SampleExtension.Load si verifica l'evento. Quando si aggiunge codice per gestire il nuovo
My.SampleExtensionLoad evento, AddHandler viene eseguita la parte del codice evento personalizzato. Il
MyApplication_SampleExtensionLoad metodo è incluso nell'esempio di codice per mostrare un esempio di un
gestore eventi che gestisce l' My.SampleExtensionLoad evento. Si noti che l' SampleExtensionLoad evento sarà
disponibile quando si seleziona l'opzione eventi applicazione personali nell'elenco a discesa a sinistra sopra
l'editor di codice quando si modifica il file ApplicationEvents. vb .
Namespace My

Partial Friend Class MyApplication

' Custom event handler for Load event.


Private _sampleExtensionHandlers As EventHandler

Public Custom Event SampleExtensionLoad As EventHandler


AddHandler(ByVal value As EventHandler)
' Warning: This code is not thread-safe. Do not call
' this code from multiple concurrent threads.
If _sampleExtensionHandlers Is Nothing Then
AddHandler My.SampleExtension.Load, AddressOf OnSampleExtensionLoad
End If
_sampleExtensionHandlers =
System.Delegate.Combine(_sampleExtensionHandlers, value)
End AddHandler
RemoveHandler(ByVal value As EventHandler)
_sampleExtensionHandlers =
System.Delegate.Remove(_sampleExtensionHandlers, value)
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)
If _sampleExtensionHandlers IsNot Nothing Then
_sampleExtensionHandlers.Invoke(sender, e)
End If
End RaiseEvent
End Event

' Method called by custom event handler to raise user-defined


' event handlers.
<Global.System.ComponentModel.EditorBrowsable(
Global.System.ComponentModel.EditorBrowsableState.Advanced)>
Protected Overridable Sub OnSampleExtensionLoad(
ByVal sender As Object, ByVal e As EventArgs)
RaiseEvent SampleExtensionLoad(sender, e)
End Sub

' Event handler to call My.SampleExtensionLoad event.


Private Sub MyApplication_SampleExtensionLoad(
ByVal sender As Object, ByVal e As System.EventArgs
) Handles Me.SampleExtensionLoad

End Sub
End Class
End Namespace

Linee guida di progettazione


Quando si sviluppano estensioni allo My spazio dei nomi, usare le linee guida seguenti per ridurre al minimo i
costi di manutenzione dei componenti di estensione:
Includere solo la logica di estensione. La logica inclusa nell' My estensione dello spazio dei nomi deve
includere solo il codice necessario per esporre la funzionalità necessaria nello My spazio dei nomi. Poiché
l'estensione risiederà nei progetti utente come codice sorgente, l'aggiornamento del componente di
estensione comporta un costo di manutenzione elevato e deve essere evitato, se possibile.
Ridurre al minimo i presupposti del progetto. Quando si creano le estensioni dello My spazio dei
nomi, non presupporre un set di riferimenti, importazioni a livello di progetto o impostazioni del compilatore
specifiche (ad esempio, Option Strict off). Al contrario, ridurre al minimo le dipendenze e qualificare
completamente tutti i riferimenti ai tipi usando la Global parola chiave. Inoltre, verificare che l'estensione
venga compilata con Option Strict on per ridurre al minimo gli errori nell'estensione.
Isolare il codice di estensione. Inserendo il codice in un singolo file, l'estensione viene facilmente
distribuibile come modello di elemento di Visual Studio. Per ulteriori informazioni, vedere "creazione di
pacchetti e distribuzione di estensioni" più avanti in questo argomento. L'inserimento di tutto il My codice di
estensione dello spazio dei nomi in un singolo file o in una cartella separata in un progetto consente inoltre
agli utenti di individuare l' My estensione dello spazio dei nomi.

Progettazione di librerie di classi per My


Come nel caso della maggior parte dei modelli a oggetti, alcuni modelli di progettazione funzionano
correttamente nello My spazio dei nomi e altri no. Quando si progetta un'estensione dello My spazio dei nomi,
prendere in considerazione i principi seguenti:
Metodi senza stato. I metodi nello My spazio dei nomi devono fornire una soluzione completa a un'attività
specifica. Verificare che i valori dei parametri passati al metodo forniscano tutti gli input necessari per
completare l'attività specifica. Evitare di creare metodi basati sullo stato precedente, ad esempio connessioni
aperte alle risorse.
Istanze globali. L'unico stato mantenuto nello My spazio dei nomi è globale per il progetto. Ad esempio,
My.Application.Info incapsula lo stato condiviso nell'intera applicazione.
Tipi di parametri semplici. È sufficiente evitare i tipi di parametro complessi. Creare invece metodi che
non accettano input di parametro o che accettano tipi di input semplici, ad esempio stringhe, tipi primitivi e
così via.
Metodi Factor y. Alcuni tipi sono necessariamente difficili da creare un'istanza. Fornire metodi factory come
estensioni allo My spazio dei nomi consente di individuare e utilizzare più facilmente i tipi che rientrano in
questa categoria. Un esempio di un metodo factory che funziona bene è
My.Computer.FileSystem.OpenTextFileReader . Sono disponibili diversi tipi di flusso nel .NET Framework.
Specificando i file di testo in modo specifico, OpenTextFileReader consente all'utente di comprendere il flusso
da usare.
Queste linee guida non escludono i principi di progettazione generali per le librerie di classi. Sono invece
raccomandazioni ottimizzate per gli sviluppatori che usano Visual Basic e lo My spazio dei nomi. Per i principi di
progettazione generali per la creazione di librerie di classi, vedere linee guida di progettazione di Framework.

Creazione di pacchetti e distribuzione di estensioni


È possibile includere My le estensioni dello spazio dei nomi in un modello di progetto di Visual Studio oppure è
possibile creare un pacchetto delle estensioni e distribuirle come modello di elemento di Visual Studio. Quando
si impacchettano le My estensioni dello spazio dei nomi come modello di elemento di Visual Studio, è possibile
sfruttare le funzionalità aggiuntive fornite da Visual Basic. Queste funzionalità consentono di includere
un'estensione quando un progetto fa riferimento a un assembly specifico oppure consentire agli utenti di
aggiungere in modo esplicito l' My estensione dello spazio dei nomi tramite la pagina estensioni My della
finestra di progettazione del Visual Basic.
Per informazioni dettagliate su come distribuire My le estensioni dello spazio dei nomi, vedere Creazione del
pacchetto e distribuzione delle estensioni My personalizzate.

Vedi anche
Assemblaggio e distribuzione delle estensioni My personalizzate
Estensione del modello di applicazione Visual Basic
Personalizzazione degli oggetti disponibili in My
Pagina Estensioni My, Creazione progetti
Application Page, Project Designer (Visual Basic)
Parziale
Pacchetto e distribuzione delle estensioni My
personalizzate (Visual Basic)
05/03/2021 • 9 minutes to read • Edit Online

Visual Basic fornisce un modo semplice per distribuire le My estensioni dello spazio dei nomi personalizzate
utilizzando i modelli di Visual Studio. Se si sta creando un modello di progetto per il quale le My estensioni
sono parte integrante del nuovo tipo di progetto, è possibile includere il My codice di estensione personalizzato
con il progetto quando si esporta il modello. Per altre informazioni sull'esportazione di modelli di progetto,
vedere procedura: creare modelli di progetto.
Se l' My estensione personalizzata si trova in un unico file di codice, è possibile esportare il file come modello di
elemento che gli utenti possono aggiungere a qualsiasi tipo di Visual Basic progetto. È quindi possibile
personalizzare il modello di elemento per abilitare funzionalità e comportamenti aggiuntivi per l' My estensione
personalizzata in un progetto Visual Basic. Di seguito sono riportate alcune funzionalità:
Consentire agli utenti di gestire l' My estensione personalizzata dalla pagina estensioni My di
progettazione progetti Visual Basic.
Aggiunta automatica dell' My estensione personalizzata quando un riferimento a un assembly
specificato viene aggiunto a un progetto.
Nascondere il My modello di elemento di estensione nella finestra di dialogo Aggiungi elemento in
modo che non sia incluso nell'elenco di elementi del progetto.
In questo argomento viene illustrato come creare un pacchetto di un' My estensione personalizzata come
modello di elemento nascosto che può essere gestito dalla pagina estensioni My della finestra di
progettazione del progetto Visual Basic. L' My estensione personalizzata può inoltre essere aggiunta
automaticamente quando un riferimento a un assembly specificato viene aggiunto a un progetto.

Creare un'estensione per lo spazio dei nomi My


Il primo passaggio nella creazione di un pacchetto di distribuzione per un' My estensione personalizzata
consiste nel creare l'estensione come singolo file di codice. Per informazioni dettagliate e istruzioni su come
creare un' My estensione personalizzata, vedere estensione dello spazio dei nomi My in Visual Basic.

Esportare un'estensione dello spazio dei nomi My come modello di


elemento
Quando si dispone di un file di codice che include l' My estensione dello spazio dei nomi, è possibile esportare il
file di codice come modello di elemento di Visual Studio. Per istruzioni su come esportare un file come modello
di elemento di Visual Studio, vedere procedura: creare modelli di elementi.

NOTE
Se l' My estensione dello spazio dei nomi ha una dipendenza da un assembly specifico, è possibile personalizzare il
modello di elemento per installare automaticamente l' My estensione dello spazio dei nomi quando viene aggiunto un
riferimento a tale assembly. Sarà quindi necessario escludere il riferimento all'assembly quando si esporta il file di codice
come modello di elemento di Visual Studio.
Personalizzare il modello di elemento
È possibile abilitare il modello di elemento per la gestione dalla pagina estensioni My della finestra di
progettazione del progetto Visual Basic. È anche possibile abilitare l'aggiunta automatica del modello di
elemento quando un riferimento a un assembly specificato viene aggiunto a un progetto. Per abilitare queste
personalizzazioni, si aggiungerà un nuovo file, denominato file CustomData, al modello e quindi si aggiungerà
un nuovo elemento al file XML nel file con estensione vstemplate.
Aggiungere il file CustomData
Il file CustomData è un file di testo con estensione del nome di file. CustomData (il nome del file può essere
impostato su qualsiasi valore significativo per il modello) e che contiene XML. Il codice XML nel file CustomData
indica Visual Basic di includere l' My estensione quando gli utenti usano la pagina estensioni My della finestra
di progettazione del progetto Visual Basic. Facoltativamente, è possibile aggiungere l' AssemblyFullName>
attributo <al file XML del file CustomData. In questo modo si indica Visual Basic di installare automaticamente l'
My estensione personalizzata quando un riferimento a un assembly specifico viene aggiunto al progetto. È
possibile usare qualsiasi editor di testo o editor XML per creare il file CustomData e quindi aggiungerlo alla
cartella compressa del modello di elemento (file zip).
Il codice XML seguente, ad esempio, Mostra il contenuto di un file CustomData che aggiungerà l'elemento del
modello alla cartella My Extensions di un progetto Visual Basic quando un riferimento all'assembly
Microsoft.VisualBasic.PowerPacks.Vs.dll viene aggiunto al progetto.

<VBMyExtensionTemplate
ID="Microsoft.VisualBasic.Samples.MyExtensions.MyPrinterInfo"
Version="1.0.0.0"
AssemblyFullName="Microsoft.VisualBasic.PowerPacks.vs"
/>

Il file CustomData contiene un elemento <con VBMyExtensionTemplate> attributi elencati nella tabella seguente.

AT T RIB UTO DESC RIZ IO N E

ID Obbligatorio. Identificatore univoco per l'estensione. Se


l'estensione con questo ID è già stata aggiunta al progetto,
all'utente non verrà richiesto di aggiungerla di nuovo.

Version Obbligatorio. Numero di versione per il modello di elemento.

AssemblyFullName facoltativo. Nome dell'assembly. Quando un riferimento a


questo assembly viene aggiunto al progetto, all'utente viene
richiesto di aggiungere l' My estensione da questo modello
di elemento.

Aggiungere l' <CustomDataSignature> elemento al file con estensione vstemplate


Per identificare il modello di elemento di Visual Studio come My estensione dello spazio dei nomi, è necessario
modificare anche il file vstemplate per il modello di elemento. È necessario aggiungere un
<CustomDataSignature> elemento all' <TemplateData> elemento. L' <CustomDataSignature> elemento deve
contenere il testo Microsoft.VisualBasic.MyExtension , come illustrato nell'esempio seguente.

<CustomDataSignature>Microsoft.VisualBasic.MyExtension</CustomDataSignature>

Non è possibile modificare direttamente i file in una cartella compressa (file con estensione zip). È necessario
copiare il file con estensione vstemplate dalla cartella compressa, modificarlo e quindi sostituire il file con
estensione vstemplate nella cartella compressa con la copia aggiornata.
Nell'esempio seguente viene illustrato il contenuto di un file con estensione vstemplate per il quale è stato
<CustomDataSignature> aggiunto l'elemento.

<VSTemplate Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Item">


<TemplateData>
<DefaultName>MyCustomExtensionModule.vb</DefaultName>
<Name>MyPrinterInfo</Name>
<Description>Custom My Extensions Item Template</Description>
<ProjectType>VisualBasic</ProjectType>
<SortOrder>10</SortOrder>
<Icon>__TemplateIcon.ico</Icon>
<CustomDataSignature >Microsoft.VisualBasic.MyExtension</CustomDataSignature>
</TemplateData>
<TemplateContent>
<References />
<ProjectItem SubType="Code"
TargetFileName="$fileinputname$.vb"
ReplaceParameters="true"
>MyCustomExtensionModule.vb</ProjectItem>
</TemplateContent>
</VSTemplate>

Installare il modello
Per installare il modello, è possibile copiare la cartella compressa (file zip ) nella cartella dei modelli di elemento
Visual Basic. Per impostazione predefinita, i modelli di elemento utente si trovano in
%USERPROFILE%\Documents\Visual Studio <Version> \Templates\ItemTemplates\Visual Basic. In alternativa, è
possibile pubblicare il modello come file di Programma di installazione di Visual Studio (VSI).

Vedi anche
Estensione dello spazio dei nomi My in Visual Basic
Estensione del modello di applicazione Visual Basic
Personalizzazione degli oggetti disponibili in My
Pagina Estensioni My, Creazione progetti
Estensione del modello di applicazione Visual Basic
05/03/2021 • 9 minutes to read • Edit Online

È possibile aggiungere funzionalità al modello di applicazione eseguendo l'override dei Overridable membri
della WindowsFormsApplicationBase classe. Questa tecnica consente di personalizzare il comportamento del
modello applicativo e di aggiungere chiamate a metodi personalizzati quando l'applicazione viene avviata e
arrestata.

Panoramica visiva del modello applicativo


In questa sezione viene illustrata visivamente la sequenza di chiamate di funzione nel modello di applicazione
Visual Basic. Nella sezione successiva viene descritto in dettaglio lo scopo di ogni funzione.
Il grafico seguente mostra la sequenza di chiamate del modello applicativo in una normale Visual Basic
Windows Forms Application. La sequenza viene avviata quando la Sub Main routine chiama il Run metodo.

Il modello di applicazione Visual Basic fornisce anche StartupNextInstance gli UnhandledException eventi e.
Nella grafica seguente viene illustrato il meccanismo per la generazione di questi eventi.

Override dei metodi di base


Il Run metodo definisce l'ordine in cui Application vengono eseguiti i metodi. Per impostazione predefinita, la
Sub Main procedura per un Windows Forms Application chiama il Run metodo.

Se l'applicazione è un'applicazione normale (applicazione a più istanze) o la prima istanza di un'applicazione a


istanza singola, il Run metodo esegue i Overridable metodi nell'ordine seguente:
1. OnInitialize. Per impostazione predefinita, questo metodo imposta gli stili visivi, gli stili di visualizzazione
del testo e l'entità corrente per il thread principale dell'applicazione (se l'applicazione usa l'autenticazione
di Windows) e chiama ShowSplashScreen se né /nosplash né -nosplash viene usato come argomento
della riga di comando.
La sequenza di avvio dell'applicazione viene annullata se questa funzione restituisce False . Questa
operazione può essere utile se si verificano circostanze in cui l'applicazione non deve essere eseguita.
Il OnInitialize metodo chiama i metodi seguenti:
a. ShowSplashScreen. Determina se l'applicazione dispone di una schermata iniziale definita e, in tal
caso, Visualizza la schermata iniziale in un thread separato.
Il ShowSplashScreen metodo contiene il codice che visualizza la schermata iniziale per almeno il
numero di millisecondi specificato dalla MinimumSplashScreenDisplayTime Proprietà. Per usare
questa funzionalità, è necessario aggiungere la schermata iniziale all'applicazione usando
Progettazione progetti (che imposta la My.Application.MinimumSplashScreenDisplayTime
proprietà su due secondi) oppure impostare la My.Application.MinimumSplashScreenDisplayTime
Proprietà in un metodo che esegue l'override del OnInitialize metodo o OnCreateSplashScreen .
Per altre informazioni, vedere MinimumSplashScreenDisplayTime.
b. OnCreateSplashScreen. Consente a una finestra di progettazione di creare codice che inizializza la
schermata iniziale.
Per impostazione predefinita, questo metodo non effettua alcuna operazione. Se si seleziona una
schermata iniziale per l'applicazione in Progettazione progetti Visual Basic, la finestra di
progettazione esegue l'override del OnCreateSplashScreen metodo con un metodo che imposta la
SplashScreen proprietà su una nuova istanza del form della schermata iniziale.
2. OnStartup. Fornisce un punto di estendibilità per la generazione dell' Startup evento. La sequenza di
avvio dell'applicazione si interrompe se questa funzione restituisce False .
Per impostazione predefinita, questo metodo genera l' Startup evento. Se il gestore dell'evento imposta la
Cancel proprietà dell'argomento dell'evento su True , il metodo restituisce False per annullare l'avvio
dell'applicazione.
3. OnRun. Fornisce il punto iniziale utilizzato dall'applicazione principale quando è pronta ad avviare
l'esecuzione, al termine dell'inizializzazione.
Per impostazione predefinita, prima di immettere il Windows Form ciclo di messaggi, questo metodo
chiama OnCreateMainForm (per creare il form principale dell'applicazione) e HideSplashScreen (per
chiudere la schermata iniziale) i metodi:
a. OnCreateMainForm. Consente a una finestra di progettazione di creare codice che inizializza il
form principale.
Per impostazione predefinita, questo metodo non effettua alcuna operazione. Tuttavia, quando si
seleziona un form principale per l'applicazione in Progettazione progetti Visual Basic, la finestra
di progettazione esegue l'override del OnCreateMainForm metodo con un metodo che imposta la
MainForm proprietà su una nuova istanza del form principale.
b. HideSplashScreen. Se l'applicazione ha una schermata iniziale definita ed è aperta, questo metodo
chiude la schermata iniziale.
Per impostazione predefinita, questo metodo chiude la schermata iniziale.
4. OnStartupNextInstance. Consente di personalizzare il comportamento di un'applicazione a istanza
singola quando viene avviata un'altra istanza dell'applicazione.
Per impostazione predefinita, questo metodo genera l' StartupNextInstance evento.
5. OnShutdown. Fornisce un punto di estendibilità per la generazione dell' Shutdown evento. Questo
metodo non viene eseguito se si verifica un'eccezione non gestita nell'applicazione principale.
Per impostazione predefinita, questo metodo genera l' Shutdown evento.
6. OnUnhandledException. Eseguito se si verifica un'eccezione non gestita in uno dei metodi elencati in
precedenza.
Per impostazione predefinita, questo metodo genera l' UnhandledException evento purché un debugger
non sia collegato e l'applicazione stia gestendo l' UnhandledException evento.

Se l'applicazione è un'applicazione a istanza singola e l'applicazione è già in esecuzione, l'istanza successiva


dell'applicazione chiama il OnStartupNextInstance metodo sull'istanza originale dell'applicazione e quindi viene
chiusa.
Il OnStartupNextInstance(StartupNextInstanceEventArgs) costruttore chiama la UseCompatibleTextRendering
proprietà per determinare quale motore di rendering del testo utilizzare per i moduli dell'applicazione. Per
impostazione predefinita, la UseCompatibleTextRendering proprietà restituisce False , che indica che viene
utilizzato il motore di rendering del testo GDI, che è l'impostazione predefinita in Visual Basic 2005 e versioni
successive. È possibile eseguire l'override della UseCompatibleTextRendering proprietà per restituire True , che
indica che viene utilizzato il motore di rendering del testo GDI+, che è l'impostazione predefinita in Visual Basic
.NET 2002 e Visual Basic .NET 2003.

Configurazione dell'applicazione
Come parte del modello di applicazione Visual Basic, la WindowsFormsApplicationBase classe fornisce proprietà
protette per la configurazione dell'applicazione. Queste proprietà devono essere impostate nel costruttore della
classe di implementazione.
In un progetto Windows Form predefinito, Progettazione progetti crea codice per impostare le proprietà con
le impostazioni della finestra di progettazione. Le proprietà vengono usate solo quando l'applicazione viene
avviata; l'impostazione dopo l'avvio dell'applicazione non ha alcun effetto.

IM P O STA Z IO N E N EL RIQ UA DRO


A P P L IC A Z IO N E DI P RO GET TA Z IO N E
P RO P RIETÀ DET ERM IN A P RO GET T I

IsSingleInstance Indica se l'applicazione viene eseguita Casella di controllo Crea


come applicazione a istanza singola o a applicazione a istanza singola
più istanze.

EnableVisualStyles Se l'applicazione utilizzerà gli stili visivi Casella di controllo Abilita stili di
che corrispondono a Windows XP. visualizzazione XP

SaveMySettingsOnExit Se l'applicazione salva Casella di controllo Salva My.


automaticamente le impostazioni Settings on Shutdown
utente dell'applicazione quando
l'applicazione viene chiusa.
IM P O STA Z IO N E N EL RIQ UA DRO
A P P L IC A Z IO N E DI P RO GET TA Z IO N E
P RO P RIETÀ DET ERM IN A P RO GET T I

ShutdownStyle Cosa comporta l'interruzione Elenco modalità di arresto


dell'applicazione, ad esempio quando il
modulo di avvio si chiude o quando
l'ultimo form viene chiuso.

Vedi anche
ApplicationBase
Startup
StartupNextInstance
UnhandledException
Shutdown
NetworkAvailabilityChanged
Cenni preliminari sul modello di applicazione Visual Basic
Application Page, Project Designer (Visual Basic)
Personalizzazione degli oggetti disponibili in My
(Visual Basic)
05/03/2021 • 5 minutes to read • Edit Online

Questo argomento descrive come è possibile controllare quali My oggetti sono abilitati impostando la _MYTYPE
costante di compilazione condizionale del progetto. L'ambiente di sviluppo integrato (IDE) di Visual Studio
mantiene la _MYTYPE costante di compilazione condizionale per un progetto sincronizzato con il tipo del
progetto.

_Valori MyType predefiniti


/define Per impostare la _MYTYPE costante di compilazione condizionale, è necessario usare l'opzione del
compilatore. Quando si specifica un valore personalizzato per la _MYTYPE costante, è necessario racchiudere il
valore di stringa nelle sequenze barra rovesciata/virgolette ( \ "). Ad esempio, è possibile usare:

/define:_MYTYPE=\"WindowsForms\"

Questa tabella mostra le _MYTYPE impostazioni della costante di compilazione condizionale per diversi tipi di
progetto.

T IP O DI P RO GET TO _VA LO RE M Y T Y P E

Libreria di classi "Windows"

Applicazione console Console

Web Web

Libreria di controlli Web WebControl

Applicazione Windows WindowsForms

Applicazione Windows, quando si inizia con Custom "WindowsFormsWithCustomSubMain"


Sub Main

Libreria di controlli Windows "Windows"

Servizio Windows Console

Empty Vuoto

NOTE
Per tutti i confronti di stringhe di compilazione condizionale viene fatta distinzione tra maiuscole e minuscole,
indipendentemente dalla modalità di Option Compare impostazione dell'istruzione.

_Costanti di compilazione dipendenti


La _MYTYPE costante di compilazione condizionale, a sua volta, controlla i valori di diverse altre _MY costanti di
compilazione:

_M YA P P L IC AT IO _M Y C O M P UT ERT
_M Y T Y P E NT YPE YPE _M Y F O RM S _M Y USERT Y P E _SERVIZ IO W EB

Console Console "Windows" Non definito "Windows" true

Personalizzato Non definito Non definito Non definito Non definito Non definito

Vuoto Non definito Non definito Non definito Non definito Non definito

Web Non definito Web FALSE Web FALSE

WebControl Non definito Web FALSE Web true

"Windows" o "" "Windows" "Windows" Non definito "Windows" true

WindowsForms WindowsForms "Windows" true "Windows" true

"WindowsForms Console "Windows" true "Windows" true


WithCustomSub
Main"

Per impostazione predefinita, le costanti di compilazione condizionale non definite vengono risolte in FALSE . È
possibile specificare i valori per le costanti non definite quando si compila il progetto per eseguire l'override del
comportamento predefinito.

NOTE
Quando _MYTYPE è impostato su "Custom", il progetto contiene lo My spazio dei nomi, ma non contiene oggetti.
Tuttavia, _MYTYPE l'impostazione di su "Empty" impedisce al compilatore di aggiungere lo My spazio dei nomi e i relativi
oggetti.

Questa tabella descrive gli effetti dei valori predefiniti delle _MY costanti di compilazione.

C O STA N T E SIGN IF IC ATO

_MYAPPLICATIONTYPE Abilita My.Application se la costante è "console,"


Windows "o" WindowsForms ":

-La versione "console" deriva da ConsoleApplicationBase . e


dispone di un numero inferiore di membri rispetto alla
versione "Windows".
-La versione "Windows" deriva da ApplicationBase . e ha
meno membri rispetto alla versione "WindowsForms".
-La versione "WindowsForms" di My.Application deriva da
WindowsFormsApplicationBase . Se la TARGET costante è
definita come "winexe", la classe include un Sub Main
metodo.
C O STA N T E SIGN IF IC ATO

_MYCOMPUTERTYPE Abilita My.Computer se la costante è "Web" o "Windows":

-La versione "Web" deriva da ServerComputer e ha meno


membri rispetto alla versione "Windows".
-La versione "Windows" di My.Computer deriva da
Computer .

_MYFORMS Abilita My.Forms se la costante è TRUE .

_MYUSERTYPE Abilita My.User se la costante è "Web" o "Windows":

-La versione "Web" di My.User è associata all'identità


utente della richiesta HTTP corrente.
-La versione "Windows" di My.User è associata all'entità
corrente del thread.

_MYWEBSERVICES Abilita My.WebServices se la costante è TRUE .

_MYTYPE Abilita My.Log , My.Request e My.Response se la


costante è "Web".

Vedi anche
ApplicationBase
Computer
Log
User
Dipendenza di My dal tipo di progetto
Compilazione condizionale
-define (Visual Basic)
Oggetto My.Forms
Oggetto My.Request
Oggetto My.Response
Oggetto My.WebServices
Concetti di programmazione (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Questa sezione illustra i concetti della programmazione in linguaggio Visual Basic.

Contenuto della sezione


T ITO LO DESC RIZ IO N E

Programmazione asincrona con Async e Await (Visual Basic) Viene illustrato come creare una soluzione asincrona usando
le parole chiave Async e Await. È inclusa una procedura
dettagliata.

Panoramica degli attributi (Visual Basic) Viene spiegato come offrire informazioni aggiuntive su
elementi di programmazione quali tipi, campi, metodi e
proprietà usando gli attributi.

Informazioni sul chiamante (Visual Basic) Viene descritto come ottenere informazioni relative al
chiamante di un metodo. Queste informazioni includono il
percorso del file e il numero di righe del codice sorgente,
nonché il nome del chiamante.

Raccolte (Visual Basic) Vengono descritti alcuni dei tipi di raccolte disponibili in .NET
Framework. Viene mostrato come usare raccolte semplici e
raccolte di coppie chiave/valore.

Covarianza e controvarianza (Visual Basic) Viene mostrato come abilitare la conversione implicita di
parametri di tipo generico in interfacce e delegati.

Alberi delle espressioni (Visual Basic) Viene illustrato come è possibile usare gli alberi delle
espressioni per abilitare la modifica dinamica del codice
eseguibile.

Iteratori [Visual Basic] Vengono descritti gli iteratori, che consentono di scorrere le
raccolte e restituire gli elementi uno alla volta.

LINQ (Language-Integrated Query) (Visual Basic) Vengono illustrate le potenti funzionalità di query della
sintassi del linguaggio Visual Basic e il modello per
l'esecuzione di query su database relazionali, documenti
XML, set di dati e raccolte in memoria.

Programmazione orientata a oggetti (Visual Basic) Vengono descritti concetti comuni della programmazione
orientata a oggetti, inclusi incapsulamento, ereditarietà e
polimorfismo.

Reflection (Visual Basic) Viene illustrato in che modo è possibile usare la reflection
per creare dinamicamente un'istanza di un tipo, associare il
tipo a un oggetto esistente oppure ottenere il tipo da un
oggetto esistente e richiamarne i metodi o accedere ai
relativi campi e proprietà.

Serializzazione (Visual Basic) Vengono descritti i concetti chiave della serializzazione


binaria, XML e SOAP.
Sezioni correlate

Assembly in .NET Viene descritto come creare e usare gli assembly.

Suggerimenti sulle prestazioni Vengono discusse diverse regole base che consentono di
migliorare le prestazioni dell'applicazione.
Programmazione asincrona con Async e await
(Visual Basic)
05/03/2021 • 30 minutes to read • Edit Online

È possibile evitare colli di bottiglia nelle prestazioni e migliorare la risposta generale dell'applicazione
utilizzando la programmazione asincrona. Le tecniche tradizionali per la scrittura di applicazioni asincrone,
tuttavia, possono essere complesse, rendendone difficile la scrittura, il debug e la gestione.
Visual Studio 2012 introduce un approccio semplificato, la programmazione asincrona, che sfrutta il supporto
asincrono in .NET Framework 4.5 e versioni successive oltre che in Windows Runtime. Il compilatore esegue il
lavoro difficile che prima veniva svolto dallo sviluppatore e l'applicazione mantiene una struttura logica simile al
codice sincrono. Di conseguenza, si ottengono tutti i vantaggi della programmazione asincrona con meno lavoro
richiesto.
In questo argomento viene fornita una panoramica di come e quando utilizzare la programmazione asincrona e
vengono forniti collegamenti per supportare gli argomenti contenenti informazioni dettagliate ed esempi.

Async migliora la velocità di risposta


La modalità asincrona è essenziale per le attività che potenzialmente bloccano l'esecuzione, ad esempio quando
l'applicazione accede al Web. L'accesso a una risorsa Web può essere talvolta lento o ritardato. Se tale attività
viene bloccata in un processo sincrono, l'intera applicazione deve attendere. In un processo asincrono
l'applicazione può invece continuare con un altro lavoro che non dipende dalla risorsa Web finché l'attività di
blocco non termina.
Nella tabella seguente sono mostrate le aree tipiche in cui la programmazione asincrona migliora la risposta. Le
API elencate da .NET Framework 4.5 e Windows Runtime contengono metodi che supportano la
programmazione asincrona.

A REA DEL L 'A P P L IC A Z IO N E A P I DI SUP P O RTO C H E C O N T EN GO N O M ETO DI A SIN C RO N I

Accesso Web HttpClient, SyndicationClient

Utilizzo dei file StorageFile, StreamWriter, StreamReader, XmlReader

Utilizzo di immagini MediaCapture, BitmapEncoder, BitmapDecoder

Programmazione WCF Operazioni sincrone e asincrone

La modalità asincrona è particolarmente importante per le applicazioni che accedono al thread dell'interfaccia
utente poiché tutte le attività correlate all'interfaccia utente in genere condividono un thread. Se un processo è
bloccato in un'applicazione sincrona, tutte le attività saranno bloccate. L'applicazione non risponde e si potrebbe
pensare che si sia verificato un errore mentre si tratta solo di un'applicazione attesa.
Quando si utilizzano i metodi asincroni, l'applicazione continua a rispondere all'interfaccia utente. È possibile ad
esempio ridimensionare o ridurre a icona una finestra oppure è possibile chiudere l'applicazione se non si
desidera attendere il completamento.
L'approccio basato su modalità asincrona aggiunge l'equivalente di una trasmissione automatica all'elenco di
opzioni da cui è possibile scegliere quando si progettano operazioni asincrone. In questo modo si ottengono
tutti i vantaggi della programmazione asincrona tradizionale con meno lavoro richiesto allo sviluppatore.

I metodi asincroni sono più semplici da scrivere


In Visual Basic le parole chiave Async e Await sono il punto centrale della programmazione asincrona. Tramite
queste due parole chiave, è possibile usare le risorse di .NET Framework o di Windows Runtime per creare un
metodo asincrono con la stessa facilità con cui è possibile creare un metodo sincrono. I metodi asincroni definiti
mediante Async e Await sono denominati metodi asincroni.
Nell'esempio seguente viene illustrato un metodo asincrono. Quasi tutti gli elementi del codice dovrebbe essere
completamente noti all'utente. I commenti richiamano le funzionalità che si aggiungono per creare la modalità
asincrona.
È possibile trovare il file di esempio completo Windows Presentation Foundation (WPF) alla fine di questo
argomento e scaricare l'esempio dalla pagina Async Sample: Example from "Asynchronous Programming with
Async and Await" (Esempio di attività asincrona: Programmazione asincrona con async e await).

' Three things to note about writing an Async Function:


' - The function has an Async modifier.
' - Its return type is Task or Task(Of T). (See "Return Types" section.)
' - As a matter of convention, its name ends in "Async".
Async Function AccessTheWebAsync() As Task(Of Integer)
Using client As New HttpClient()
' Call and await separately.
' - AccessTheWebAsync can do other things while GetStringAsync is also running.
' - getStringTask stores the task we get from the call to GetStringAsync.
' - Task(Of String) means it is a task which returns a String when it is done.
Dim getStringTask As Task(Of String) =
client.GetStringAsync("https://docs.microsoft.com/dotnet")
' You can do other work here that doesn't rely on the string from GetStringAsync.
DoIndependentWork()
' The Await operator suspends AccessTheWebAsync.
' - AccessTheWebAsync does not continue until getStringTask is complete.
' - Meanwhile, control returns to the caller of AccessTheWebAsync.
' - Control resumes here when getStringTask is complete.
' - The Await operator then retrieves the String result from getStringTask.
Dim urlContents As String = Await getStringTask
' The Return statement specifies an Integer result.
' A method which awaits AccessTheWebAsync receives the Length value.
Return urlContents.Length

End Using

End Function

Se AccessTheWebAsync non ha alcuna operazione da eseguire tra la chiamata di GetStringAsync e il relativo


completamento, è possibile semplificare il codice chiamando l'istruzione singola seguente e rimanendo in
attesa.

Dim urlContents As String = Await client.GetStringAsync()

Le seguenti caratteristiche riepilogano gli elementi che rendono l'esempio precedente un metodo asincrono:
La firma del metodo include un modificatore Async .
Il nome di un metodo asincrono termina per convenzione con un suffisso "Async".
Il tipo restituito è uno dei seguenti:
Task (Of TResult) se il metodo dispone di un'istruzione return in cui l'operando è di tipo TResult.
Task se nel metodo non è presente un'istruzione return oppure è presente un'istruzione return senza
l'operando.
Sub se si sta scrivendo un gestore eventi asincrono.
Per ulteriori informazioni, vedere la sezione "Tipi restituiti e parametri" più avanti in questo argomento.
Il metodo include in genere almeno un'espressione await, che contrassegna un punto in cui il metodo
non può continuare fino a quando l'operazione asincrona attesa non sia completata. Nel frattempo, il
metodo viene sospeso e il controllo ritorna al chiamante del metodo. Nella sezione successiva di questo
argomento viene illustrato quello che accade in corrispondenza del punto di sospensione.
Nei metodi asincroni utilizzare le parole chiave e i tipi forniti per indicare l'operazione da eseguire e il
compilatore esegue il resto dell'operazione, inclusa la traccia di cosa deve verificarsi quando il controllo viene
restituito a un punto di attesa in un metodo sospeso. Alcuni processi di routine, come cicli e gestione delle
eccezioni, possono essere difficili da gestire nel codice asincrono tradizionale. In un metodo asincrono scrivere
questi elementi come in una soluzione sincrona e il problema viene risolto.
Per altre informazioni sulla modalità asincrona in versioni precedenti di .NET Framework, vedere TPL and
Traditional .NET Framework Asynchronous Programming (TPL e programmazione asincrona .NET Framework
tradizionale).

Cosa accade in un metodo asincrono


La cosa più importante da capire nella programmazione asincrona è il modo in cui il flusso del controllo si
sposta da un metodo all'altro. Nel diagramma seguente viene descritto il processo:

I numeri nel diagramma corrispondono ai passaggi seguenti:


1. Un gestore eventi chiama e attende il AccessTheWebAsync metodo asincrono.
2. AccessTheWebAsync crea un'istanza di HttpClient e chiama il metodo asincrono GetStringAsync per
scaricare il contenuto di un sito Web come stringa.
3. Si verifica un evento in GetStringAsync che ne sospende lo stato di avanzamento forse perché deve
attendere il termine dello scaricamento di un sito Web o un'altra attività di blocco. Per evitare di bloccare
le risorse, GetStringAsync restituisce il controllo al chiamante AccessTheWebAsync .
GetStringAsync Restituisce un' attività (Of TResult) in cui TResult è una stringa e AccessTheWebAsync
assegna l'attività alla getStringTask variabile. L'attività rappresenta il processo in corso per la chiamata a
GetStringAsync , con l'impegno di produrre un valore stringa effettivo a completamento del lavoro.

4. Poiché getStringTask non è stata ancora attesa, AccessTheWebAsync può continuare con altro lavoro che
non dipende dal risultato finale ottenuto da GetStringAsync . Tale lavoro è rappresentato da una chiamata
al metodo sincrono DoIndependentWork .
5. DoIndependentWork è un metodo sincrono che esegue il proprio lavoro e lo restituisce al chiamante.
6. AccessTheWebAsync ha esaurito il lavoro che può eseguire senza un risultato da getStringTask .
AccessTheWebAsync deve quindi calcolare e restituire la lunghezza della stringa scaricata, ma il metodo
non può calcolare il valore finché quest'ultimo non contiene la stringa.
Di conseguenza, AccessTheWebAsync utilizza un operatore await per sospendere lo stato di avanzamento e
restituire il controllo al metodo che ha chiamato AccessTheWebAsync . AccessTheWebAsync restituisce
Task(Of Integer) al chiamante. L'attività rappresenta l'intenzione di produrre un risultato di tipo Integer
che è la lunghezza della stringa scaricata.

NOTE
Se l'operazione GetStringAsync (e quindi getStringTask ) viene completata prima che AccessTheWebAsync
ne attenda il risultato, il controllo resta a AccessTheWebAsync . I costi per sospendere e tornare a
AccessTheWebAsync sarebbero sprecati se il processo asincrono chiamato ( getStringTask ) fosse già
completato e AccessTheWebSync non dovesse attendere il risultato finale.

Nel chiamante (in questo esempio il gestore eventi), il modello di elaborazione continua. Il chiamante può
eseguire altre attività che non dipendono dal risultato di AccessTheWebAsync prima di attendere tale
risultato oppure può mettersi immediatamente in attesa. Il gestore eventi è in attesa di
AccessTheWebAsync e AccessTheWebAsync è in attesa di GetStringAsync .

7. GetStringAsync termina e produce un risultato di stringa. Il risultato di stringa non viene restituito dalla
chiamata a GetStringAsync nel modo previsto. Tenere presente che il metodo non ha restituito un'attività
al passaggio 3. Il risultato di stringa viene invece memorizzato nell'attività che rappresenta il
completamento del metodo, ovvero getStringTask . L'operatore await recupera il risultato da
getStringTask . L'istruzione di assegnazione assegna il risultato recuperato a urlContents .

8. Quando AccessTheWebAsync ha il risultato di stringa, il metodo può calcolare la lunghezza della stringa. Il
lavoro di AccessTheWebAsync è quindi completo e il gestore eventi in attesa può riprendere l'attività.
Nell'esempio completo alla fine dell'argomento è possibile confermare che il gestore eventi recupera e
stampa il valore del risultato di lunghezza.
Se non si ha familiarità con la programmazione asincrona, valutare la differenza tra il comportamento sincrono
e asincrono. Viene restituito un metodo sincrono quando il lavoro è completato (passaggio 5), ma un metodo
asincrono restituisce un valore di attività quando il relativo lavoro viene sospeso (passaggi 3 e 6). Una volta che
il metodo asincrono completa l'operazione, l'attività viene contrassegnata come completata e il risultato, se
disponibile, viene archiviato nell'attività.
Per altre informazioni sul flusso di controllo, vedere Flusso di controllo in programmi asincroni (Visual Basic).

Metodi asincroni per API


Metodi come GetStringAsync che supportano la programmazione asincrona Il .NET Framework 4,5 o versione
successiva contiene molti membri che funzionano con Async e Await . È possibile riconoscere questi membri
dal suffisso "Async" associato al nome del membro e dal tipo restituito di Task o Task (Of TResult). Ad esempio, la
classe System.IO.Stream contiene metodi come CopyToAsync, ReadAsync e WriteAsync insieme ai metodi
sincroni CopyTo, Read e Write.
Windows Runtime contiene inoltre molti metodi che è possibile usare con Async e Await in app Windows. Per
altre informazioni e metodi di esempio, vedere chiamare le API asincrone in C# o Visual Basic, programmazione
asincrona (app Windows Runtime)e WhenAny: bridging tra la .NET Framework e la Windows Runtime.

Thread
I metodi asincroni vengono considerati operazioni non bloccanti. Un' Await espressione in un metodo
asincrono non blocca il thread corrente quando l'attività attesa è in esecuzione. Al contrario, l'espressione
registra il resto del metodo come continuazione e restituisce il controllo al chiamante del metodo asincrono.
Le parole chiave Async e Await non determinano la creazione di thread aggiuntivi. I metodi asincroni non
richiedono il multithreading perché un metodo asincrono non viene eseguito nel proprio thread. Il metodo viene
eseguito nel contesto di sincronizzazione corrente e utilizza il tempo sul thread solo se il metodo è attivo. È
possibile utilizzare Task.Run per spostare un lavoro associato alla CPU in un thread in background. Quest'ultimo
tuttavia non è di alcun ausilio in un processo che attende solo che i risultati diventino disponibili.
L'approccio alla programmazione asincrona basato su async è quasi sempre preferibile agli approcci esistenti. In
particolare, questo approccio è migliore di BackgroundWorker per le operazioni di i/O perché il codice è più
semplice e non è necessario proteggersi dalle race condition. Insieme a Task.Run, la programmazione asincrona
è migliore di BackgroundWorker per le operazioni associate alla CPU perché separa i dettagli di coordinamento
per l'esecuzione del codice dal lavoro che Task.Run trasferisce al pool di thread.

Async e await
Se si specifica che un metodo è un metodo asincrono usando un modificatore Async , si abilitano le due
funzionalità seguenti.
Il metodo asincrono contrassegnato può usare await per definire i punti di sospensione. L'operatore
await indica al compilatore che il metodo asincrono non può continuare oltre un dato punto prima del
completamento del processo asincrono in attesa. Nel frattempo il controllo viene restituito al chiamante
del metodo asincrono.
La sospensione di un metodo asincrono in un' Await espressione non costituisce un'uscita dal metodo e
i Finally blocchi non vengono eseguiti.
Il metodo asincrono contrassegnato può essere atteso da metodi che lo chiamano.
Un metodo asincrono contiene in genere una o più occorrenze di un Await operatore, ma l'assenza di Await
espressioni non provoca un errore del compilatore. Se un metodo asincrono non usa un Await operatore per
contrassegnare un punto di sospensione, il metodo viene eseguito come metodo sincrono, nonostante il Async
modificatore. Il compilatore genera un avviso per tali metodi.
Async e Await sono parole chiave contestuali. Per ulteriori informazioni ed esempi, vedere gli argomenti
seguenti:
Asincrona
Operatore await

Tipi restituiti e parametri


Nella programmazione .NET Framework un metodo asincrono restituisce in genere un oggetto Task o un' attività
(Of TResult). In un metodo asincrono un operatore Await viene applicato a un'attività restituita da una chiamata
a un altro metodo asincrono.
Specificare Task (Of TResult) come tipo restituito se il metodo contiene un'istruzione Return che specifica un
operando di tipo TResult .
Utilizzare Task come tipo restituito se il metodo non include un'istruzione return o contiene un'istruzione
return che non restituisce un operando.
Nell'esempio seguente viene illustrato come dichiarare e chiamare un metodo che restituisce un' attività (Of
TResult) o un oggetto Task :

' Signature specifies Task(Of Integer)


Async Function TaskOfTResult_MethodAsync() As Task(Of Integer)

Dim hours As Integer


' . . .
' Return statement specifies an integer result.
Return hours
End Function

' Calls to TaskOfTResult_MethodAsync


Dim returnedTaskTResult As Task(Of Integer) = TaskOfTResult_MethodAsync()
Dim intResult As Integer = Await returnedTaskTResult
' or, in a single statement
Dim intResult As Integer = Await TaskOfTResult_MethodAsync()

' Signature specifies Task


Async Function Task_MethodAsync() As Task

' . . .
' The method has no return statement.
End Function

' Calls to Task_MethodAsync


Task returnedTask = Task_MethodAsync()
Await returnedTask
' or, in a single statement
Await Task_MethodAsync()

Ogni attività restituita rappresenta il lavoro attualmente in fase di esecuzione. Un'attività include le informazioni
sullo stato del processo asincrono e, infine, il risultato finale del processo o l'eccezione che il processo genera se
non viene completato.
Un metodo asincrono può essere anche un metodo Sub . Il tipo restituito viene usato principalmente per
definire i gestori eventi, dove è necessario un tipo restituito. I gestori eventi asincroni fungono spesso da punto
di partenza per i programmi asincroni.
Un metodo asincrono che è una Sub routine non può essere atteso e il chiamante non può intercettare le
eccezioni generate dal metodo.
Un metodo asincrono non può dichiarare parametri ByRef, ma può chiamare metodi che hanno tali parametri.
Per altre informazioni ed esempi, vedere Tipi restituiti asincroni (Visual Basic). Per altre informazioni su come
intercettare eccezioni nei metodi asincroni, vedere Istruzione Try...Catch...Finally.
Nella programmazione Windows Runtime le API asincrone hanno uno dei tipi restituiti seguenti, che sono simili
alle attività:
IAsyncOperation (Of TResult), che corrisponde a Task (Of TResult)
IAsyncAction, che corrisponde a Task
IAsyncActionWithProgress (di TProgress)
IAsyncOperationWithProgress (Of TResult, TProgress)
Per altre informazioni e per un esempio, vedere chiamare le API asincrone in C# o Visual Basic.

Convenzione di denominazione
Per convenzione, il suffisso "Async" viene aggiunto ai nomi dei metodi che presentano un modificatore Async .
È possibile ignorare la convenzione se un evento, una classe base o un contratto di interfaccia suggerisce un
nome diverso. Ad esempio, non è necessario rinominare i gestori eventi comuni, ad esempio Button1_Click .

Argomenti correlati ed esempi (Visual Studio)


T ITO LO DESC RIZ IO N E ESEM P IO

Procedura dettagliata: accesso al Web Mostra come convertire una soluzione Async Sample: Accessing the Web
con Async e Await (Visual Basic) WPF sincrona in una soluzione WPF Walkthrough (Esempio di attività
asincrona. L'applicazione scarica una asincrona: Accesso alla procedura
serie di siti Web. dettagliata Web)

Procedura: Estendere la procedura Aggiunge Task.WhenAll alla procedura


dettagliata asincrona tramite dettagliata precedente. L'utilizzo di
Task.WhenAll (Visual Basic) WhenAll consente di avviare tutti i
download contemporaneamente.

Procedura: Eseguire più richieste Web Viene illustrato come avviare Async Sample: Make Multiple Web
in parallelo tramite async e await contemporaneamente diverse attività. Requests in Parallel (Esempio di attività
(Visual Basic) asincrona: Esecuzione di più richieste
Web in parallelo)

Tipi restituiti asincroni (Visual Basic) Vengono illustrati i tipi che i metodi
asincroni possono restituire e viene
spiegato quando ogni tipo è
appropriato.

Flusso di controllo in programmi Traccia in dettaglio il flusso di controllo Async Sample: Control Flow in Async
asincroni (Visual Basic) con una successione di espressioni Programs (Esempio di attività
await in un programma asincrono. asincrona: Flusso di controllo in
programmi asincroni)

Ottimizzazione dell'applicazione Async Mostra come aggiungere la seguente Async Sample: Fine Tuning Your
(Visual Basic) funzionalità alla soluzione asincrono: Application (Esempio di attività
asincrona: Ottimizzazione
- Annullare un'attività asincrona o un dell'applicazione)
elenco di attività (Visual Basic)
- Annullare attività asincrone dopo un
periodo di tempo (Visual Basic)
- Annullare le attività asincrone
rimanenti dopo che ne è stata
completata una(Visual Basic)
- Avviare più attività asincrone ed
elaborarle quando vengono
completate (Visual Basic)
T ITO LO DESC RIZ IO N E ESEM P IO

Gestione della reentrancy nelle Viene illustrato come gestire i casi in


applicazioni asincrone (Visual Basic) cui un'operazione asincrona attiva
viene riavviata mentre è in esecuzione.

WhenAny: bridging tra .NET Descrive come integrare i tipi di attività Async Sample: Bridging between .NET
Framework e Windows Runtime in .NET Framework e IAsyncOperations and Windows Runtime (AsTask and
in Windows Runtime per usare WhenAny) (Esempio di attività
WhenAny con un metodo di Windows asincrona: Bridging tra .NET e Windows
Runtime. Runtime (AsTask e WhenAny))

Annullamento asincrono: bridging tra Descrive come integrare i tipi di attività Async Sample: Bridging between .NET
.NET Framework e Windows Runtime in .NET Framework e IAsyncOperations and Windows Runtime (AsTask &
in Windows Runtime per usare Cancellation) (Esempio di attività
CancellationTokenSource con un asincrona: Bridging tra .NET e Windows
metodo di Windows Runtime. Runtime (AsTask e Cancellation))

Uso della funzionalità Async per Vengono elencati e illustrati i vantaggi


l'accesso ai file (Visual Basic) dell'utilizzo di async e await per
accedere ai file.

Modello asincrono basato su attività Descrive un nuovo modello per la


(TAP) modalità asincrona in .NET Framework.
Il modello è basato sui Task tipi e
dell'attività (Of TResult) .

Video sulla modalità asincrona su Vengono forniti collegamenti a una


Channel 9 serie di video sulla programmazione
asincrona.

Esempio completo
Il codice seguente rappresenta il file MainWindow.xaml.vb dell'applicazione Windows Presentation Foundation
(WPF) discussa in questo argomento. È possibile scaricare l'esempio dalla pagina Async Sample: Example from
"Asynchronous Programming with Async and Await" (Esempio di attività asincrona: Programmazione asincrona
con async e await).
Imports System.Net.Http

' Example that demonstrates Asynchronous Progamming with Async and Await.
' It uses HttpClient.GetStringAsync to download the contents of a website.
' Sample Output:
' Working . . . . . . .
'
' Length of the downloaded string: 39678.

Class MainWindow

' Mark the event handler with Async so you can use Await in it.
Private Async Sub StartButton_Click(sender As Object, e As RoutedEventArgs)

' Call and await immediately.


' StartButton_Click suspends until AccessTheWebAsync is done.
Dim contentLength As Integer = Await AccessTheWebAsync()

ResultsTextBox.Text &= $"{vbCrLf}Length of the downloaded string: {contentLength}.{vbCrLf}"

End Sub

' Three things to note about writing an Async Function:


' - The function has an Async modifier.
' - Its return type is Task or Task(Of T). (See "Return Types" section.)
' - As a matter of convention, its name ends in "Async".
Async Function AccessTheWebAsync() As Task(Of Integer)

Using client As New HttpClient()

' Call and await separately.


' - AccessTheWebAsync can do other things while GetStringAsync is also running.
' - getStringTask stores the task we get from the call to GetStringAsync.
' - Task(Of String) means it is a task which returns a String when it is done.
Dim getStringTask As Task(Of String) =
client.GetStringAsync("https://docs.microsoft.com/dotnet")

' You can do other work here that doesn't rely on the string from GetStringAsync.
DoIndependentWork()

' The Await operator suspends AccessTheWebAsync.


' - AccessTheWebAsync does not continue until getStringTask is complete.
' - Meanwhile, control returns to the caller of AccessTheWebAsync.
' - Control resumes here when getStringTask is complete.
' - The Await operator then retrieves the String result from getStringTask.
Dim urlContents As String = Await getStringTask

' The Return statement specifies an Integer result.


' A method which awaits AccessTheWebAsync receives the Length value.
Return urlContents.Length

End Using

End Function

Sub DoIndependentWork()
ResultsTextBox.Text &= $"Working . . . . . . .{vbCrLf}"
End Sub

End Class

Vedi anche
Operatore await
Asincrona
Panoramica degli attributi (Visual Basic)
05/03/2021 • 8 minutes to read • Edit Online

Gli attributi offrono un metodo efficace per l'associazione di metadati o informazioni dichiarative con il codice
(assembly, tipi, metodi, proprietà e così via). Dopo aver associato un attributo a un'entità di programma, in fase
di esecuzione è possibile eseguire una query su tale attributo usando una tecnica denominata reflection. Per
altre informazioni, vedere Reflection (Visual Basic).
Di seguito sono riportate le proprietà degli attributi:
Gli attributi aggiungono metadati al programma. I metadati sono informazioni relative ai tipi definiti in un
programma. Tutti gli assembly .NET contengono un set specificato di metadati che descrive i tipi e
membri dei tipi definiti nell'assembly. È possibile aggiungere attributi personalizzati per specificare altre
informazioni eventualmente necessarie. Per altre informazioni, vedere Creazione di attributi
personalizzati (Visual Basic).
È possibile applicare uno o più attributi a interi assembly, moduli o elementi di programma di minori
dimensioni, ad esempio classi e proprietà.
Gli attributi possono accettare argomenti nello stesso modo dei metodi e delle proprietà.
Il programma può esaminare i propri metadati oppure i metadati di un altro programma tramite
reflection. Per altre informazioni, vedere Accesso agli attributi tramite reflection (Visual Basic).

Uso degli attributi


È possibile usare attributi nella maggior parte delle dichiarazioni, anche se la validità di un attributo specifico
può essere limitata ad alcuni tipi di dichiarazione. In Visual Basic, un attributo è racchiuso tra parentesi acute ( <
> ). e deve apparire immediatamente prima dell'elemento a cui viene applicato, sulla stessa riga.
Nell'esempio seguente l'attributo SerializableAttribute viene usato per applicare una caratteristica specifica a
una classe:

<System.Serializable()> Public Class SampleClass


' Objects of this type can be serialized.
End Class

Un metodo con l'attributo DllImportAttribute è dichiarato come segue:

Imports System.Runtime.InteropServices

<System.Runtime.InteropServices.DllImport("user32.dll")>
Sub SampleMethod()
End Sub

In una dichiarazione è possibile inserire più attributi:

Imports System.Runtime.InteropServices
Sub MethodA(<[In](), Out()> ByVal x As Double)
End Sub
Sub MethodB(<Out(), [In]()> ByVal x As Double)
End Sub

Alcuni attributi possono essere specificati più volte per una stessa entità. Un esempio di attributo multiuso è
ConditionalAttribute:

<Conditional("DEBUG"), Conditional("TEST1")>
Sub TraceMethod()
End Sub

NOTE
Per convenzione tutti i nomi di attributo terminano con la parola "Attribute", in modo che sia possibile distinguerli da altri
elementi di .NET Framework. Tuttavia, quando gli attributi vengono usati nel codice, non è necessario specificare il suffisso
Attribute. Ad esempio, [DllImport] è equivalente a [DllImportAttribute] , mentre DllImportAttribute è il nome
effettivo dell'attributo in .NET Framework.

Parametri degli attributi


Diversi attributi dispongono di parametri, che possono essere posizionali, senza nome o denominati. I parametri
posizionali devono essere specificati in un determinato ordine e non possono essere omessi. I parametri
denominati sono invece facoltativi e possono essere specificati in qualsiasi ordine. I parametri posizionali
vengono specificati per primi. I tre attributi seguenti, ad esempio, sono equivalenti:

<DllImport("user32.dll")>
<DllImport("user32.dll", SetLastError:=False, ExactSpelling:=False)>
<DllImport("user32.dll", ExactSpelling:=False, SetLastError:=False)>

Il primo parametro, ovvero il nome della DLL, è posizionale ed è sempre specificato per primo. Gli altri parametri
sono denominati. In questo caso, entrambi i parametri denominati sono impostati automaticamente su false e
possono quindi essere omessi. Per informazioni sui valori predefiniti dei parametri, fare riferimento alla
documentazione di ciascun attributo.
Destinazioni degli attributi
La destinazione di un attributo è l'entità a cui tale attributo viene applicato. Un attributo, ad esempio, può essere
applicato a una classe, a un metodo particolare o a un intero assembly. Per impostazione predefinita, un
attributo viene applicato all'elemento che lo segue. È tuttavia possibile identificare in modo esplicito, ad
esempio, se un attributo viene applicato a un metodo, al relativo parametro o al relativo valore restituito.
Per identificare in modo esplicito la destinazione di un attributo, usare la sintassi seguente:

<target : attribute-list>

Nella tabella seguente sono elencati i possibili valori di target .

VA LO RE DI DEST IN A Z IO N E SI A P P L IC A A

assembly Intero assembly


VA LO RE DI DEST IN A Z IO N E SI A P P L IC A A

module Modulo dell'assembly corrente (diverso da un modulo di


Visual Basic)

Nell'esempio seguente viene illustrato come applicare attributi ad assembly e moduli. Per altre informazioni,
vedere Attributi comuni (Visual Basic).

Imports System.Reflection
<Assembly: AssemblyTitleAttribute("Production assembly 4"),
Module: CLSCompliant(True)>

Usi comuni degli attributi


Di seguito vengono elencati alcuni degli usi comuni degli attributi nel codice:
Contrassegno dei metodi mediante l'attributo WebMethod nei servizi Web per indicare che è possibile
chiamare il metodo tramite il protocollo SOAP. Per altre informazioni, vedere WebMethodAttribute.
Descrizione della procedura di marshalling dei parametri del metodo durante l'interazione con il codice
nativo. Per altre informazioni, vedere MarshalAsAttribute.
Descrizione delle proprietà COM per classi, metodi e interfacce.
Chiamata al codice non gestito che usa la classe DllImportAttribute.
Descrizione dell'assembly con indicazione di titolo, versione, descrizione o marchio.
Descrizione dei membri della classe da serializzare per la persistenza.
Descrizione della procedura di mapping tra membri di una classe e nodi XML per la serializzazione XML.
Descrizione dei requisiti di sicurezza per i metodi.
Definizione delle caratteristiche usate per garantire la sicurezza.
Controllo delle ottimizzazioni tramite il compilatore JIT (Just-In-Time), in modo da garantire un semplice
debug del codice.
Recupero di informazioni relative al chiamante di un metodo.

Sezioni correlate
Per altre informazioni, vedere:
Creazione di attributi personalizzati (Visual Basic)
Accesso agli attributi tramite reflection (Visual Basic)
Procedura: Creare un'unione C/C++ tramite attributi (Visual Basic)
Attributi comuni (Visual Basic)
Informazioni sul chiamante (Visual Basic)

Vedi anche
Guida per programmatori Visual Basic
Reflection (Visual Basic)
Attributes (Attributi)
Informazioni sul chiamante (Visual Basic)
05/03/2021 • 5 minutes to read • Edit Online

Gli attributi di informazioni sul chiamante consentono di ottenere informazioni sul chiamante di un metodo. È
possibile ottenere il percorso del file del codice sorgente, il numero di riga nel codice sorgente e il nome del
chiamante. Queste informazioni sono utili per la tracciatura, il debug e la creazione di strumenti diagnostici.
Per ottenere queste informazioni, utilizzare gli attributi applicati ai parametri facoltativi, a ognuno dei quali è
associato un valore predefinito. Nella tabella seguente sono elencati gli attributi di informazioni sul chiamante
definiti nello spazio dei nomi System.Runtime.CompilerServices:

AT T RIB UTO DESC RIZ IO N E TYPE

CallerFilePathAttribute Percorso completo del file di origine String


contenente il chiamante. Si tratta del
percorso del file al momento della
compilazione.

CallerLineNumberAttribute Numero di riga nel file di origine in cui Integer


viene chiamato il metodo.

CallerMemberNameAttribute Nome di una proprietà o di un metodo String


del chiamante. Vedere Nomi dei
membri più avanti in questo
argomento.

Esempio
Nell'esempio seguente viene illustrato come utilizzare gli attributi di informazioni sul chiamante. Per ogni
chiamata al metodo TraceMessage , le informazioni sul chiamante vengono sostituite come argomenti dei
parametri facoltativi.

Private Sub DoProcessing()


TraceMessage("Something happened.")
End Sub

Public Sub TraceMessage(message As String,


<System.Runtime.CompilerServices.CallerMemberName> Optional memberName As String = Nothing,
<System.Runtime.CompilerServices.CallerFilePath> Optional sourcefilePath As String = Nothing,
<System.Runtime.CompilerServices.CallerLineNumber()> Optional sourceLineNumber As Integer = 0)

System.Diagnostics.Trace.WriteLine("message: " & message)


System.Diagnostics.Trace.WriteLine("member name: " & memberName)
System.Diagnostics.Trace.WriteLine("source file path: " & sourcefilePath)
System.Diagnostics.Trace.WriteLine("source line number: " & sourceLineNumber)
End Sub

' Sample output:


' message: Something happened.
' member name: DoProcessing
' source file path: C:\Users\username\Documents\Visual Studio
2012\Projects\CallerInfoVB\CallerInfoVB\Form1.vb
' source line number: 15
Commenti
È sempre necessario specificare un valore esplicito per ciascun parametro facoltativo. Non è possibile applicare
attributi di informazioni sul chiamante ai parametri non specificati come facoltativi.
Gli attributi di informazioni sul chiamante non restituiscono un parametro facoltativo, ma influiscono sul valore
predefinito passato quando l'argomento è omesso.
I valori delle informazioni sul chiamante vengono generati come valori letterali in Intermediate Language (IL) in
fase di compilazione. A differenza dei risultati della proprietà StackTrace per le eccezioni, i risultati non sono
interessati da offuscamento.
È possibile fornire esplicitamente gli argomenti facoltativi per esaminare o nascondere le informazioni sul
chiamante.
Nomi dei membri
È possibile utilizzare l'attributo CallerMemberName per specificare il nome del membro come argomento String
al metodo chiamato. Usando questa tecnica, si evita il problema per cui il refactoring di ridenominazione
non modifica i valori String . Questo vantaggio è particolarmente utile per le attività seguenti:
Utilizzo della tracciatura e delle routine di diagnostica.
Implementazione dell'interfaccia INotifyPropertyChanged durante l'associazione dei dati. Questa
interfaccia consente alla proprietà di un oggetto di notificare a un controllo associato la modifica della
proprietà stessa in modo che il controllo possa visualizzare le informazioni aggiornate. Senza l'attributo
CallerMemberName , è necessario specificare il nome della proprietà come valore letterale.

Nel grafico seguente vengono mostrati i nomi dei membri restituiti quando si utilizza l'attributo
CallerMemberName .

EL EM EN TO IN C UI SI VERIF IC A N O L E C H IA M AT E N O M E DEL M EM B RO REST IT UITO

Metodo, proprietà o evento Nome del metodo, della proprietà o dell'evento da cui la
chiamata ha avuto origine.

Costruttore Stringa ".ctor"

Costruttore statico Stringa ".cctor"

Distruttore Stringa "Finalize"

Operatori o conversioni definiti dall'utente Nome generato per il membro, ad esempio "op_Addition".

Costruttore dell'attributo Nome del membro a cui viene applicato l'attributo. Se


l'attributo è un qualsiasi elemento in un membro (ad
esempio un parametro, un valore restituito o un parametro
di tipo generico), il risultato è il nome del membro associato
a tale elemento.

Nessun membro contenitore (ad esempio a livello di Valore predefinito del parametro facoltativo.
assembly o attributi applicati a tipi)

Vedi anche
Attributi (Visual Basic)
Attributi comuni (Visual Basic)
Parametri facoltativi
Concetti di programmazione (Visual Basic)
Raccolte (Visual Basic)
05/03/2021 • 23 minutes to read • Edit Online

Per molte applicazioni è utile creare e gestire gruppi di oggetti correlati. È possibile raggruppare gli oggetti in
due modi: creando matrici di oggetti e creando raccolte di oggetti.
Le matrici sono estremamente utili per la creazione e l'uso di un numero fisso di oggetti fortemente tipizzati. Per
altre informazioni sulle matrici, vedere Matrici.
Le raccolte consentono di lavorare in modo più flessibile con gruppi di oggetti. A differenza delle matrici, il
gruppo di oggetti con cui si lavora può aumentare e diminuire in modo dinamico in base alle esigenze
dell'applicazione. Per alcune raccolte è possibile assegnare una chiave a qualsiasi oggetto inserito nella raccolta
in modo da recuperare rapidamente l'oggetto usando la chiave.
Una raccolta è una classe. Di conseguenza, prima di poter aggiungere elementi a una nuova raccolta è
necessario dichiarare la raccolta.
Se la raccolta contiene elementi di un solo tipo di dati, è possibile usare una delle classi dello spazio dei nomi
System.Collections.Generic. In una raccolta generica viene imposta l'indipendenza dai tipi, in modo da impedire
che vengano aggiunti altri tipi di dati alla raccolta. Quando si recupera un elemento da una raccolta generica,
non è necessario determinarne il tipo di dati né convertirlo.

NOTE
Per gli esempi in questo argomento, includere le istruzioni Imports per gli System.Collections.Generic System.Linq
spazi dei nomi e.

Uso di una raccolta semplice


Gli esempi in questa sezione usano la classe generica List<T>, che consente di usare un elenco di oggetti
fortemente tipizzato.
Nell'esempio seguente viene creato un elenco di stringhe e quindi viene eseguita un'iterazione nelle stringhe
utilizzando un per ogni... Istruzione successiva .

' Create a list of strings.


Dim salmons As New List(Of String)
salmons.Add("chinook")
salmons.Add("coho")
salmons.Add("pink")
salmons.Add("sockeye")

' Iterate through the list.


For Each salmon As String In salmons
Console.Write(salmon & " ")
Next
'Output: chinook coho pink sockeye

Se il contenuto di una raccolta è noto in anticipo, si può usare un inizializzatore di raccolta per inizializzare la
raccolta. Per altre informazioni, vedere Inizializzatori di insieme.
L'esempio seguente è identico all'esempio precedente, ma usa un inizializzatore di raccolta per aggiungere
elementi alla raccolta.
' Create a list of strings by using a
' collection initializer.
Dim salmons As New List(Of String) From
{"chinook", "coho", "pink", "sockeye"}

For Each salmon As String In salmons


Console.Write(salmon & " ")
Next
'Output: chinook coho pink sockeye

È possibile usare un per... Istruzione successiva anziché un' For Each istruzione per scorrere una raccolta.
Questo è possibile mediante l'accesso agli elementi della raccolta dalla posizione di indice. L'indice degli
elementi inizia da 0 e termina in corrispondenza del numero di elementi meno 1.
Nell'esempio seguente l'iterazione negli elementi di una raccolta avviene mediante For…Next anziché mediante
For Each .

Dim salmons As New List(Of String) From


{"chinook", "coho", "pink", "sockeye"}

For index = 0 To salmons.Count - 1


Console.Write(salmons(index) & " ")
Next
'Output: chinook coho pink sockeye

Nell'esempio seguente viene rimosso un elemento dalla raccolta specificando l'oggetto da rimuovere.

' Create a list of strings by using a


' collection initializer.
Dim salmons As New List(Of String) From
{"chinook", "coho", "pink", "sockeye"}

' Remove an element in the list by specifying


' the object.
salmons.Remove("coho")

For Each salmon As String In salmons


Console.Write(salmon & " ")
Next
'Output: chinook pink sockeye

Nell'esempio seguente vengono rimossi elementi da un elenco generico. Anziché un' For Each istruzione, un
oggetto per... Viene utilizzata l'istruzione successiva che esegue l'iterazione in ordine decrescente. Ciò è
necessario perché il metodo RemoveAt fa sì che gli elementi dopo un elemento rimosso abbiano un valore di
indice inferiore.
Dim numbers As New List(Of Integer) From
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

' Remove odd numbers.


For index As Integer = numbers.Count - 1 To 0 Step -1
If numbers(index) Mod 2 = 1 Then
' Remove the element by specifying
' the zero-based index in the list.
numbers.RemoveAt(index)
End If
Next

' Iterate through the list.


' A lambda expression is placed in the ForEach method
' of the List(T) object.
numbers.ForEach(
Sub(number) Console.Write(number & " "))
' Output: 0 2 4 6 8

Per il tipo di elementi in List<T>, è possibile anche definire una classe personalizzata. Nell'esempio seguente la
classe Galaxy viene usata dall'oggetto List<T> definito nel codice.

Private Sub IterateThroughList()


Dim theGalaxies As New List(Of Galaxy) From
{
New Galaxy With {.Name = "Tadpole", .MegaLightYears = 400},
New Galaxy With {.Name = "Pinwheel", .MegaLightYears = 25},
New Galaxy With {.Name = "Milky Way", .MegaLightYears = 0},
New Galaxy With {.Name = "Andromeda", .MegaLightYears = 3}
}

For Each theGalaxy In theGalaxies


With theGalaxy
Console.WriteLine(.Name & " " & .MegaLightYears)
End With
Next

' Output:
' Tadpole 400
' Pinwheel 25
' Milky Way 0
' Andromeda 3
End Sub

Public Class Galaxy


Public Property Name As String
Public Property MegaLightYears As Integer
End Class

Tipi di raccolte
Molte raccolte comuni vengono fornite da .NET Framework. Ogni tipo di raccolta è progettato per uno scopo
specifico.
In questa sezione sono descritte alcune classi di raccolte comuni:
Classi System.Collections.Generic
Classi System.Collections.Concurrent
Classi System.Collections
Classe Collection di Visual Basic
Classi System.Collections.Generic
È possibile creare una raccolta generica usando una delle classi dello spazio dei nomi
System.Collections.Generic. Una raccolta generica è utile quando ogni elemento al suo interno presenta lo
stesso tipo di dati. Una raccolta generica applica la tipizzazione forte consentendo di aggiungere soltanto i tipi di
dati desiderati.
La tabella seguente elenca alcune delle classi di uso frequente dello spazio dei nomi System.Collections.Generic:

C L A SSE DESC RIZ IO N E

Dictionary<TKey,TValue> Rappresenta una raccolta di coppie chiave/valore organizzate


in base alla chiave.

List<T> Rappresenta un elenco di oggetti accessibile in base


all'indice. Fornisce metodi per la ricerca, l'ordinamento e la
modifica degli elenchi.

Queue<T> Rappresenta una raccolta di oggetti FIFO (First-In First-Out).

SortedList<TKey,TValue> Rappresenta una raccolta di coppie chiave/valore ordinate


per chiave in base all'implementazione IComparer<T>
associata.

Stack<T> Rappresenta una raccolta di oggetti LIFO (Last-In First-Out).

Per altre informazioni, vedere Tipi di raccolte comunemente utilizzate, Selezione di una classe Collection e
System.Collections.Generic.
Classi System.Collections.Concurrent
In .NET Framework 4 o versioni successive le raccolte dello spazio dei nomi System.Collections.Concurrent
garantiscono operazioni thread-safe efficienti per accedere agli elementi della raccolta da più thread.
Le classi dello spazio dei nomi System.Collections.Concurrent devono essere usate in sostituzione dei tipi
corrispondenti negli spazi dei nomi System.Collections.Generic e System.Collections ogni volta che più thread
accedono contemporaneamente alla raccolta. Per altre informazioni, vedere Raccolte thread-safe e
System.Collections.Concurrent.
Alcune classi incluse nello spazio dei nomi System.Collections.Concurrent sono BlockingCollection<T>,
ConcurrentDictionary<TKey,TValue>, ConcurrentQueue<T> e ConcurrentStack<T>.
Classi System.Collections
Le classi dello spazio dei nomi System.Collections non archiviano gli elementi come oggetti tipizzati in modo
specifico, ma come oggetti di tipo Object .
Quando possibile, usare le raccolte generiche degli spazi dei nomi System.Collections.Generic o
System.Collections.Concurrent al posto dei tipi legacy dello spazio dei nomi System.Collections .
La tabella seguente elenca alcune classi di uso frequente nello spazio dei nomi System.Collections :

C L A SSE DESC RIZ IO N E

ArrayList Rappresenta una matrice di oggetti le cui dimensioni sono


incrementate in modo dinamico in base alle esigenze.
C L A SSE DESC RIZ IO N E

Hashtable Rappresenta una raccolta di coppie chiave/valore organizzate


in base al codice hash della chiave.

Queue Rappresenta una raccolta di oggetti FIFO (First-In First-Out).

Stack Rappresenta una raccolta di oggetti LIFO (Last-In First-Out).

Lo spazio dei nomi System.Collections.Specialized offre classi di raccolte fortemente tipizzate e specializzate, ad
esempio raccolte di sole stringhe, dizionari ibridi e dizionari a elenchi collegati.
Classe Collection di Visual Basic
È possibile usare la classe Collection di Visual Basic per accedere a un elemento della raccolta usando un indice
numerico o una chiave String . Per aggiungere elementi a un oggetto raccolta, è possibile specificare o non
specificare una chiave. Se si aggiunge un elemento senza una chiave, è necessario usare il relativo indice
numerico per accedervi.
La classe Collection di Visual Basic archivia tutti gli elementi di tipo Object , pertanto è possibile aggiungere
un elemento di qualsiasi tipo di dati. Non esiste alcuna misura per impedire l'aggiunta di tipi di dati non
appropriati.
Quando si usa la classe Collection di Visual Basic, il primo elemento di una raccolta ha indice 1. Questo
comportamento è diverso rispetto alle classi Collection di .NET Framework, per cui l'indice iniziale è 0.
Quando possibile, usare le raccolte generiche negli spazi dei nomi System.Collections.Generic o
System.Collections.Concurrent al posto della classe Collection di Visual Basic.
Per altre informazioni, vedere Collection.

Implementazione di una raccolta di coppie chiave/valore


La raccolta generica Dictionary<TKey,TValue> consente di accedere agli elementi di una raccolta usando la
chiave di ogni elemento. Ogni aggiunta al dizionario è costituita da un valore e dalla chiave associata
corrispondente. Il recupero di un valore tramite la relativa chiave è un'operazione veloce, perché la classe
Dictionary viene implementata come tabella hash.

L'esempio seguente crea una raccolta Dictionary ed esegue l'iterazione nel dizionario usando un'istruzione
For Each .
Private Sub IterateThroughDictionary()
Dim elements As Dictionary(Of String, Element) = BuildDictionary()

For Each kvp As KeyValuePair(Of String, Element) In elements


Dim theElement As Element = kvp.Value

Console.WriteLine("key: " & kvp.Key)


With theElement
Console.WriteLine("values: " & .Symbol & " " &
.Name & " " & .AtomicNumber)
End With
Next
End Sub

Private Function BuildDictionary() As Dictionary(Of String, Element)


Dim elements As New Dictionary(Of String, Element)

AddToDictionary(elements, "K", "Potassium", 19)


AddToDictionary(elements, "Ca", "Calcium", 20)
AddToDictionary(elements, "Sc", "Scandium", 21)
AddToDictionary(elements, "Ti", "Titanium", 22)

Return elements
End Function

Private Sub AddToDictionary(ByVal elements As Dictionary(Of String, Element),


ByVal symbol As String, ByVal name As String, ByVal atomicNumber As Integer)
Dim theElement As New Element

theElement.Symbol = symbol
theElement.Name = name
theElement.AtomicNumber = atomicNumber

elements.Add(Key:=theElement.Symbol, value:=theElement)
End Sub

Public Class Element


Public Property Symbol As String
Public Property Name As String
Public Property AtomicNumber As Integer
End Class

Per usare invece un inizializzatore di raccolta per compilare la raccolta Dictionary , è possibile sostituire i
metodi BuildDictionary e AddToDictionary con il metodo seguente.

Private Function BuildDictionary2() As Dictionary(Of String, Element)


Return New Dictionary(Of String, Element) From
{
{"K", New Element With
{.Symbol = "K", .Name = "Potassium", .AtomicNumber = 19}},
{"Ca", New Element With
{.Symbol = "Ca", .Name = "Calcium", .AtomicNumber = 20}},
{"Sc", New Element With
{.Symbol = "Sc", .Name = "Scandium", .AtomicNumber = 21}},
{"Ti", New Element With
{.Symbol = "Ti", .Name = "Titanium", .AtomicNumber = 22}}
}
End Function

L'esempio seguente usa il metodo ContainsKey e la proprietà Item[] di Dictionary per trovare rapidamente un
elemento in base alla chiave. La Item proprietà consente di accedere a un elemento nella elements raccolta
usando il elements(symbol) codice in Visual Basic.
Private Sub FindInDictionary(ByVal symbol As String)
Dim elements As Dictionary(Of String, Element) = BuildDictionary()

If elements.ContainsKey(symbol) = False Then


Console.WriteLine(symbol & " not found")
Else
Dim theElement = elements(symbol)
Console.WriteLine("found: " & theElement.Name)
End If
End Sub

L'esempio seguente usa invece il metodo TryGetValue per individuare rapidamente un elemento in base alla
chiave.

Private Sub FindInDictionary2(ByVal symbol As String)


Dim elements As Dictionary(Of String, Element) = BuildDictionary()

Dim theElement As Element = Nothing


If elements.TryGetValue(symbol, theElement) = False Then
Console.WriteLine(symbol & " not found")
Else
Console.WriteLine("found: " & theElement.Name)
End If
End Sub

Uso di LINQ per accedere a una raccolta


È possibile usare LINQ (Language-Integrated Query) per accedere alle raccolte. Le query LINQ forniscono
funzionalità di filtro, ordinamento e raggruppamento. Per ulteriori informazioni, vedere Introduzione con LINQ
in Visual Basic.
Nell'esempio seguente viene eseguita una query LINQ su un oggetto List generico. La query LINQ restituisce
una raccolta diversa che contiene i risultati.
Private Sub ShowLINQ()
Dim elements As List(Of Element) = BuildList()

' LINQ Query.


Dim subset = From theElement In elements
Where theElement.AtomicNumber < 22
Order By theElement.Name

For Each theElement In subset


Console.WriteLine(theElement.Name & " " & theElement.AtomicNumber)
Next

' Output:
' Calcium 20
' Potassium 19
' Scandium 21
End Sub

Private Function BuildList() As List(Of Element)


Return New List(Of Element) From
{
{New Element With
{.Symbol = "K", .Name = "Potassium", .AtomicNumber = 19}},
{New Element With
{.Symbol = "Ca", .Name = "Calcium", .AtomicNumber = 20}},
{New Element With
{.Symbol = "Sc", .Name = "Scandium", .AtomicNumber = 21}},
{New Element With
{.Symbol = "Ti", .Name = "Titanium", .AtomicNumber = 22}}
}
End Function

Public Class Element


Public Property Symbol As String
Public Property Name As String
Public Property AtomicNumber As Integer
End Class

Ordinamento di una raccolta


L'esempio seguente illustra una procedura per ordinare una raccolta. Nell'esempio vengono ordinate le istanze
della classe Car archiviate in un oggetto List<T>. La classe Car implementa l'interfaccia IComparable<T>, che
richiede l'implementazione del metodo CompareTo.
Ogni chiamata al metodo CompareTo effettua un confronto unico che viene usato per l'ordinamento. Il codice
scritto dall'utente presente nel metodo CompareTo restituisce un valore per ogni confronto dell'oggetto corrente
con un altro oggetto. Il valore restituito è minore di zero se l'oggetto corrente è inferiore all'altro oggetto,
maggiore di zero se l'oggetto corrente è superiore all'altro oggetto e zero se sono uguali. In questo modo è
possibile definire nel codice i criteri di maggiore, minore e uguale.
Nel metodo ListCars l'istruzione cars.Sort() ordina l'elenco. Questa chiamata al metodo Sort di List<T>
determina la chiamata automatica al metodo CompareTo per gli oggetti Car in List .

Public Sub ListCars()

' Create some new cars.


Dim cars As New List(Of Car) From
{
New Car With {.Name = "car1", .Color = "blue", .Speed = 20},
New Car With {.Name = "car2", .Color = "red", .Speed = 50},
New Car With {.Name = "car3", .Color = "green", .Speed = 10},
New Car With {.Name = "car4", .Color = "blue", .Speed = 50},
New Car With {.Name = "car5", .Color = "blue", .Speed = 30},
New Car With {.Name = "car5", .Color = "blue", .Speed = 30},
New Car With {.Name = "car6", .Color = "red", .Speed = 60},
New Car With {.Name = "car7", .Color = "green", .Speed = 50}
}

' Sort the cars by color alphabetically, and then by speed


' in descending order.
cars.Sort()

' View all of the cars.


For Each thisCar As Car In cars
Console.Write(thisCar.Color.PadRight(5) & " ")
Console.Write(thisCar.Speed.ToString & " ")
Console.Write(thisCar.Name)
Console.WriteLine()
Next

' Output:
' blue 50 car4
' blue 30 car5
' blue 20 car1
' green 50 car7
' green 10 car3
' red 60 car6
' red 50 car2
End Sub

Public Class Car


Implements IComparable(Of Car)

Public Property Name As String


Public Property Speed As Integer
Public Property Color As String

Public Function CompareTo(ByVal other As Car) As Integer _


Implements System.IComparable(Of Car).CompareTo
' A call to this method makes a single comparison that is
' used for sorting.

' Determine the relative order of the objects being compared.


' Sort by color alphabetically, and then by speed in
' descending order.

' Compare the colors.


Dim compare As Integer
compare = String.Compare(Me.Color, other.Color, True)

' If the colors are the same, compare the speeds.


If compare = 0 Then
compare = Me.Speed.CompareTo(other.Speed)

' Use descending order for speed.


compare = -compare
End If

Return compare
End Function
End Class

Definizione di una raccolta personalizzata


È possibile definire una raccolta implementando l'interfaccia IEnumerable<T> o IEnumerable. Per ulteriori
informazioni, vedere enumerazione di una raccolta.
Sebbene sia possibile definire una raccolta personalizzata, in genere è preferibile usare le raccolte incluse in .NET
Framework, descritte in Tipi di raccolte in precedenza in questo argomento.
L'esempio seguente definisce una classe di raccolte personalizzata denominata AllColors . Questa classe
implementa l'interfaccia IEnumerable che richiede l'implementazione del metodo GetEnumerator.
Il metodo GetEnumerator restituisce un'istanza della classe ColorEnumerator . ColorEnumerator implementa
l'interfaccia IEnumerator che richiede l'implementazione della proprietà Current e dei metodi MoveNext e Reset.
Public Sub ListColors()
Dim colors As New AllColors()

For Each theColor As Color In colors


Console.Write(theColor.Name & " ")
Next
Console.WriteLine()
' Output: red blue green
End Sub

' Collection class.


Public Class AllColors
Implements System.Collections.IEnumerable

Private _colors() As Color =


{
New Color With {.Name = "red"},
New Color With {.Name = "blue"},
New Color With {.Name = "green"}
}

Public Function GetEnumerator() As System.Collections.IEnumerator _


Implements System.Collections.IEnumerable.GetEnumerator

Return New ColorEnumerator(_colors)

' Instead of creating a custom enumerator, you could


' use the GetEnumerator of the array.
'Return _colors.GetEnumerator
End Function

' Custom enumerator.


Private Class ColorEnumerator
Implements System.Collections.IEnumerator

Private _colors() As Color


Private _position As Integer = -1

Public Sub New(ByVal colors() As Color)


_colors = colors
End Sub

Public ReadOnly Property Current() As Object _


Implements System.Collections.IEnumerator.Current
Get
Return _colors(_position)
End Get
End Property

Public Function MoveNext() As Boolean _


Implements System.Collections.IEnumerator.MoveNext
_position += 1
Return (_position < _colors.Length)
End Function

Public Sub Reset() Implements System.Collections.IEnumerator.Reset


_position = -1
End Sub
End Class
End Class

' Element class.


Public Class Color
Public Property Name As String
End Class
Iterators
Un iteratore viene usato per eseguire un'iterazione personalizzata in una raccolta. Un iteratore può essere un
metodo o una funzione di accesso get . Un iteratore usa un'istruzione yield per restituire ogni elemento della
raccolta uno alla volta.
Si chiama un iteratore usando un per ogni... Istruzione successiva . Ogni iterazione del ciclo For Each chiama
l'iteratore. Quando si raggiunge un'istruzione Yield nell'iteratore, viene restituita un'espressione e viene
mantenuta la posizione corrente nel codice. L'esecuzione viene ripresa a partire da quella posizione la volta
successiva che viene chiamato l'iteratore.
Per ulteriori informazioni, vedere iteratori (Visual Basic).
Nell'esempio seguente viene usato un metodo iteratore. Il metodo iteratore ha un' Yield istruzione che si trova
all'interno di un oggetto per... Ciclo successivo . Nel metodo ListEvenNumbers ogni iterazione del corpo
dell'istruzione For Each crea una chiamata al metodo iteratore, che procede all'istruzione Yield successiva.

Public Sub ListEvenNumbers()


For Each number As Integer In EvenSequence(5, 18)
Console.Write(number & " ")
Next
Console.WriteLine()
' Output: 6 8 10 12 14 16 18
End Sub

Private Iterator Function EvenSequence(


ByVal firstNumber As Integer, ByVal lastNumber As Integer) _
As IEnumerable(Of Integer)

' Yield even numbers in the range.


For number = firstNumber To lastNumber
If number Mod 2 = 0 Then
Yield number
End If
Next
End Function

Vedi anche
Inizializzatori di insieme
Concetti di programmazione (Visual Basic)
Option Strict Statement
LINQ to Objects (Visual Basic)
Parallel LINQ (PLINQ)
Raccolte e strutture di dati
Selezione di una classe Collection
Confronti e ordinamenti all'interno delle raccolte
Quando usare le raccolte generiche
Covarianza e controvarianza (Visual Basic)
05/03/2021 • 5 minutes to read • Edit Online

In Visual Basic, covarianza e controvarianza abilitano la conversione implicita del riferimento per i tipi di matrice,
i tipi delegati e gli argomenti di tipo generico. La covarianza mantiene la compatibilità dell'assegnazione e la
controvarianza la inverte.
Il codice seguente illustra la differenza tra la compatibilità dell'assegnazione, covarianza e controvarianza.

' Assignment compatibility.


Dim str As String = "test"
' An object of a more derived type is assigned to an object of a less derived type.
Dim obj As Object = str

' Covariance.
Dim strings As IEnumerable(Of String) = New List(Of String)()
' An object that is instantiated with a more derived type argument
' is assigned to an object instantiated with a less derived type argument.
' Assignment compatibility is preserved.
Dim objects As IEnumerable(Of Object) = strings

' Contravariance.
' Assume that there is the following method in the class:
' Shared Sub SetObject(ByVal o As Object)
' End Sub
Dim actObject As Action(Of Object) = AddressOf SetObject

' An object that is instantiated with a less derived type argument


' is assigned to an object instantiated with a more derived type argument.
' Assignment compatibility is reversed.
Dim actString As Action(Of String) = actObject

La covarianza per le matrici consente la conversione implicita di una matrice di un tipo più derivato in una
matrice di un tipo meno derivato. Ma questa operazione non è indipendente dai tipi, come illustrato
nell'esempio di codice seguente.

Dim array() As Object = New String(10) {}


' The following statement produces a run-time exception.
' array(0) = 10

Il supporto di covarianza e controvarianza per i gruppi di metodi consente la corrispondenza delle firme del
metodo con i tipi delegati. Ciò consente di assegnare ai delegati non solo i metodi con firme corrispondenti, ma
anche i metodi che restituiscono più tipi derivati (covarianza) o accettano parametri con meno tipi derivati
(controvarianza) rispetto a quelli specificati dal tipo delegato. Per altre informazioni, vedere Varianza nei delegati
(Visual Basic) e Uso della varianza nei delegati (Visual Basic).
L'esempio di codice seguente illustra il supporto di covarianza e controvarianza per i gruppi di metodi.
Shared Function GetObject() As Object
Return Nothing
End Function

Shared Sub SetObject(ByVal obj As Object)


End Sub

Shared Function GetString() As String


Return ""
End Function

Shared Sub SetString(ByVal str As String)

End Sub

Shared Sub Test()


' Covariance. A delegate specifies a return type as object,
' but you can assign a method that returns a string.
Dim del As Func(Of Object) = AddressOf GetString

' Contravariance. A delegate specifies a parameter type as string,


' but you can assign a method that takes an object.
Dim del2 As Action(Of String) = AddressOf SetObject
End Sub

In .NET Framework 4 o versioni successive Visual Basic supporta la covarianza e la controvarianza nelle
interfacce e nei delegati generici e consente la conversione implicita di parametri di tipo generico. Per altre
informazioni, vedere Varianza nelle interfacce generiche (Visual Basic) e Varianza nei delegati (Visual Basic).
L'esempio di codice seguente illustra la conversione implicita del riferimento per le interfacce generiche.

Dim strings As IEnumerable(Of String) = New List(Of String)


Dim objects As IEnumerable(Of Object) = strings

Le interfacce o i delegati generici sono detti varianti se i relativi parametri generici vengono dichiarati come
covarianti o controvarianti. Visual Basic consente di creare i propri delegati e interfacce varianti. Per altre
informazioni, vedere Creazione di interfacce generiche varianti (Visual Basic) e Varianza nei delegati (Visual
Basic).

Argomenti correlati
T ITO LO DESC RIZ IO N E

Varianza nelle interfacce generiche (Visual Basic) Illustra la covarianza e la controvarianza nelle interfacce
generiche e fornisce un elenco di interfacce generiche variant
in .NET Framework.

Creazione di interfacce generiche varianti (Visual Basic) Spiega come creare interfacce varianti personalizzate.

Uso della varianza nelle interfacce per le raccolte generiche Spiega come il supporto di covarianza e controvarianza nelle
(Visual Basic) interfacce IEnumerable<T> e IComparable<T> consente di
riutilizzare il codice.

Varianza nei delegati (Visual Basic) Illustra la covarianza e la controvarianza nei delegati generici
e non generici e offre un elenco di delegati generici varianti
in .NET Framework.
T ITO LO DESC RIZ IO N E

Uso della varianza nei delegati (Visual Basic) Spiega come usare il supporto di covarianza e
controvarianza nei delegati non generici per la
corrispondenza delle firme del metodo con i tipi delegati.

Utilizzo della varianza per i delegati generici Func e Action Spiega come il supporto di covarianza e controvarianza nei
(Visual Basic) delegati Func e Action consente di riutilizzare il codice.
Alberi delle espressioni (Visual Basic)
05/03/2021 • 8 minutes to read • Edit Online

Gli alberi delle espressioni rappresentano codice in una struttura dei dati simile a un albero, dove ogni nodo è
un'espressione, ad esempio una chiamata al metodo o un'operazione binaria come x < y .
È possibile compilare ed eseguire codice rappresentato dagli alberi delle espressioni. In questo modo è possibile
modificare dinamicamente codice eseguibile, eseguire query LINQ in vari database e creare query dinamiche.
Per altre informazioni sugli alberi delle espressioni in LINQ, vedere How to: Use Expression Trees to Build
Dynamic Queries (Visual Basic) (Procedura: Usare alberi delle espressioni per creare query dinamiche (Visual
Basic)).
Gli alberi delle espressioni sono anche usati in Dynamic Language Runtime (DLR) per fornire interoperabilità tra
linguaggi dinamici e .NET Framework e per consentire ai writer dei compilatori di creare alberi delle espressioni
invece di codice MSIL (Microsoft Intermediate Language). Per altre informazioni su DLR, vedere Dynamic
Language Runtime Overview (Panoramica su Dynamic Language Runtime).
È possibile creare un albero delle espressioni tramite il compilatore di C# o di Visual Basic in base a
un'espressione lambda anonima o creare tali alberi di espressioni manualmente tramite il nome spazio
System.Linq.Expressions.

Creazione di alberi delle espressioni da espressioni lambda


Quando un'espressione lambda viene assegnata a una variabile di tipo Expression<TDelegate>, il compilatore
genera codice per compilare un albero delle espressioni che rappresenta l'espressione lambda.
Il compilatore di Visual Basic può generare alberi delle espressioni solo da espressioni lambda, o lambda su una
sola riga. Non possono analizzare espressioni lambda dell'istruzione (o le espressioni lambda a più righe). Per
altre informazioni sulle espressioni lambda in Visual Basic, vedere Espressioni lambda.
Gli esempi di codice seguenti illustrano in che modo il compilatore di Visual Basic crea un albero delle
espressioni che rappresenta l'espressione lambda Function(num) num < 5 .

Dim lambda As Expression(Of Func(Of Integer, Boolean)) =


Function(num) num < 5

Creazione di alberi delle espressioni tramite l'API


Per creare alberi delle espressioni tramite l'API, usare la classe Expression. Questa classe contiene metodi factory
statici che creano nodi degli alberi delle espressioni di tipi specifici, ad esempio ParameterExpression, che
rappresenta una variabile o un parametro, o MethodCallExpression, che rappresenta una chiamata al metodo.
Anche ParameterExpression, MethodCallExpression e gli altri tipi specifici delle espressioni sono definiti nello
spazio dei nomi System.Linq.Expressions. Questi tipi derivano dal tipo astratto Expression.
L'esempio di codice seguente illustra come creare un albero delle espressioni che rappresenti l'espressione
lambda Function(num) num < 5 usando l'API.
' Import the following namespace to your project: System.Linq.Expressions

' Manually build the expression tree for the lambda expression num => num < 5.
Dim numParam As ParameterExpression = Expression.Parameter(GetType(Integer), "num")
Dim five As ConstantExpression = Expression.Constant(5, GetType(Integer))
Dim numLessThanFive As BinaryExpression = Expression.LessThan(numParam, five)
Dim lambda1 As Expression(Of Func(Of Integer, Boolean)) =
Expression.Lambda(Of Func(Of Integer, Boolean))(
numLessThanFive,
New ParameterExpression() {numParam})

In .NET Framework 4 o nelle versioni successive l'API degli alberi delle espressioni supporta anche assegnazioni
ed espressioni del flusso di controllo quali cicli, blocchi condizionali e blocchi try-catch . Tramite l'API è
possibile creare alberi delle espressioni più complessi rispetto a quelli che è possibile creare da espressioni
lambda tramite il compilatore di Visual Basic. L'esempio seguente illustra come creare un albero delle
espressioni che calcola il fattoriale di un numero.

' Creating a parameter expression.


Dim value As ParameterExpression =
Expression.Parameter(GetType(Integer), "value")

' Creating an expression to hold a local variable.


Dim result As ParameterExpression =
Expression.Parameter(GetType(Integer), "result")

' Creating a label to jump to from a loop.


Dim label As LabelTarget = Expression.Label(GetType(Integer))

' Creating a method body.


Dim block As BlockExpression = Expression.Block(
New ParameterExpression() {result},
Expression.Assign(result, Expression.Constant(1)),
Expression.Loop(
Expression.IfThenElse(
Expression.GreaterThan(value, Expression.Constant(1)),
Expression.MultiplyAssign(result,
Expression.PostDecrementAssign(value)),
Expression.Break(label, result)
),
label
)
)

' Compile an expression tree and return a delegate.


Dim factorial As Integer =
Expression.Lambda(Of Func(Of Integer, Integer))(block, value).Compile()(5)

Console.WriteLine(factorial)
' Prints 120.

Per altre informazioni, vedere l'articolo Generating Dynamic Methods with Expression Trees in Visual Studio
2010 (Generazione di metodi dinamici con alberi delle espressioni in Visual Studio 2010), valido anche per le
versioni successive di Visual Studio.

Analisi degli alberi delle espressioni


L'esempio di codice seguente illustra come scomporre nei vari componenti l'albero delle espressioni che
rappresenta l'espressione lambda Function(num) num < 5 .
' Import the following namespace to your project: System.Linq.Expressions

' Create an expression tree.


Dim exprTree As Expression(Of Func(Of Integer, Boolean)) = Function(num) num < 5

' Decompose the expression tree.


Dim param As ParameterExpression = exprTree.Parameters(0)
Dim operation As BinaryExpression = exprTree.Body
Dim left As ParameterExpression = operation.Left
Dim right As ConstantExpression = operation.Right

Console.WriteLine(String.Format("Decomposed expression: {0} => {1} {2} {3}",


param.Name, left.Name, operation.NodeType, right.Value))

' This code produces the following output:


'
' Decomposed expression: num => num LessThan 5

Non modificabilità degli alberi delle espressioni


Gli alberi delle espressioni devono essere non modificabili. Ciò significa che per modificare un albero delle
espressioni è necessario costruirne uno nuovo copiando quello esistente e sostituendone i nodi. È possibile
usare un visitatore dell'albero delle espressioni per attraversare l'albero delle espressioni esistente. Per altre
informazioni, vedere How to: Modify Expression Trees (Visual Basic) (Procedura: Modificare alberi delle
espressioni (Visual Basic)).

Compilazione degli alberi delle espressioni


Il tipo Expression<TDelegate> fornisce il metodo Compile che compila il codice rappresentato da un albero delle
espressioni in un delegato eseguibile.
L'esempio di codice seguente illustra come compilare un albero delle espressioni ed eseguire il codice risultante.

' Creating an expression tree.


Dim expr As Expression(Of Func(Of Integer, Boolean)) =
Function(num) num < 5

' Compiling the expression tree into a delegate.


Dim result As Func(Of Integer, Boolean) = expr.Compile()

' Invoking the delegate and writing the result to the console.
Console.WriteLine(result(4))

' Prints True.

' You can also use simplified syntax


' to compile and run an expression tree.
' The following line can replace two previous statements.
Console.WriteLine(expr.Compile()(4))

' Also prints True.

Per altre informazioni, vedere How to: Execute Expression Trees (Visual Basic) (Procedura: Eseguire alberi delle
espressioni (Visual Basic)).

Vedi anche
System.Linq.Expressions
How to: Execute Expression Trees (Visual Basic) (Procedura: Eseguire alberi delle espressioni (Visual Basic))
How to: Modify Expression Trees (Visual Basic) (Procedura: Modificare alberi delle espressioni (Visual Basic)).
Espressioni lambda
Panoramica di Dynamic Language Runtime
Concetti di programmazione (Visual Basic)
Iteratori [Visual Basic]
05/03/2021 • 16 minutes to read • Edit Online

Un iteratore può essere usato per scorrere le raccolte come gli elenchi e le matrici.
Un metodo iteratore o funzione di accesso get esegue un'iterazione personalizzata su una raccolta. Un metodo
iteratore usa l'istruzione yield per restituire un elemento alla volta. Quando viene raggiunta un'istruzione Yield
, la posizione corrente nel codice viene memorizzata. L'esecuzione viene riavviata a partire da quella posizione la
volta successiva che viene chiamata la funzione iteratore.
Si utilizza un iteratore dal codice client utilizzando un per ogni... Istruzione Next oppure tramite una query LINQ.
Nell'esempio seguente, la prima iterazione del ciclo For Each fa procedere l'esecuzione nel metodo iteratore
SomeNumbers fino al raggiungimento della prima istruzione Yield . Questa iterazione restituisce un valore pari a
3 e viene mantenuta la posizione corrente nel metodo iteratore. All'iterazione successiva del ciclo, l'esecuzione
nel metodo iteratore continua da dove è stata interrotta, fermandosi ancora quando raggiunge un'istruzione
Yield . Questa iterazione restituisce un valore pari a 5 e viene ancora mantenuta la posizione corrente nel
metodo iteratore. Il ciclo termina quando si raggiunge la fine del metodo iteratore.

Sub Main()
For Each number As Integer In SomeNumbers()
Console.Write(number & " ")
Next
' Output: 3 5 8
Console.ReadKey()
End Sub

Private Iterator Function SomeNumbers() As System.Collections.IEnumerable


Yield 3
Yield 5
Yield 8
End Function

Il tipo restituito di un metodo iteratore o di una funzione di accesso get può essere IEnumerable,
IEnumerable<T>, IEnumerator o IEnumerator<T>.
È possibile utilizzare un' Exit Function Return istruzione o per terminare l'iterazione.
Una Visual Basic funzione iteratore o una get dichiarazione di funzione di accesso include un modificatore
iteratore .
Gli iteratori sono stati introdotti in Visual Basic in Visual Studio 2012.
Contenuto dell'argomento
Iteratore semplice
Creazione di una classe Collection
Blocchi try
Metodi anonimi
Uso degli iteratori con un elenco generico
Informazioni sulla sintassi
Implementazione tecnica
Uso degli iteratori

NOTE
Per tutti gli esempi nell'argomento eccetto l'esempio iteratore semplice, includere le istruzioni Imports per gli
System.Collections System.Collections.Generic spazi dei nomi e.

Iteratore semplice
Nell'esempio seguente è presente una singola Yield istruzione che si trova all'interno di un oggetto per... Ciclo
successivo . In Main ogni iterazione del corpo dell'istruzione For Each crea una chiamata alla funzione
iteratore, che procede all'istruzione Yield successiva.

Sub Main()
For Each number As Integer In EvenSequence(5, 18)
Console.Write(number & " ")
Next
' Output: 6 8 10 12 14 16 18
Console.ReadKey()
End Sub

Private Iterator Function EvenSequence(


ByVal firstNumber As Integer, ByVal lastNumber As Integer) _
As System.Collections.Generic.IEnumerable(Of Integer)

' Yield even numbers in the range.


For number As Integer = firstNumber To lastNumber
If number Mod 2 = 0 Then
Yield number
End If
Next
End Function

Creazione di una classe Collection


Nell'esempio seguente la classe DaysOfTheWeek implementa l'interfaccia IEnumerable, che richiede un metodo
GetEnumerator. Il compilatore chiama implicitamente il metodo GetEnumerator , che restituisce un IEnumerator.
Il GetEnumerator metodo restituisce ogni stringa una alla volta utilizzando l' Yield istruzione e un Iterator
modificatore si trova nella dichiarazione di funzione.
Sub Main()
Dim days As New DaysOfTheWeek()
For Each day As String In days
Console.Write(day & " ")
Next
' Output: Sun Mon Tue Wed Thu Fri Sat
Console.ReadKey()
End Sub

Private Class DaysOfTheWeek


Implements IEnumerable

Public days =
New String() {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}

Public Iterator Function GetEnumerator() As IEnumerator _


Implements IEnumerable.GetEnumerator

' Yield each day of the week.


For i As Integer = 0 To days.Length - 1
Yield days(i)
Next
End Function
End Class

Nell'esempio seguente viene creata una classe Zoo che contiene una raccolta di animali.
L'istruzione For Each che fa riferimento all'istanza della classe ( theZoo ) chiama implicitamente il metodo
GetEnumerator . Le istruzioni For Each che fanno riferimento alle proprietà Birds e Mammals usano il metodo
iteratore denominato AnimalsForType .

Sub Main()
Dim theZoo As New Zoo()

theZoo.AddMammal("Whale")
theZoo.AddMammal("Rhinoceros")
theZoo.AddBird("Penguin")
theZoo.AddBird("Warbler")

For Each name As String In theZoo


Console.Write(name & " ")
Next
Console.WriteLine()
' Output: Whale Rhinoceros Penguin Warbler

For Each name As String In theZoo.Birds


Console.Write(name & " ")
Next
Console.WriteLine()
' Output: Penguin Warbler

For Each name As String In theZoo.Mammals


Console.Write(name & " ")
Next
Console.WriteLine()
' Output: Whale Rhinoceros

Console.ReadKey()
End Sub

Public Class Zoo


Implements IEnumerable

' Private members.


Private animals As New List(Of Animal)
' Public methods.
Public Sub AddMammal(ByVal name As String)
animals.Add(New Animal With {.Name = name, .Type = Animal.TypeEnum.Mammal})
End Sub

Public Sub AddBird(ByVal name As String)


animals.Add(New Animal With {.Name = name, .Type = Animal.TypeEnum.Bird})
End Sub

Public Iterator Function GetEnumerator() As IEnumerator _


Implements IEnumerable.GetEnumerator

For Each theAnimal As Animal In animals


Yield theAnimal.Name
Next
End Function

' Public members.


Public ReadOnly Property Mammals As IEnumerable
Get
Return AnimalsForType(Animal.TypeEnum.Mammal)
End Get
End Property

Public ReadOnly Property Birds As IEnumerable


Get
Return AnimalsForType(Animal.TypeEnum.Bird)
End Get
End Property

' Private methods.


Private Iterator Function AnimalsForType( _
ByVal type As Animal.TypeEnum) As IEnumerable
For Each theAnimal As Animal In animals
If (theAnimal.Type = type) Then
Yield theAnimal.Name
End If
Next
End Function

' Private class.


Private Class Animal
Public Enum TypeEnum
Bird
Mammal
End Enum

Public Property Name As String


Public Property Type As TypeEnum
End Class
End Class

Blocchi try
Visual Basic consente a un' Yield istruzione nel Try blocco di un'istruzione try... Rileva... Istruzione finally. Un
Try blocco con un' Yield istruzione può contenere Catch blocchi e può avere un Finally blocco.

Nell'esempio seguente sono inclusi i Try Catch blocchi, e Finally in una funzione iteratore. Il Finally
blocco nella funzione iteratore viene eseguito prima del For Each completamento dell'iterazione.
Sub Main()
For Each number As Integer In Test()
Console.WriteLine(number)
Next
Console.WriteLine("For Each is done.")

' Output:
' 3
' 4
' Something happened. Yields are done.
' Finally is called.
' For Each is done.
Console.ReadKey()
End Sub

Private Iterator Function Test() As IEnumerable(Of Integer)


Try
Yield 3
Yield 4
Throw New Exception("Something happened. Yields are done.")
Yield 5
Yield 6
Catch ex As Exception
Console.WriteLine(ex.Message)
Finally
Console.WriteLine("Finally is called.")
End Try
End Function

Un' Yield istruzione non può trovarsi all'interno di un Catch blocco o di un Finally blocco.
Se il For Each corpo (anziché il metodo iteratore) genera un'eccezione, un Catch blocco nella funzione
iteratore non viene eseguito, ma Finally viene eseguito un blocco nella funzione iteratore. Un Catch blocco
all'interno di una funzione iteratore intercetta solo le eccezioni che si verificano all'interno della funzione
iteratore.

Metodi anonimi
In Visual Basic, una funzione anonima può essere una funzione iteratore. Questa condizione è illustrata
nell'esempio seguente.

Dim iterateSequence = Iterator Function() _


As IEnumerable(Of Integer)
Yield 1
Yield 2
End Function

For Each number As Integer In iterateSequence()


Console.Write(number & " ")
Next
' Output: 1 2
Console.ReadKey()

Nell'esempio seguente viene utilizzato un metodo non iteratore per la convalida degli argomenti. Il metodo
restituisce il risultato di un iteratore anonimo che descrive gli elementi della raccolta.
Sub Main()
For Each number As Integer In GetSequence(5, 10)
Console.Write(number & " ")
Next
' Output: 5 6 7 8 9 10
Console.ReadKey()
End Sub

Public Function GetSequence(ByVal low As Integer, ByVal high As Integer) _


As IEnumerable
' Validate the arguments.
If low < 1 Then
Throw New ArgumentException("low is too low")
End If
If high > 140 Then
Throw New ArgumentException("high is too high")
End If

' Return an anonymous iterator function.


Dim iterateSequence = Iterator Function() As IEnumerable
For index = low To high
Yield index
Next
End Function
Return iterateSequence()
End Function

Se la convalida è invece all'interno della funzione iteratore, la convalida non può essere eseguita fino all'inizio
della prima iterazione del For Each corpo.

Uso di iteratori con un elenco generico


Nell'esempio seguente la classe generica Stack(Of T) implementa l'interfaccia generica IEnumerable<T>. Il
metodo Push assegna valori a una matrice di tipo T . Il metodo GetEnumerator restituisce i valori della matrice
tramite l'istruzione Yield .
Oltre al metodo GetEnumerator generico, è necessario implementare anche il metodo GetEnumerator non
generico, poiché IEnumerable<T> eredita da IEnumerable. L'implementazione non generica rinvia
all'implementazione generica.
L'esempio usa iteratori denominati per supportare diversi modi di iterazione nella stessa raccolta dati. Questi
iteratori denominati sono le proprietà TopToBottom e BottomToTop e il metodo TopN .
La BottomToTop dichiarazione di proprietà include la Iterator parola chiave.

Sub Main()
Dim theStack As New Stack(Of Integer)

' Add items to the stack.


For number As Integer = 0 To 9
theStack.Push(number)
Next

' Retrieve items from the stack.


' For Each is allowed because theStack implements
' IEnumerable(Of Integer).
For Each number As Integer In theStack
Console.Write("{0} ", number)
Next
Console.WriteLine()
' Output: 9 8 7 6 5 4 3 2 1 0

' For Each is allowed, because theStack.TopToBottom


' For Each is allowed, because theStack.TopToBottom
' returns IEnumerable(Of Integer).
For Each number As Integer In theStack.TopToBottom
Console.Write("{0} ", number)
Next
Console.WriteLine()
' Output: 9 8 7 6 5 4 3 2 1 0

For Each number As Integer In theStack.BottomToTop


Console.Write("{0} ", number)
Next
Console.WriteLine()
' Output: 0 1 2 3 4 5 6 7 8 9

For Each number As Integer In theStack.TopN(7)


Console.Write("{0} ", number)
Next
Console.WriteLine()
' Output: 9 8 7 6 5 4 3

Console.ReadKey()
End Sub

Public Class Stack(Of T)


Implements IEnumerable(Of T)

Private values As T() = New T(99) {}


Private top As Integer = 0

Public Sub Push(ByVal t As T)


values(top) = t
top = top + 1
End Sub

Public Function Pop() As T


top = top - 1
Return values(top)
End Function

' This function implements the GetEnumerator method. It allows


' an instance of the class to be used in a For Each statement.
Public Iterator Function GetEnumerator() As IEnumerator(Of T) _
Implements IEnumerable(Of T).GetEnumerator

For index As Integer = top - 1 To 0 Step -1


Yield values(index)
Next
End Function

Public Iterator Function GetEnumerator1() As IEnumerator _


Implements IEnumerable.GetEnumerator

Yield GetEnumerator()
End Function

Public ReadOnly Property TopToBottom() As IEnumerable(Of T)


Get
Return Me
End Get
End Property

Public ReadOnly Iterator Property BottomToTop As IEnumerable(Of T)


Get
For index As Integer = 0 To top - 1
Yield values(index)
Next
End Get
End Property

Public Iterator Function TopN(ByVal itemsFromTop As Integer) _


Public Iterator Function TopN(ByVal itemsFromTop As Integer) _
As IEnumerable(Of T)

' Return less than itemsFromTop if necessary.


Dim startIndex As Integer =
If(itemsFromTop >= top, 0, top - itemsFromTop)

For index As Integer = top - 1 To startIndex Step -1


Yield values(index)
Next
End Function
End Class

Informazioni sulla sintassi


Un iteratore può verificarsi come metodo o funzione di accesso get . Un iteratore non può verificarsi in un
evento, costruttore di istanza, costruttore statico o distruttore statico.
Deve esistere una conversione implicita dal tipo di espressione nell'istruzione Yield al tipo restituito
dell'iteratore.
In Visual Basic, un metodo iteratore non può avere ByRef parametri.
In Visual Basic, "yield" non è una parola riservata e ha un significato speciale solo quando viene usato in un
Iterator metodo o una get funzione di accesso.

Implementazione tecnica
Anche se si scrive un iteratore come metodo, il compilatore lo traduce in una classe annidata che, in pratica, è
una macchina a stati. Questa classe tiene traccia della posizione dell'iteratore purché il ciclo For Each...Next nel
codice client sia continuo.
Per verificare le operazioni eseguite dal compilatore, è possibile usare lo strumento Ildsam.exe per visualizzare il
codice Microsoft Intermediate Language generato per un metodo iteratore.
Quando si crea un iteratore per una classe o uno struct, non è necessario implementare l'intera IEnumerator
interfaccia. Quando il compilatore rileva l'iteratore, genera automaticamente i metodi Current , MoveNext e
Dispose dell'interfaccia IEnumerator o IEnumerator<T>.

In ogni iterazione successiva del ciclo For Each…Next (o alla chiamata diretta a IEnumerator.MoveNext ), il corpo di
codice iteratore successivo riprende dopo la precedente istruzione Yield . Continua quindi con l'istruzione
successiva Yield fino a quando non viene raggiunta la fine del corpo dell'iteratore o fino a quando non
Exit Function Return viene rilevata un'istruzione o.

Gli iteratori non supportano il IEnumerator.Reset metodo. Per eseguire di nuovo l'iterazione dall'inizio, è
necessario ottenere un nuovo iteratore.
Per ulteriori informazioni, vedere la specifica del linguaggio Visual Basic.

Uso degli iteratori


Gli iteratori consentono di mantenere la semplicità di un ciclo For Each quando è necessario usare codice
complesso per popolare una sequenza di elenco. Ciò può risultare utile per eseguire le operazioni seguenti:
Modificare la sequenza di elenco dopo la prima iterazione del ciclo For Each .
Evitare il caricamento completo di un elenco di grandi dimensioni prima della prima iterazione di un ciclo
For Each . Un esempio è un'operazione di recupero di paging per caricare un batch di righe della tabella.
Un altro esempio è il metodo EnumerateFiles, che implementa gli iteratori all'interno di .NET Framework.
Incapsulare la generazione dell'elenco nell'iteratore. Nel metodo iteratore è possibile compilare l'elenco e
restituire quindi ogni risultato in un ciclo.

Vedi anche
System.Collections.Generic
IEnumerable<T>
Istruzione For Each...Next
Istruzione Yield
Iterator
LINQ (Language-Integrated Query) (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

LINQ rappresenta un set di funzionalità che estende le potenti funzionalità di query alla sintassi del linguaggio
Visual Basic. In LINQ sono stati introdotti modelli standard e di facile uso per l'esecuzione delle query e
l'aggiornamento dei dati e la tecnologia può essere estesa in modo da supportare potenzialmente qualsiasi tipo
di archivio dati. .NET Framework include assembly del provider LINQ che consentono l'uso di LINQ con le
raccolte di .NET Framework, i database di SQL Server, i dataset ADO.NET e i documenti XML.

Contenuto della sezione


Introduzione a LINQ (Visual Basic)
Offre un'introduzione generale ai tipi di applicazioni che possono essere scritti e ai tipi di problemi che possono
essere risolti con le query LINQ.
Introduzione a LINQ in Visual Basic
Vengono descritti i fatti di base che è necessario conoscere per capire la documentazione e gli esempi di Visual
Basic.
IDE di Visual Studio e supporto di strumenti per LINQ (Visual Basic)
Descrive lo strumento Object Relational Designer di Visual Studio, il supporto del debugger per le query e altre
funzionalità IDE correlate a LINQ.
Panoramica degli operatori query standard (Visual Basic)
Viene fornita un'introduzione agli operatori di query standard. Vengono inoltre forniti collegamenti ad
argomenti contenenti ulteriori informazioni su ogni tipo di operazione di query.
LINQ to Objects (Visual Basic)
Include collegamenti ad argomenti che spiegano come usare LINQ to Objects per accedere a strutture dei dati in
memoria.
LINQ to XML (Visual Basic)
Include collegamenti ad argomenti che spiegano come usare LINQ, che offre le funzionalità di modifica dei
documenti in memoria del Document Object Model (DOM) e supporta le espressioni di query di LINQ.
LINQ to ADO.NET (pagina portale)
Offre un punto di ingresso per la documentazione relativa a LINQ to DataSet, LINQ to SQL e LINQ to Entities.
LINQ consente di compilare funzionalità di esecuzione di query più complesse nell'oggetto DataSet usando la
stessa funzionalità di query disponibile per altre origini dati. LINQ to SQL offre un'infrastruttura di runtime per
la gestione di dati relazionali come oggetti. LINQ to Entities consente agli sviluppatori di scrivere query sul
modello concettuale di Entity Framework usando C#.
Abilitazione di un'origine dati per l'esecuzione di query LINQ
Introduzione ai provider LINQ personalizzati, agli alberi delle espressioni di LINQ e ad altri modi per estendere
LINQ.
Programmazione orientata a oggetti (Visual Basic)
05/03/2021 • 19 minutes to read • Edit Online

Visual Basic offre supporto completo per la programmazione orientata a oggetti, inclusi incapsulamento,
ereditarietà e polimorfismo.
L'incapsulamento indica che un gruppo di proprietà, metodi e altri membri correlati vengono considerati come
una singola unità o un singolo oggetto.
L'ereditarietà indica la capacità di creare nuove classi sulla base di una classe esistente.
Il polimorfismo indica la capacità di usare più classi in modo intercambiabile, anche se in ognuna di esse le
stesse proprietà o gli stessi metodi sono implementati in modi diversi.
In questa sezione vengono descritti i concetti seguenti:
Classi e oggetti
Membri di classe
Proprietà e campi
Metodi
Costruttori
Distruttori
Eventi
Classi annidate
Modificatori di accesso e livelli di accesso
Creazione di istanze di classi
Classi e membri condivisi
Tipi anonimi
Ereditarietà
Override di membri
Interfacce
Generics
Delegati

Classi e oggetti
I termini classe e oggetto vengono talvolta usati in modo intercambiabile. Di fatto, però, le classi descrivono il
tipo degli oggetti, mentre gli oggetti sono istanze utilizzabili delle classi. L'atto di creare un oggetto viene
pertanto chiamato creazione di istanze. Rifacendoci all'analogia precedente, la classe corrisponde al progetto
iniziale e l'oggetto all'edificio realizzato in base a tale progetto.
Per definire una classe:

Class SampleClass
End Class

Visual Basic fornisce anche una versione ridotta delle classi chiamate strutture utili quando è necessario creare
una matrice di grandi dimensioni di oggetti e non si desidera utilizzare una quantità eccessiva di memoria.
Per definire una struttura:
Structure SampleStructure
End Structure

Per altre informazioni, vedere:


Istruzione Class
Istruzione Structure
Membri di classe
Ogni classe può avere membri di classe diversi che includono proprietà che descrivono i dati della classe, i
metodi che definiscono il comportamento della classe e gli eventi che offrono la comunicazione tra classi e
oggetti diversi.
Proprietà e campi
I campi e le proprietà rappresentano le informazioni contenute in un oggetto. I campi sono simili a variabili in
quanto possono essere letti o impostati direttamente.
Per definire un campo:

Class SampleClass
Public SampleField As String
End Class

Le proprietà dispongono di routine Get e Set, che forniscono un maggiore controllo sul modo in cui i valori
vengono impostati o restituiti.
Visual Basic consente di creare un campo privato per archiviare il valore della proprietà o utilizzare le cosiddette
proprietà implementate automaticamente che creano questo campo automaticamente dietro le quinte e
forniscono la logica di base per le routine della proprietà.
Per definire una proprietà implementata automaticamente:

Class SampleClass
Public Property SampleProperty as String
End Class

Se è necessario eseguire alcune operazioni aggiuntive per la lettura e la scrittura del valore della proprietà,
definire un campo per archiviare il valore della proprietà e fornire la logica di base per archiviarlo e recuperarlo:

Class SampleClass
Private m_Sample As String
Public Property Sample() As String
Get
' Return the value stored in the field.
Return m_Sample
End Get
Set(ByVal Value As String)
' Store the value in the field.
m_Sample = Value
End Set
End Property
End Class

La maggior parte delle proprietà dispone di metodi o di routine per impostare e ottenere il valore della
proprietà. È possibile, tuttavia, creare proprietà di sola lettura o di sola scrittura per impedirne la modifica o la
lettura. In Visual Basic è possibile utilizzare le parole chiave ReadOnly e WriteOnly . Tuttavia, le proprietà
implementate automaticamente non possono essere di sola lettura o di sola scrittura.
Per altre informazioni, vedere:
Property Statement
Istruzione Get
Istruzione set
ReadOnly
WriteOnly
Metodi
Un metodo è un'azione che può essere eseguita da un oggetto.

NOTE
In Visual Basic, è possibile creare un metodo in due modi: se il metodo non restituisce un valore, viene utilizzata
l'istruzione Sub , se invece un metodo restituisce un valore, viene utilizzata l'istruzione Function .

Per definire un metodo di una classe:

Class SampleClass
Public Function SampleFunc(ByVal SampleParam As String)
' Add code here
End Function
End Class

Una classe può disporre di diverse implementazioni, o overload, dello stesso metodo che differiscono per il
numero di parametri o per i tipi di parametro.
Per essere in rapporto di overload con un metodo:

Overloads Sub Display(ByVal theChar As Char)


' Add code that displays Char data.
End Sub
Overloads Sub Display(ByVal theInteger As Integer)
' Add code that displays Integer data.
End Sub

Nella maggior parte dei casi si dichiara un metodo all'interno di una definizione della classe. Tuttavia, Visual
Basic supporta anche metodi di estensione che consentono di aggiungere metodi a una classe esistente al di
fuori della definizione effettiva della classe.
Per altre informazioni, vedere:
Istruzione Function
Istruzione Sub
Overload
Metodi di estensione
Costruttori
I costruttori sono metodi di classe che vengono eseguiti automaticamente durante la creazione di un oggetto di
un tipo specifico. I costruttori in genere inizializzano i membri dati del nuovo oggetto. Un costruttore può essere
eseguito solo una volta alla creazione di una classe. Inoltre, il codice nel costruttore viene sempre eseguito prima
di qualsiasi altro codice in una classe. Tuttavia, è possibile creare più overload del costruttore esattamente come
per qualsiasi altro metodo.
Per definire un costruttore per una classe:

Class SampleClass
Sub New(ByVal s As String)
// Add code here.
End Sub
End Class

Per ulteriori informazioni, vedere la pagina relativa alla durata degli oggetti: come creare ed eliminare
definitivamente oggetti.
Distruttori
I distruttori sono utilizzati per distruggere istanze di classi. In .NET Framework, il Garbage Collector gestisce
l'allocazione e il rilascio di memoria per gli oggetti gestiti di un'applicazione. Potrebbero, tuttavia, essere
necessari distruttori per pulire eventuali risorse non gestite create dall'applicazione. Può esistere un solo
distruttore per classe.
Per altre informazioni sui distruttori e sull'operazione di Garbage Collection in .NET Framework, vedere Garbage
Collection.
Eventi
Tramite gli eventi una classe o un oggetto sono in grado di segnalare ad altre classi o oggetti una situazione di
interesse. La classe che invia o genera l'evento è chiamata editore e le classi che ricevono o gestiscono l'evento
sono chiamate sottoscrittori. Per altre informazioni sugli eventi e sulla loro generazione e gestione, vedere
Eventi.
Per dichiarare gli eventi, utilizzare l' istruzione Event.
Per generare eventi, utilizzare l' istruzione RaiseEvent.
Per specificare i gestori eventi utilizzando una modalità dichiarativa, utilizzare l'istruzione WithEvents e la
clausola Handles .
Per essere in grado di aggiungere, rimuovere e modificare dinamicamente il gestore eventi associato a un
evento, utilizzare l' istruzione AddHandler e l' istruzione RemoveHandler insieme all' operatore
AddressOf.
Classi annidate
Una classe definita all'interno di un'altra classe è denominata annidata. Per impostazione predefinita, la classe
annidata è privata.

Class Container
Class Nested
' Add code here.
End Class
End Class

Per creare un'istanza della classe annidata, utilizzare il nome della classe dei contenitori seguita dal punto, quindi
dal nome della classe annidata:

Dim nestedInstance As Container.Nested = New Container.Nested()

Modificatori di accesso e livelli di accesso


Tutte le classi e i membri della classe possono specificare il livello di accesso offerto alle altre classi usando i
modificatori di accesso.
Sono disponibili i seguenti modificatori di accesso:
M O DIF IC ATO RE DI VISUA L B A SIC DEF IN IZ IO N E

Pubblica Il tipo o il membro è accessibile da altro codice nello stesso


assembly o in un altro assembly che vi fa riferimento.

Privata Il tipo o il membro è accessibile solo dal codice nella stessa


classe.

Protetto Il tipo o il membro è accessibile solo dal codice nella stessa


classe o in una classe derivata.

Friend Il tipo o il membro è accessibile dal codice nello stesso


assembly ma non da un altro assembly.

Protected Friend Il tipo o il membro è accessibile dal codice nello stesso


assembly o da una classe derivata in un altro assembly.

Per altre informazioni, vedere livelli di accesso in Visual Basic.


Creazione di istanze di classi
Per creare un oggetto, è necessario creare un'istanza di una classe.

Dim sampleObject as New SampleClass()

Dopo avere creato un'istanza di una classe, è possibile assegnare i valori alle proprietà e ai campi dell'istanza e
richiamare i metodi della classe.

' Set a property value.


sampleObject.SampleProperty = "Sample String"
' Call a method.
sampleObject.SampleMethod()

Per assegnare i valori alle proprietà durante il processo di creazione dell'istanza della classe, utilizzare gli
inizializzatori di oggetto:

Dim sampleObject = New SampleClass With


{.FirstProperty = "A", .SecondProperty = "B"}

Per altre informazioni, vedere:


Operatore New
Inizializzatori di oggetto: tipi denominati e tipi anonimi
Classi e membri condivisi
Un membro condiviso della classe è una proprietà, una routine o un campo condiviso da tutte le istanze di una
classe.
Per definire un membro condiviso:

Class SampleClass
Public Shared SampleString As String = "Sample String"
End Class

Per accedere al membro condiviso, usare il nome della classe senza creare un oggetto di questa classe:
MsgBox(SampleClass.SampleString)

I moduli condivisi in Visual Basic hanno solo membri condivisi e non è possibile crearne un'istanza. Anche i
membri condivisi non possono accedere a proprietà, campi o metodi non condivisi
Per altre informazioni, vedere:
Condivisa
Istruzione Module
Tipi anonimi
I tipi anonimi consentono di creare oggetti senza scrivere una definizione della classe per il tipo di dati. La classe
viene generata direttamente dal compilatore. La classe non ha un nome utilizzabile e contiene le proprietà
specificate nella dichiarazione dell'oggetto.
Per creare un'istanza di un tipo anonimo:

' sampleObject is an instance of a simple anonymous type.


Dim sampleObject =
New With {Key .FirstProperty = "A", .SecondProperty = "B"}

Per altre informazioni, vedere Tipi anonimi.

Ereditarietà
L'ereditarietà permette di creare una nuova classe che riutilizza, estende e modifica il comportamento definito in
un'altra classe. La classe i cui membri vengono ereditati è denominata classe di base, mentre la classe che
eredita tali membri è denominata classe derivata. Tuttavia, tutte le classi in Visual Basic ereditano in modo
implicito dalla Object classe che supporta la gerarchia di classi .NET e fornisce servizi di basso livello a tutte le
classi.

NOTE
Visual Basic non supporta l'ereditarietà multipla. Vale a dire, è possibile specificare una sola classe base per una classe
derivata.

Per ereditare da una classe base:

Class DerivedClass
Inherits BaseClass
End Class

Per impostazione predefinita, tutte le classi possono essere ereditate. Tuttavia, è possibile specificare se una
classe non deve essere utilizzata come classe base oppure creare una classe utilizzabile solo come classe base.
Per specificare che una classe non può essere utilizzata come classe base:

NotInheritable Class SampleClass


End Class

Per specificare che una classe può essere utilizzata solo come classe base e che non è possibile crearne
un'istanza:
MustInherit Class BaseClass
End Class

Per altre informazioni, vedere:


Inherits Statement
NotInheritable
MustInherit
Override di membri
Per impostazione predefinita, in una classe derivata vengono ereditati tutti i membri della classe base relativa. Se
si desidera modificare il comportamento del membro ereditato, è necessario eseguirne l'override. È possibile
definire una nuova implementazione del metodo, della proprietà o dell'evento nella classe derivata.
I seguenti modificatori consentono di controllare le modalità di override di proprietà e metodi:

M O DIF IC ATO RE DI VISUA L B A SIC DEF IN IZ IO N E

Overridable Consente a un membro della classe di essere sottoposto a


override in una classe derivata.

Override Esegue l'override di un membro virtuale (sottoponibile a


override) definito nella classe base.

NotOverridable Consente di impedire l'override di un membro in una classe


che eredita.

MustOverride Richiede che un membro della classe venga sottoposto a


override nella classe derivata.

Ombreggiature Nasconde un membro ereditato da una classe base.

Interfacce
Le interfacce, come le classi, consentono di definire un insieme di proprietà, metodi ed eventi. A differenza delle
classi, però, le interfacce non forniscono l'implementazione. Esse sono infatti implementate dalle classi e definite
come entità distinte da queste. Un'interfaccia rappresenta un contratto, in quanto è necessario che una classe
che implementa un'interfaccia implementi ogni aspetto esattamente come è stato definito.
Per definire un'interfaccia:

Public Interface ISampleInterface


Sub DoSomething()
End Interface

Per implementare un'interfaccia in una classe:

Class SampleClass
Implements ISampleInterface
Sub DoSomething
' Method implementation.
End Sub
End Class
Per altre informazioni, vedere:
Interfacce
Istruzione Interface
Istruzione Implements

Generics
Classi, strutture, interfacce e metodi in .NET possono includere parametri di tipo che definiscono tipi di oggetti
che possono archiviare o usare. L'esempio più comune di generics è una raccolta, dove è possibile specificare il
tipo di oggetti da archiviare in una raccolta.
Per definire una classe generica:

Class SampleGeneric(Of T)
Public Field As T
End Class

Per creare un'istanza di una classe generica:

Dim sampleObject As New SampleGeneric(Of String)


sampleObject.Field = "Sample string"

Per altre informazioni, vedere:


Generics
Generic Types in Visual Basic

Delegati
Un delegato è un tipo che definisce una firma di metodo e può offrire un riferimento a qualsiasi metodo con una
firma compatibile. Tramite il delegato è possibile invocare (o chiamare) il metodo. I delegati vengono utilizzati
per passare metodi come argomenti ad altri metodi.

NOTE
I gestori di evento non sono altro che metodi richiamati tramite delegati. Per altre informazioni sull'uso dei delegati nella
gestione degli eventi, vedere Eventi.

Per creare un delegato:

Delegate Sub SampleDelegate(ByVal str As String)

Per creare un riferimento a un metodo che corrisponde alla firma specificata dal delegato:
Class SampleClass
' Method that matches the SampleDelegate signature.
Sub SampleSub(ByVal str As String)
' Add code here.
End Sub
' Method that instantiates the delegate.
Sub SampleDelegateSub()
Dim sd As SampleDelegate = AddressOf SampleSub
sd("Sample string")
End Sub
End Class

Per altre informazioni, vedere:


Delegati
Istruzione Delegate
Operatore AddressOf

Vedi anche
Guida per programmatori Visual Basic
Reflection (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

La reflection specifica oggetti di tipo Type che descrivono assembly, moduli e tipi. È possibile usare la reflection
per creare in modo dinamico un'istanza di un tipo, associare il tipo a un oggetto esistente oppure ottenere il tipo
da un oggetto esistente e richiamarne i metodi o accedere ai relativi campi e proprietà. Se si usano attributi nel
codice, la reflection consente di accedervi. Per altre informazioni, vedere Attributi.
Di seguito è riportato un esempio semplice di reflection che usa il metodo statico GetType ereditato da tutti i
tipi dalla classe di base Object per ottenere il tipo di una variabile:

' Using GetType to obtain type information:


Dim i As Integer = 42
Dim type As System.Type = i.GetType()
System.Console.WriteLine(type)

L'output è il seguente:
System.Int32

L'esempio seguente usa la reflection per ottenere il nome completo dell'assembly caricato.

' Using Reflection to get information from an Assembly:


Dim info As System.Reflection.Assembly = GetType(System.Int32).Assembly
System.Console.WriteLine(info)

L'output è il seguente:
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

Panoramica della reflection


La reflection è utile nelle situazioni seguenti:
Quando è necessario accedere agli attributi nei metadati del programma. Per altre informazioni, vedere
Recupero di informazioni memorizzate negli attributi.
Per esaminare e creare istanze di tipi in un assembly.
Per creare nuovi tipi in fase di esecuzione. Usare le classi in System.Reflection.Emit.
Per eseguire l'associazione tardiva, accedere ai metodi per i tipi creati in fase di esecuzione. Vedere
l'argomento relativo a caricamento e uso dinamico dei tipi.

Sezioni correlate
Per altre informazioni:
Reflection
Visualizzazione delle informazioni sul tipo
Reflection e tipi generici
System.Reflection.Emit
Recupero di informazioni memorizzate negli attributi

Vedi anche
Guida per programmatori Visual Basic
Assembly in .NET
Serializzazione (Visual Basic)
05/03/2021 • 8 minutes to read • Edit Online

Il termine serializzazione indica il processo di conversione di un oggetto in un flusso di byte allo scopo di
archiviare tale oggetto o trasmetterlo alla memoria, a un database o a un file. Il fine principale della
serializzazione è salvare lo stato di un oggetto per consentirne la ricreazione in caso di necessità. Il processo
inverso è denominato deserializzazione.

Funzionamento della serializzazione


La figura seguente illustra il processo complessivo di serializzazione.

L'oggetto viene serializzato in un flusso che contiene non solo i dati, ma anche informazioni sul tipo di oggetto,
ad esempio la versione, le impostazioni cultura e il nome dell'assembly. Da questo flusso è possibile archiviare
l'oggetto in un database, in un file oppure nella memoria.
Usi della serializzazione
La serializzazione consente allo sviluppatore di salvare lo stato di un oggetto per ricrearlo quando necessario,
consentendo sia l'archiviazione di oggetti sia lo scambio di dati. Grazie alla serializzazione, uno sviluppatore può
eseguire azioni quali l'invio dell'oggetto a un'applicazione remota tramite un servizio Web, il passaggio di un
oggetto da un dominio a un altro, il passaggio di un oggetto attraverso un firewall come stringa XML o la
gestione su diverse applicazioni di informazioni sulla sicurezza o specifiche dell'utente.
Rendere un oggetto serializzabile
Per serializzare un oggetto, sono necessari l'oggetto da serializzare, un flusso che contenga l'oggetto serializzato
e un Formatter. System.Runtime.Serialization contiene classi necessarie per la serializzazione e la
deserializzazione di oggetti.
Applicare l'attributo SerializableAttribute a un tipo per indicare che le istanze di tale tipo possono essere
serializzate. Viene generata un'eccezione SerializationException se si tenta di serializzare ma il tipo non ha
l'attributo SerializableAttribute.
Se si vuole evitare che un campo della classe venga serializzato, applicare l'attributo NonSerializedAttribute. Se
un campo di un tipo serializzabile contiene un puntatore, un handle o un'altra struttura di dati specifica di un
particolare ambiente e tale campo non può essere ricostituito in modo corretto in un ambiente diverso, è
necessario renderlo non serializzabile.
Se una classe serializzata contiene riferimenti a oggetti di altre classi contrassegnate con SerializableAttribute,
verranno serializzati anche tali oggetti.

Serializzazione in formato binario e XML


È possibile usare la serializzazione in formato binario o XML. Nella serializzazione binaria vengono serializzati
tutti i membri, anche quelli di sola lettura, e le prestazioni risultano migliorate. La serializzazione XML offre
codice più leggibile nonché una maggiore flessibilità nella condivisione e nell'uso degli oggetti per scopi di
interoperabilità.
Serializzazione binaria
La serializzazione binaria usa la codifica binaria per generare una serializzazione compatta per usi quali
l'archiviazione o i flussi di rete basati sui socket.
Serializzazione XML
La serializzazione XML serializza le proprietà e i campi pubblici di un oggetto, o i parametri e i valori restituiti dei
metodi, in un flusso XML conforme a uno specifico documento in linguaggio XSD (XML Schema Definition). La
serializzazione XML genera classi fortemente tipizzate con proprietà e campi pubblici convertiti in XML.
System.Xml.Serialization contiene le classi necessarie per la serializzazione e la deserializzazione XML.
È possibile applicare attributi alle classi e ai membri delle classi per controllare il modo in cui XmlSerializer
serializza o deserializza un'istanza della classe.

Serializzazione di base e personalizzata


La serializzazione può essere eseguita secondo due modalità: di base e personalizzata. La serializzazione di base
usa .NET Framework per serializzare l'oggetto in modo automatico.
Serializzazione di base
L'unico requisito della serializzazione di base è che all'oggetto sia applicato l'attributo SerializableAttribute. È
possibile usare l'attributo NonSerializedAttribute per evitare la serializzazione di campi specifici.
Quando si usa la serializzazione di base, è possibile che il controllo delle versioni degli oggetti crei problemi. In
questo caso, può essere preferibile la serializzazione personalizzata. La serializzazione di base è il modo più
semplice per eseguire la serializzazione, ma non assicura il controllo completo del processo.
Serializzazione personalizzata
Con la serializzazione personalizzata è possibile specificare esattamente quali oggetti verranno serializzati e il
modo in cui verrà eseguita la serializzazione. La classe deve essere contrassegnata con SerializableAttribute e
implementare l'interfaccia ISerializable.
Se si vuole che un oggetto venga anche deserializzato in modo personalizzato, è necessario usare un costruttore
personalizzato.

Serializzazione della finestra di progettazione


La serializzazione della finestra di progettazione è una forma speciale di serializzazione che interessa il tipo di
persistenza dell'oggetto solitamente associato agli strumenti di sviluppo. La serializzazione della finestra di
progettazione è il processo di conversione di un oggetto grafico in un file di origine che può essere usato in
seguito per recuperare l'oggetto grafico stesso. Un file di origine può contenere codice, markup o anche
informazioni su tabelle SQL.

Argomenti correlati ed esempi


Procedura dettagliata: Persistenza di un oggetto in Visual Studio (Visual Basic)
Dimostra in che modo è possibile usare la serializzazione per rendere persistenti i dati di un oggetto tra le
istanze, consentendo di archiviare i valori e di recuperarli alla successiva creazione di un'istanza dell'oggetto.
Procedura: Leggere dati oggetto in un file XML (Visual Basic)
Spiega come leggere i dati della classe precedentemente scritti in un file XML usando la classe XmlSerializer.
Procedura: Scrivere dati oggetto in un file XML (Visual Basic)
Spiega come scrivere l'oggetto da una classe in un file XML usando la classe XmlSerializer.
Struttura del programma e convenzioni di scrittura
del codice (Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

In questa sezione viene presentata la tipica struttura del programma Visual Basic, viene fornito un semplice
programma di Visual Basic, "Hello, World" e vengono illustrate le convenzioni del codice Visual Basic. Le
convenzioni del codice sono suggerimenti che non si concentrano sulla logica di un programma, ma sulla
struttura fisica e sull'aspetto. Il codice che segue semplifica la lettura, la comprensione e la gestione del codice.
Le convenzioni del codice possono includere, tra le altre:
Formati standardizzati per l'assegnazione di etichette e l'inserimento di commenti nel codice.
Linee guida per la spaziatura, la formattazione e il rientro del codice.
Convenzioni di denominazione per oggetti, variabili e procedure.
Negli argomenti seguenti viene presentata una serie di linee guida di programmazione per Visual Basic
programmi, oltre ad esempi di utilizzo corretto.

Contenuto della sezione


Struttura di un programma Visual Basic
Viene fornita una panoramica degli elementi che costituiscono un programma Visual Basic.
Routine Main in Visual Basic
Viene descritta la procedura che funge da punto di partenza e controllo generale per l'applicazione.
Riferimenti e istruzione Imports
Viene illustrato come fare riferimento a oggetti in altri assembly.
Spazi dei nomi in Visual Basic
Viene descritto come gli spazi dei nomi organizzano gli oggetti all'interno degli assembly.
Convenzioni di denominazione di Visual Basic
Include linee guida generali per la denominazione di procedure, costanti, variabili, argomenti e oggetti.
Convenzioni di codifica di Visual Basic
Esamina le linee guida utilizzate per lo sviluppo degli esempi in questa documentazione.
Compilazione condizionale
Viene descritto come compilare in modo selettivo blocchi specifici di codice, indirizzando il compilatore per
ignorarne altri.
Procedura: Interrompere e combinare istruzioni nel codice
Viene illustrato come dividere istruzioni lunghe in più righe e combinare brevi istruzioni in una sola riga.
Procedura: Comprimere e nascondere sezioni di codice
Viene illustrato come comprimere e nascondere sezioni di codice nell'editor di codice Visual Basic.
Procedura: Etichettare le istruzioni
Viene illustrato come contrassegnare una riga di codice per identificarla per l'utilizzo con istruzioni quali
On Error Goto .

Caratteri speciali nel codice


Mostra come e dove usare caratteri non numerici e non alfabetici.
Commenti nel codice
Viene illustrato come aggiungere commenti descrittivi al codice.
Parole chiave come nomi di elementi nel codice
Viene descritto come utilizzare le parentesi quadre ( [] ) per delimitare i nomi delle variabili che sono anche
Visual Basic parole chiave.
Me, My, MyBase e MyClass
Vengono descritti i vari modi per fare riferimento agli elementi di un programma Visual Basic.
Limitazioni di Visual Basic
Viene illustrata la rimozione dei limiti di codifica noti all'interno Visual Basic.

Sezioni correlate
Convenzioni tipografiche e di scrittura del codice
Fornisce le convenzioni di codifica standard per Visual Basic.
Scrittura di codice
Descrive le funzionalità che semplificano la scrittura e la gestione del codice.
Struttura di un programma Visual Basic
05/03/2021 • 7 minutes to read • Edit Online

Un programma Visual Basic è costituito da blocchi predefiniti standard. Una soluzione è costituita da uno o più
progetti. Un progetto può a sua volta contenere uno o più assembly. Ogni assembly viene compilato da uno o
più file di origine. Un file di origine fornisce la definizione e l'implementazione di classi, strutture, moduli e
interfacce, che in definitiva contengono tutto il codice.
Per ulteriori informazioni su questi blocchi predefiniti di un programma Visual Basic, vedere soluzioni e progetti
e assembly in .NET.

Elementi di programmazione File-Level


Quando si avvia un progetto o un file e si apre l'editor di codice, viene visualizzato il codice già presente e
nell'ordine corretto. Il codice scritto deve seguire la sequenza seguente:
1. Option istruzioni
2. Imports istruzioni
3. Namespace istruzioni e elementi a livello di spazio dei nomi
Se si immettono istruzioni in un ordine diverso, possono verificarsi errori di compilazione.
Un programma può inoltre contenere istruzioni di compilazione condizionale. È possibile intervallare questi dati
nel file di origine tra le istruzioni della sequenza precedente.
Istruzioni Option
Option le istruzioni stabiliscono regole di base per il codice successivo, evitando errori di sintassi e logica. L'
istruzione Option Explicit garantisce che tutte le variabili siano dichiarate e digitate correttamente, riducendo il
tempo di debug. L' istruzione Option Strict consente di ridurre al minimo gli errori logici e la perdita di dati che
possono verificarsi quando si lavora tra variabili di tipi di dati diversi. L' istruzione Option Compare specifica il
modo in cui le stringhe vengono confrontate tra loro, in base ai relativi Binary Text valori o.
Istruzioni Imports
È possibile includere un' istruzione Imports (tipo e spazio dei nomi .NET) per importare i nomi definiti all'esterno
del progetto. Un' Imports istruzione consente al codice di fare riferimento alle classi e ad altri tipi definiti nello
spazio dei nomi importato, senza doverli qualificare. È possibile utilizzare il numero di Imports istruzioni
appropriato. Per ulteriori informazioni, vedere riferimenti e l'istruzione Imports.
Istruzioni dello spazio dei nomi
Gli spazi dei nomi consentono di organizzare e classificare gli elementi di programmazione per semplificare il
raggruppamento e l'accesso. L' istruzione Namespace viene utilizzata per classificare le istruzioni seguenti
all'interno di un determinato spazio dei nomi. Per ulteriori informazioni, vedere Spazi dei nomi in Visual Basic.
Istruzioni di compilazione condizionale
Le istruzioni di compilazione condizionale possono apparire praticamente in qualsiasi punto del file di origine.
Provocano l'inclusione o l'esclusione di parti del codice in fase di compilazione, a seconda di determinate
condizioni. È anche possibile usarli per eseguire il debug dell'applicazione, perché il codice condizionale viene
eseguito solo in modalità di debug. Per altre informazioni, vedere compilazione condizionale.
Elementi di programmazione Namespace-Level
Classi, strutture e moduli contengono tutto il codice presente nel file di origine. Si tratta di elementi a livello di
spazio dei nomi che possono essere visualizzati all'interno di uno spazio dei nomi o a livello di file di origine.
Che contengono le dichiarazioni di tutti gli altri elementi di programmazione. Le interfacce, che definiscono le
firme degli elementi ma non forniscono alcuna implementazione, vengono visualizzate anche a livello di
modulo. Per ulteriori informazioni sugli elementi a livello di modulo, vedere gli argomenti seguenti:
Istruzione Class
Istruzione Structure
Istruzione Module
Istruzione Interface
Gli elementi dati a livello di spazio dei nomi sono enumerazioni e delegati.

Elementi di programmazione Module-Level


Procedure, operatori, proprietà ed eventi sono gli unici elementi di programmazione che possono conservare il
codice eseguibile (istruzioni che eseguono azioni in fase di esecuzione). Sono gli elementi a livello di modulo del
programma. Per ulteriori informazioni sugli elementi a livello di procedura, vedere gli argomenti seguenti:
Istruzione Function
Istruzione Sub
Declare Statement
Operator Statement
Property Statement
Istruzione Event
Gli elementi dati a livello di modulo sono variabili, costanti, enumerazioni e delegati.

Elementi di programmazione Procedure-Level


La maggior parte del contenuto degli elementi a livello di routine sono istruzioni eseguibili, che costituiscono il
codice di runtime del programma. Tutto il codice eseguibile deve essere in alcune procedure ( Function ,, Sub
Operator , Get , Set , AddHandler , RemoveHandler , RaiseEvent ). Per altre informazioni, vedere Istruzioni.

Gli elementi dati a livello di procedura sono limitati a variabili e costanti locali.

Procedura principale
La Main procedura è il primo codice da eseguire quando l'applicazione è stata caricata. Main funge da punto di
partenza e controllo generale per l'applicazione. Sono disponibili quattro tipi di Main :
Sub Main()

Sub Main(ByVal cmdArgs() As String)

Function Main() As Integer

Function Main(ByVal cmdArgs() As String) As Integer

La varietà più comune di questa procedura è Sub Main() . Per ulteriori informazioni, vedere la procedura
principale in Visual Basic.

Vedi anche
Routine Main in Visual Basic
Convenzioni di denominazione di Visual Basic
Limitazioni di Visual Basic
Routine Main in Visual Basic
05/03/2021 • 5 minutes to read • Edit Online

Ogni applicazione Visual Basic deve contenere una procedura denominata Main . Questa procedura funge da
punto di partenza e controllo generale per l'applicazione. Il .NET Framework chiama la Main procedura quando
ha caricato l'applicazione ed è pronta per passare il controllo. A meno che non si stia creando una Windows
Forms Application, è necessario scrivere la Main procedura per le applicazioni che vengono eseguite
autonomamente.
Main contiene il codice che viene eseguito per primo. In Main è possibile determinare il modulo da caricare per
primo all'avvio del programma, verificare se una copia dell'applicazione è già in esecuzione nel sistema, stabilire
un set di variabili per l'applicazione o aprire un database necessario per l'applicazione.

Requisiti per la procedura principale


Un file che viene eseguito autonomamente, in genere con estensione exe, deve contenere una Main routine.
Una libreria, ad esempio con estensione dll, non viene eseguita autonomamente e non richiede una Main
procedura. I requisiti per i diversi tipi di progetti che è possibile creare sono i seguenti:
Le applicazioni console vengono eseguite autonomamente ed è necessario fornire almeno una Main
procedura.
Windows Form le applicazioni vengono eseguite autonomamente. Tuttavia, il compilatore Visual Basic
genera automaticamente una Main procedura in tale applicazione e non è necessario scriverne una.
Le librerie di classi non richiedono una Main procedura. Sono incluse le librerie di controlli Windows e le
librerie di controlli Web. Le applicazioni Web vengono distribuite come librerie di classi.

Dichiarazione della routine Main


Esistono quattro modi per dichiarare la Main procedura. Può assumere o meno argomenti e può restituire un
valore.

NOTE
Se si dichiara Main in una classe, è necessario usare la Shared parola chiave. In un modulo Main non è necessario che
sia Shared .

Il modo più semplice consiste nel dichiarare una Sub routine che non accetta argomenti o restituisce un
valore.

Module mainModule
Sub Main()
MsgBox("The Main procedure is starting the application.")
' Insert call to appropriate starting place in your code.
MsgBox("The application is terminating.")
End Sub
End Module

Main può inoltre restituire un Integer valore, che viene utilizzato dal sistema operativo come codice di
uscita per il programma. Altri programmi possono testare questo codice esaminando il valore
ERRORLEVEL di Windows. Per restituire un codice di uscita, è necessario dichiarare Main come Function
routine anziché come Sub routine.

Module mainModule
Function Main() As Integer
MsgBox("The Main procedure is starting the application.")
Dim returnValue As Integer = 0
' Insert call to appropriate starting place in your code.
' On return, assign appropriate value to returnValue.
' 0 usually means successful completion.
MsgBox("The application is terminating with error level " &
CStr(returnValue) & ".")
Return returnValue
End Function
End Module

Main può inoltre assumere una String matrice come argomento. Ogni stringa della matrice contiene
uno degli argomenti della riga di comando usati per richiamare il programma. È possibile eseguire azioni
diverse a seconda dei rispettivi valori.

Module mainModule
Function Main(ByVal cmdArgs() As String) As Integer
MsgBox("The Main procedure is starting the application.")
Dim returnValue As Integer = 0
' See if there are any arguments.
If cmdArgs.Length > 0 Then
For argNum As Integer = 0 To UBound(cmdArgs, 1)
' Insert code to examine cmdArgs(argNum) and take
' appropriate action based on its value.
Next
End If
' Insert call to appropriate starting place in your code.
' On return, assign appropriate value to returnValue.
' 0 usually means successful completion.
MsgBox("The application is terminating with error level " &
CStr(returnValue) & ".")
Return returnValue
End Function
End Module

È possibile dichiarare Main per esaminare gli argomenti della riga di comando, ma non per restituire un
codice di uscita, come indicato di seguito.

Module mainModule
Sub Main(ByVal cmdArgs() As String)
MsgBox("The Main procedure is starting the application.")
Dim returnValue As Integer = 0
' See if there are any arguments.
If cmdArgs.Length > 0 Then
For argNum As Integer = 0 To UBound(cmdArgs, 1)
' Insert code to examine cmdArgs(argNum) and take
' appropriate action based on its value.
Next
End If
' Insert call to appropriate starting place in your code.
MsgBox("The application is terminating.")
End Sub
End Module

Vedi anche
MsgBox
Length
UBound
Struttura di un programma Visual Basic
-principale
Condivisa
Istruzione Sub
Istruzione Function
Tipo di dati Integer
Tipo di dati String
Riferimenti e istruzione Imports (Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

È possibile rendere disponibili oggetti esterni per il progetto scegliendo il comando Aggiungi riferimento dal
menu progetto . I riferimenti in Visual Basic possono puntare ad assembly, che sono simili alle librerie dei tipi
ma contengono ulteriori informazioni.

Istruzione Imports
Gli assembly includono uno o più spazi dei nomi. Quando si aggiunge un riferimento a un assembly, è anche
possibile aggiungere un' Imports istruzione a un modulo che controlla la visibilità degli spazi dei nomi
dell'assembly all'interno del modulo. L' Imports istruzione fornisce un contesto di ambito che consente di
utilizzare solo la parte dello spazio dei nomi necessaria per fornire un riferimento univoco.
L' Imports istruzione ha la sintassi seguente:
Imports [Aliasname =] Namespace

Aliasname fa riferimento a un nome breve che è possibile utilizzare all'interno del codice per fare riferimento a
uno spazio dei nomi importato. Namespace è uno spazio dei nomi disponibile tramite un riferimento al progetto,
tramite una definizione all'interno del progetto o tramite un' Imports istruzione precedente.
Un modulo può contenere un numero qualsiasi di Imports istruzioni. Devono essere visualizzate dopo qualsiasi
Option istruzione, se presente, ma prima di qualsiasi altro codice.

NOTE
Non confondere i riferimenti del progetto con l' Imports istruzione o l' Declare istruzione. I riferimenti al progetto
rendono disponibili oggetti esterni, ad esempio oggetti negli assembly, per Visual Basic progetti. L' Imports istruzione
viene utilizzata per semplificare l'accesso ai riferimenti del progetto, ma non fornisce l'accesso a tali oggetti. L' Declare
istruzione viene utilizzata per dichiarare un riferimento a una procedura esterna in una libreria di collegamento dinamico
(dll).

Utilizzo degli alias con l'istruzione Imports


L' Imports istruzione semplifica l'accesso ai metodi delle classi eliminando la necessità di digitare in modo
esplicito i nomi completi dei riferimenti. Gli alias consentono di assegnare un nome amichevole a una sola parte
di uno spazio dei nomi. Ad esempio, la sequenza ritorno a capo/avanzamento riga che causa la visualizzazione
di una singola porzione di testo su più righe fa parte del ControlChars modulo nello Microsoft.VisualBasic
spazio dei nomi. Per usare questa costante in un programma senza un alias, è necessario digitare il codice
seguente:

MsgBox("Some text" & Microsoft.VisualBasic.ControlChars.CrLf &


"Some more text")

Imports le istruzioni devono essere sempre le prime righe immediatamente successive Option a qualsiasi
istruzione in un modulo. Il frammento di codice seguente illustra come importare e assegnare un alias al
Microsoft.VisualBasic.ControlChars modulo:
Imports CtrlChrs = Microsoft.VisualBasic.ControlChars

I riferimenti futuri a questo spazio dei nomi possono essere notevolmente più brevi:

MsgBox("Some text" & CtrlChrs.CrLf & "Some more text")

Se un' Imports istruzione non include un nome di alias, è possibile usare gli elementi definiti nello spazio dei
nomi importato nel modulo senza qualifica. Se il nome dell'alias è specificato, deve essere usato come
qualificatore per i nomi contenuti in tale spazio dei nomi.

Vedi anche
ControlChars
Microsoft.VisualBasic
Spazi dei nomi in Visual Basic
Assembly in .NET
Istruzione Imports (tipo e spazio dei nomi .NET)
Spazi dei nomi in Visual Basic
05/03/2021 • 11 minutes to read • Edit Online

Gli spazi dei nomi organizzano gli oggetti definiti in un assembly. Gli assembly possono contenere più spazi dei
nomi, che a loro volta possono contenere altri spazi dei nomi. Gli spazi dei nomi consentono di evitare problemi
di ambiguità e di semplificare i riferimenti quando si usano gruppi di oggetti di grandi dimensioni, ad esempio
librerie di classi.
Ad esempio, il .NET Framework definisce la ListBox classe nello System.Windows.Forms spazio dei nomi. Il
frammento di codice seguente illustra come dichiarare una variabile usando il nome completo per questa classe:

Dim LBox As System.Windows.Forms.ListBox

Evitare conflitti di nomi


.NET Framework gli spazi dei nomi risolvono un problema talvolta denominato inquinamento dello spazio dei
nomi, in cui lo sviluppatore di una libreria di classi è ostacolato dall'uso di nomi simili in un'altra libreria. Questi
conflitti con i componenti esistenti sono talvolta denominati conflitti di nomi.
Se, ad esempio, si crea una nuova classe denominata ListBox , è possibile usarla all'interno del progetto senza
qualificazione. Tuttavia, se si vuole usare la classe .NET Framework ListBox nello stesso progetto, è necessario
usare un riferimento completo per rendere univoco il riferimento. Se il riferimento non è univoco, Visual Basic
genera un errore che informa che il nome è ambiguo. L'esempio di codice seguente illustra come dichiarare
questi oggetti:

' Define a new object based on your ListBox class.


Dim LBC As New ListBox
' Define a new Windows.Forms ListBox control.
Dim MyLB As New System.Windows.Forms.ListBox

Nella figura seguente sono illustrate due gerarchie dello spazio dei nomi, entrambe contenenti un oggetto
denominato ListBox :

Per impostazione predefinita, ogni file eseguibile creato con Visual Basic contiene uno spazio dei nomi con lo
stesso nome del progetto. Se, ad esempio, si definisce un oggetto all'interno di un progetto denominato
ListBoxProject , il file eseguibile ListBoxProject.exe conterrà uno spazio dei nomi chiamato ListBoxProject .

Più assembly possono usare lo stesso spazio dei nomi. Visual Basic li considera come un singolo set di nomi. È
ad esempio possibile definire classi per uno spazio dei nomi chiamato SomeNameSpace in un assembly
denominato Assemb1 e altre classi per lo stesso spazio dei nomi da un assembly denominato Assemb2 .

nomi completi
I nomi completi sono riferimenti a oggetti preceduti dal nome dello spazio dei nomi in cui è definito l'oggetto. È
possibile usare gli oggetti definiti in altri progetti se si crea un riferimento alla classe (scegliendo Aggiungi
riferimento dal menu Progetto ) e quindi usare il nome completo per l'oggetto nel codice. Il frammento di
codice seguente mostra come usare il nome completo per un oggetto dallo spazio dei nomi di un altro progetto:

Dim LBC As New ListBoxProject.Form1.ListBox

I nomi completi impediscono i conflitti di denominazione perché consentono al compilatore di determinare


quale oggetto viene usato. I nomi stessi, tuttavia, possono diventare lunghi e complessi. Per evitare questo
problema, è possibile usare l'istruzione Imports per definire un alias, ossia un nome abbreviato utilizzabile al
posto di un nome completo. Ad esempio, il codice seguente crea alias per due nomi completi e usa questi alias
per definire due oggetti.

Imports LBControl = System.Windows.Forms.ListBox


Imports MyListBox = ListBoxProject.Form1.ListBox

Dim LBC As LBControl


Dim MyLB As MyListBox

Se si usa l'istruzione Imports senza un alias, è possibile usare tutti i nomi dello spazio dei nomi senza
qualificazione, a condizione che siano univoci per il progetto. Se il progetto contiene istruzioni Imports per gli
spazi dei nomi che contengono elementi con lo stesso nome, quando si usa il nome è necessario definirlo in
modo completo. Si supponga, ad esempio, che il progetto contenga le due istruzioni Imports seguenti:

' This namespace contains a class called Class1.


Imports MyProj1
' This namespace also contains a class called Class1.
Imports MyProj2

Se si tenta di utilizzare Class1 senza la qualifica completa, Visual Basic genera un errore che informa che il
nome Class1 è ambiguo.

Istruzioni a livello di spazio dei nomi


All'interno di uno spazio dei nomi è possibile definire elementi quali moduli, interfacce, classi, delegati,
enumerazioni, strutture e altri spazi dei nomi. Non è invece possibile definire elementi come proprietà, routine,
variabili ed eventi a livello di spazio dei nomi. Questi elementi devono essere dichiarati all'interno di contenitori
quali moduli, strutture o classi.

Parola chiave Global nei nomi completi


Se è stata definita una gerarchia annidata di spazi dei nomi, è possibile che per il codice interno alla gerarchia
venga bloccato l'accesso allo spazio dei nomi System di .NET Framework. L'esempio seguente illustra una
gerarchia in cui lo spazio dei nomi SpecialSpace.System blocca l'accesso a System.
Namespace SpecialSpace
Namespace System
Class abc
Function getValue() As System.Int32
Dim n As System.Int32
Return n
End Function
End Class
End Namespace
End Namespace

Di conseguenza, il compilatore di Visual Basic non è in grado di risolvere il riferimento a System.Int32perché


SpecialSpace.System non definisce Int32 . Per iniziare la catena di qualificazione al livello più esterno della
libreria di classi di .NET Framework è possibile usare la parola chiave Global . In questo modo si può specificare
lo spazio dei nomi System o qualsiasi altro spazio dei nomi nella libreria di classi. Questa condizione è illustrata
nell'esempio seguente.

Namespace SpecialSpace
Namespace System
Class abc
Function getValue() As Global.System.Int32
Dim n As Global.System.Int32
Return n
End Function
End Class
End Namespace
End Namespace

Usando Global è possibile accedere ad altri spazi dei nomi a livello di radice, ad esempio Microsoft.VisualBasic,
e a qualsiasi spazio dei nomi associato al progetto.

Parola chiave Global nelle istruzioni degli spazi dei nomi


La parola chiave Global può essere usata anche in un oggetto Namespace Statement. Ciò consente di definire
uno spazio dei nomi all'esterno dello spazio dei nomi radice del progetto.
Tutti gli spazi dei nomi inclusi nel progetto sono basati sullo spazio dei nomi radice definito per il progetto. Visual
Studio assegna il nome del progetto come spazio dei nomi radice predefinito per tutto il codice del progetto. Se,
ad esempio, il progetto è denominato ConsoleApplication1 , i relativi elementi di programmazione
appartengono allo spazio dei nomi ConsoleApplication1 . Se si dichiara Namespace Magnetosphere , i riferimenti a
Magnetosphere nel progetto accedono a ConsoleApplication1.Magnetosphere .

Negli esempi seguenti viene usata la parola chiave Global per dichiarare uno spazio dei nomi all'esterno dello
spazio dei nomi radice per il progetto.

Namespace Global.Magnetosphere

End Namespace

Namespace Global
Namespace Magnetosphere

End Namespace
End Namespace

In una dichiarazione dello spazio dei nomi la parola chiave Global non può essere annidata in un altro spazio
dei nomi.
È possibile usare Application Page, Project Designer (Visual Basic) per visualizzare e modificare lo spazio dei
nomi radice del progetto. Per i nuovi progetti, come spazio dei nomi radice predefinito viene usato il nome
del progetto. Per impostare Global come spazio dei nomi di primo livello, è possibile cancellare la voce Spazio
dei nomi radice in modo da lasciare vuota la casella. La cancellazione della voce Spazio dei nomi radice
elimina la necessità di usare la parola chiave Global nelle dichiarazioni degli spazi dei nomi.
Se un'istruzione Namespace dichiara un nome che è anche uno spazio dei nomi in .NET Framework e la parola
chiave Global non viene usata in un nome completo, lo spazio dei nomi di .NET Framework non sarà più
disponibile. Per abilitare l'accesso allo spazio dei nomi di .NET Framework senza usare la parola chiave Global ,
è possibile includere Global nell'istruzione Namespace .
L'esempio seguente mostra la dichiarazione dello spazio dei nomi Global con la parola chiave System.Text .
Se Global non è presente nella dichiarazione dello spazio dei nomi, StringBuilder non è accessibile, a meno che
non si specifichi Global.System.Text.StringBuilder . Per un progetto denominato ConsoleApplication1 , i
riferimenti a System.Text accedono a ConsoleApplication1.System.Text se non viene usata la parola chiave
Global .

Module Module1
Sub Main()
Dim encoding As New System.Text.TitanEncoding

' If the namespace defined below is System.Text


' instead of Global.System.Text, then this statement
' causes a compile-time error.
Dim sb As New System.Text.StringBuilder
End Sub
End Module

Namespace Global.System.Text
Class TitanEncoding

End Class
End Namespace

Vedi anche
ListBox
System.Windows.Forms
Assembly in .NET
Riferimenti e istruzione Imports
Istruzione Imports (tipo e spazio dei nomi .NET)
Scrittura di codice nelle soluzioni Office
Convenzioni di denominazione di Visual Basic
05/03/2021 • 3 minutes to read • Edit Online

Quando si rinomina un elemento nell'applicazione Visual Basic, il primo carattere del nome deve essere un
carattere alfabetico o un carattere di sottolineatura. Si noti, tuttavia, che i nomi che iniziano con un carattere di
sottolineatura non sono conformi a CLS ( Language Independence and Language-Independent Components ).
I suggerimenti seguenti si applicano alla denominazione.
Iniziare ogni parola separata in un nome con una lettera maiuscola, come in FindLastRecord e
RedrawMyForm .

Iniziare i nomi di funzione e metodo con un verbo, come in InitNameArray o CloseDialog .


Iniziare i nomi di classe, struttura, modulo e proprietà con un sostantivo, come in EmployeeName o
CarAccessory .

Iniziare i nomi di interfaccia con il prefisso "I", seguito da un sostantivo o da una frase nominale,
IComponent ad esempio, o con un aggettivo che descrive il comportamento dell'interfaccia, ad esempio
IPersistable . Non usare il carattere di sottolineatura e usare le abbreviazioni sporadicamente, perché le
abbreviazioni possono causare confusione.
Iniziare i nomi dei gestori eventi con un sostantivo che descrive il tipo di evento seguito dal EventHandler
suffisso "", come in " MouseEventHandler ".
Nei nomi delle classi di argomenti dell'evento includere il EventArgs suffisso "".
Se un evento ha un concetto di "before" o "After", usare un suffisso presente o passato, come in "
ControlAdd " o " ControlAdded ".

Per i termini usati lungo o di frequente, usare le abbreviazioni per tenere ragionevoli le lunghezze dei
nomi, ad esempio, "HTML" invece di "Hypertext Markup Language". In generale, i nomi delle variabili
maggiori di 32 caratteri sono difficili da leggere in un monitor impostato su una risoluzione bassa.
Inoltre, assicurarsi che le abbreviazioni siano coerenti nell'intera applicazione. Il cambio casuale di un
progetto tra "HTML" e "Hypertext Markup Language" può causare confusione.
Evitare di usare nomi in un ambito interno identici a quelli in un ambito esterno. Se si accede a una
variabile errata, possono verificarsi errori. Se si verifica un conflitto tra una variabile e la parola chiave
con lo stesso nome, è necessario identificare la parola chiave facendola precedere dalla libreria dei tipi
appropriata. Se, ad esempio, è presente una variabile denominata Date , è possibile usare la Date
funzione intrinseca solo chiamando DateTime.Date .

Vedi anche
Parole chiave come nomi di elementi nel codice
Me, My, MyBase e MyClass
Declared Element Names
Struttura del programma e convenzioni del codice
Riferimenti al linguaggio Visual Basic
Convenzioni di codifica di Visual Basic
05/03/2021 • 10 minutes to read • Edit Online

Microsoft sviluppa esempi e documentazione che seguono le linee guida in questo argomento. Se si seguono le
stesse convenzioni di codifica, è possibile ottenere i vantaggi seguenti:
Il codice avrà un aspetto coerente, in modo che i lettori possano concentrarsi meglio sul contenuto, non
sul layout.
I reader comprendono il codice più rapidamente, perché possono creare presupposti in base
all'esperienza precedente.
È possibile copiare, modificare e gestire il codice più facilmente.
È possibile assicurarsi che il codice consenta di illustrare "procedure consigliate" per Visual Basic.

Convenzioni di denominazione
Per informazioni sulle linee guida per la denominazione, vedere l'argomento linee guida per la
denominazione.
Non usare "My" o "My" come parte del nome di una variabile. Questa procedura consente di creare
confusione con gli My oggetti.
Non è necessario modificare i nomi degli oggetti nel codice generato automaticamente per adattarli alle
linee guida.

Convenzioni di layout
Inserire le schede come spazi e utilizzare i rientri intelligenti con rientri di quattro spazi.
Usare un elenco semplice (riformattazione) del codice per riformattare il codice nell'editor di
codice. Per ulteriori informazioni, vedere Opzioni, editor di testo, di base (Visual Basic).
Usare una sola istruzione per riga. Non usare il carattere separatore di riga Visual Basic (:).
Evitare di usare il carattere di continuazione di riga esplicito "" a favore della continuazione di riga
implicita laddove il linguaggio lo consente.
Usare una sola dichiarazione per riga.
Se l' elenco (riformattazione) del codice non formatta automaticamente le righe di continuazione,
rientrare manualmente le righe di continuazione una tabulazione. Tuttavia, allinea sempre gli elementi in
un elenco.

a As Integer,
b As Integer

Aggiungere almeno una riga vuota tra le definizioni di metodo e proprietà.

Convenzioni relative ai commenti


Inserire i commenti su una riga separata anziché alla fine di una riga di codice.
Inizia il testo del commento con una lettera maiuscola e termina il testo del commento con un punto.
Inserire uno spazio tra il delimitatore di commento (') e il testo del commento.

' Here is a comment.

Non racchiudere i commenti con blocchi formattati di asterischi.

Struttura del programma


Quando si utilizza il Main metodo, utilizzare il costrutto predefinito per le nuove applicazioni console e
utilizzare My per gli argomenti della riga di comando.

Sub Main()
For Each argument As String In My.Application.CommandLineArgs
' Add code here to use the string variable.
Next
End Sub

Linee guida della lingua


Tipo di dati String
Usare l'interpolazione di stringhe per concatenare stringhe brevi, come illustrato nel codice seguente.

MsgBox($"hello{vbCrLf}goodbye")

Per accodare stringhe nei cicli, utilizzare l' StringBuilder oggetto.

Dim longString As New System.Text.StringBuilder


For count As Integer = 1 To 1000
longString.Append(count)
Next

Delegati rilassati nei gestori eventi


Non qualificare in modo esplicito gli argomenti (oggetto e EventArgs) per i gestori eventi. Se non si utilizzano gli
argomenti dell'evento passati a un evento, ad esempio Sender come oggetto, e come EventArgs, utilizzare
delegati rilassati e lasciare gli argomenti dell'evento nel codice:

Public Sub Form1_Load() Handles Form1.Load


End Sub

Tipi di dati non firmati


Usare Integer anziché tipi non firmati, tranne nei casi in cui sono necessari.
Matrici
Utilizzare la sintassi breve quando si inizializzano le matrici nella riga della dichiarazione. Ad esempio,
usare la sintassi seguente.

Dim letters1 As String() = {"a", "b", "c"}

Non utilizzare la sintassi seguente.


Dim letters2() As String = New String() {"a", "b", "c"}

Inserire l'indicatore di matrice sul tipo, non sulla variabile. Usare, ad esempio, la sintassi seguente:

Dim letters4 As String() = {"a", "b", "c"}

Non usare la sintassi seguente:

Dim letters3() As String = {"a", "b", "c"}

Utilizzare la sintassi {} quando si dichiarano e inizializzano matrici di tipi di dati di base. Usare, ad
esempio, la sintassi seguente:

Dim letters5 As String() = {"a", "b", "c"}

Non usare la sintassi seguente:

Dim letters6(2) As String


letters6(0) = "a"
letters6(1) = "b"
letters6(2) = "c"

Usare la parola chiave with


Quando si esegue una serie di chiamate a un oggetto, provare a usare la With parola chiave:

With orderLog
.Log = "Application"
.Source = "Application Name"
.MachineName = "Computer Name"
End With

Usa il try... Intercettare e utilizzare le istruzioni quando si utilizza la gestione delle eccezioni
Non usare On Error Goto .
Usare la parola chiave non
Usare la IsNot parola chiave invece di Not...Is Nothing .
Nuova parola chiave
Usare la creazione di un'istanza breve. Usare, ad esempio, la sintassi seguente:

Dim employees As New List(Of String)

La riga precedente è equivalente alla seguente:

Dim employees2 As List(Of String) = New List(Of String)

Usare gli inizializzatori di oggetto per i nuovi oggetti anziché il costruttore senza parametri:
Dim orderLog As New EventLog With {
.Log = "Application",
.Source = "Application Name",
.MachineName = "Computer Name"}

Gestione di eventi
Usare Handles anziché AddHandler :

Private Sub ToolStripMenuItem1_Click() Handles ToolStripMenuItem1.Click


End Sub

Usare AddressOf e non creare un'istanza del delegato in modo esplicito:

Dim closeItem As New ToolStripMenuItem(


"Close", Nothing, AddressOf ToolStripMenuItem1_Click)
Me.MainMenuStrip.Items.Add(closeItem)

Quando si definisce un evento, usare la sintassi abbreviata e consentire al compilatore di definire il


delegato:

Public Event SampleEvent As EventHandler(Of SampleEventArgs)


' or
Public Event SampleEvent(ByVal source As Object,
ByVal e As SampleEventArgs)

Non verificare se un evento è Nothing (null) prima di chiamare il RaiseEvent metodo. RaiseEvent
Verifica Nothing prima che venga generato l'evento.
Uso di membri condivisi
Chiamare Shared i membri usando il nome della classe, non da una variabile di istanza.
Usare valori letterali XML
I valori letterali XML semplificano le attività più comuni che si verificano quando si lavora con XML (ad esempio,
caricamento, query e trasformazione). Quando si sviluppa con XML, attenersi alle seguenti linee guida:
Usare valori letterali XML per creare documenti e frammenti XML anziché chiamare direttamente le API
XML.
Importare gli spazi dei nomi XML a livello di file o di progetto per sfruttare le ottimizzazioni delle
prestazioni per i valori letterali XML.
Utilizzare le proprietà dell'asse XML per accedere a elementi e attributi in un documento XML.
Usare espressioni incorporate per includere valori e per creare codice XML da valori esistenti anziché
usare chiamate API, ad esempio il Add Metodo:
Private Function GetHtmlDocument(
ByVal items As IEnumerable(Of XElement)) As String

Dim htmlDoc = <html>


<body>
<table border="0" cellspacing="2">
<%=
From item In items
Select <tr>
<td style="width:480">
<%= item.<title>.Value %>
</td>
<td><%= item.<pubDate>.Value %></td>
</tr>
%>
</table>
</body>
</html>

Return htmlDoc.ToString()
End Function

Query LINQ
Usare nomi significativi per le variabili di query:

Dim seattleCustomers = From cust In customers


Where cust.City = "Seattle"

Fornire nomi per gli elementi in una query per assicurarsi che i nomi delle proprietà dei tipi anonimi
siano correttamente in maiuscolo con la combinazione di maiuscole e minuscole Pascal:

Dim customerOrders = From customer In customers


Join order In orders
On customer.CustomerID Equals order.CustomerID
Select Customer = customer, Order = order

Rinominare le proprietà quando i nomi delle proprietà nel risultato potrebbero risultare ambigui. Se, ad
esempio, la query restituisce un nome cliente e un ID ordine, rinominarli anziché lasciarli come Name e
ID nel risultato:

Dim customerOrders2 = From cust In customers


Join ord In orders
On cust.CustomerID Equals ord.CustomerID
Select CustomerName = cust.Name,
OrderID = ord.ID

Usare l'inferenza del tipo nella dichiarazione di variabili di query e variabili di intervallo:

Dim customerList = From cust In customers

Allineare le clausole di query nell' From istruzione:

Dim newyorkCustomers = From cust In customers


Where cust.City = "New York"
Select cust.LastName, cust.CompanyName
Usare Where le clausole prima di altre clausole di query in modo che le clausole di query successive
funzionino sul set di dati filtrato:

Dim newyorkCustomers2 = From cust In customers


Where cust.City = "New York"
Order By cust.LastName

Utilizzare la Join clausola per definire in modo esplicito un'operazione di join anziché utilizzare la
Where clausola per definire in modo implicito un'operazione di join:

Dim customerList2 = From cust In customers


Join order In orders
On cust.CustomerID Equals order.CustomerID
Select cust, order

Vedi anche
Linee guida per la generazione di codice sicuro
Compilazione condizionale in Visual Basic
05/03/2021 • 5 minutes to read • Edit Online

Nella compilazione condizionale, determinati blocchi di codice in un programma vengono compilati in modo
selettivo mentre altri vengono ignorati.
È ad esempio possibile scrivere istruzioni di debug che confrontano la velocità di approcci diversi alla stessa
attività di programmazione oppure è possibile localizzare un'applicazione per più linguaggi. Le istruzioni di
compilazione condizionale sono progettate per essere eseguite in fase di compilazione, non in fase di
esecuzione.
È possibile indicare blocchi di codice da compilare in modo condizionale con la #If...Then...#Else direttiva. Ad
esempio, per creare versioni in francese e in lingua tedesca della stessa applicazione dallo stesso codice
sorgente, è possibile incorporare segmenti di codice specifici della piattaforma nelle #If...Then istruzioni
usando le costanti predefinite FrenchVersion e GermanVersion . Nell'esempio seguente viene illustrato come:

#If FrenchVersion Then


' <code specific to the French language version>.
#ElseIf GermanVersion Then
' <code specific to the German language version>.
#Else
' <code specific to other versions>.
#End If

Se si imposta il valore della FrenchVersion costante di compilazione condizionale su in fase di True


compilazione, viene compilato il codice condizionale per la versione francese. Se si imposta il valore della
GermanVersion costante su True , il compilatore utilizzerà la versione tedesca. Se nessuno dei due è impostato
su True , viene eseguito il codice nell'ultimo Else blocco.

NOTE
Il completamento automatico non funzionerà quando si modifica il codice e si usano le direttive di compilazione
condizionale se il codice non fa parte del ramo corrente.

Dichiarazione di costanti di compilazione condizionale


È possibile impostare le costanti di compilazione condizionale in uno dei tre modi seguenti:
In Progettazione progetti
Dalla riga di comando quando si usa il compilatore da riga di comando
Nel codice
Le costanti di compilazione condizionale hanno un ambito speciale e non è possibile accedervi dal codice
standard. L'ambito di una costante di compilazione condizionale dipende dal modo in cui è impostato. La tabella
seguente elenca l'ambito delle costanti dichiarate usando ognuno dei tre modi descritti in precedenza.

IM P O STA Z IO N E DEL L A C O STA N T E A M B ITO DEL L A C O STA N T E

Progettazione progetti Pubblico in tutti i file del progetto


IM P O STA Z IO N E DEL L A C O STA N T E A M B ITO DEL L A C O STA N T E

Riga di comando Pubblico per tutti i file passati al compilatore da riga di


comando

#Const istruzione nel codice Privato per il file in cui è dichiarato

P ER IM P O STA RE C O STA N T I IN P RO GET TA Z IO N E P RO GET T I

-Prima di creare il file eseguibile, impostare costanti in Progettazione progetti attenendosi alla procedura descritta in
gestione delle proprietà del progetto e della soluzione.

P ER IM P O STA RE C O STA N T I DA L L A RIGA DI C O M A N DO

-Usare l'opzione -d per immettere le costanti di compilazione condizionale, come nell'esempio seguente:
vbc MyProj.vb /d:conFrenchVersion=–1:conANSI=0
Non è necessario alcuno spazio tra l'opzione -d e la prima costante. Per ulteriori informazioni, vedere -define (Visual Basic).
Le dichiarazioni della riga di comando eseguono l'override delle dichiarazioni immesse in Progettazione progetti, ma non le
cancellano. Gli argomenti impostati in Progettazione progetti rimangono attivi per le compilazioni successive.
Quando si scrivono costanti nel codice, non sono presenti regole rigide per la loro posizione, poiché il relativo ambito è l'intero
modulo in cui sono dichiarati.

P ER IM P O STA RE C O STA N T I N EL C O DIC E

: Inserire le costanti nel blocco di dichiarazione del modulo in cui vengono usate. Ciò consente di organizzare e semplificare la
lettura del codice.

Argomenti correlati
T ITO LO DESC RIZ IO N E

Struttura del programma e convenzioni del codice Fornisce suggerimenti per semplificare la lettura e la gestione
del codice.

Riferimento
#Const (direttiva)
#If... Direttive then... #Else
-define (Visual Basic)
Procedura: Interrompere e combinare istruzioni nel
codice (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Quando si scrive il codice, è possibile creare a volte istruzioni lunghe che richiedono lo scorrimento orizzontale
nell'editor di codice. Sebbene questa operazione non influisca sul modo in cui viene eseguito il codice, è difficile
per l'utente o per chiunque legga il codice visualizzato sul monitor. In questi casi, è consigliabile suddividere la
singola istruzione Long in più righe.

Per suddividere una singola istruzione in più righe


Utilizzare il carattere di continuazione di riga, ovvero un carattere di sottolineatura ( _ ), nel punto in cui si
desidera che la riga si interrompa. Il carattere di sottolineatura deve essere immediatamente preceduto da uno
spazio e seguito da un terminatore di riga (ritorno a capo) o (a partire dalla versione 16,0) di un commento
seguito da un ritorno a capo.

NOTE
In alcuni casi, se si omette il carattere di continuazione di riga, il Visual Basic compilatore continuerà in modo implicito
l'istruzione alla riga di codice successiva. Per un elenco degli elementi della sintassi per i quali è possibile omettere il
carattere di continuazione di riga, vedere "continuazione di riga implicita" nelle istruzioni.

Nell'esempio seguente l'istruzione è suddivisa in quattro righe con caratteri di continuazione di riga che
terminano tutti tranne l'ultima riga.

cmd.CommandText = _
"SELECT * FROM Titles JOIN Publishers " _
& "ON Publishers.PubId = Titles.PubID " _
& "WHERE Publishers.State = 'CA'"

L'uso di questa sequenza rende il codice più facile da leggere, sia online che quando viene stampato.
Il carattere di continuazione di riga deve essere l'ultimo carattere su una riga. Non è possibile seguire altre
operazioni sulla stessa riga.
Esistono alcune limitazioni per la posizione in cui è possibile utilizzare il carattere di continuazione di riga; ad
esempio, non è possibile usarlo nel mezzo di un nome di argomento. È possibile suddividere un elenco di
argomenti con il carattere di continuazione di riga, ma i singoli nomi degli argomenti devono rimanere intatti.
Non è possibile continuare un commento usando un carattere di continuazione di riga. Il compilatore non
esamina i caratteri in un commento per un significato speciale. Per un commento su più righe, ripetere il
simbolo di commento ( ' ) in ogni riga.
Sebbene ogni istruzione venga posizionata in una riga distinta è il metodo consigliato, Visual Basic consente
anche di inserire più istruzioni nella stessa riga.

Per inserire più istruzioni nella stessa riga


Separare le istruzioni con i due punti ( : ), come nell'esempio seguente:
text1.Text = "Hello" : text1.BackColor = System.Drawing.Color.Red

Vedi anche
Struttura del programma e convenzioni del codice
Istruzioni
Procedura: comprimere e nascondere sezioni di
codice (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

La #Region direttiva consente di comprimere e nascondere sezioni di codice in file di Visual Basic. La #Region
direttiva consente di specificare un blocco di codice che è possibile espandere o comprimere quando si usa
l'editor di codice di Visual Studio. La possibilità di nascondere il codice rende i file più gestibili e più facili da
leggere. Per altre informazioni, vedere Struttura.
#Region le direttive supportano la semantica del blocco di codice, ad esempio #If...#End If . Ciò significa che
non possono iniziare in un blocco e terminare con un altro; l'inizio e la fine devono trovarsi nello stesso blocco.
#Region le direttive non sono supportate all'interno di funzioni.

Per comprimere e nascondere una sezione di codice


Inserire la sezione di codice tra le #Region #End Region istruzioni e, come nell'esempio seguente:

#Region "This is the code to be collapsed"


Private components As System.ComponentModel.Container
Dim WithEvents Form1 As System.Windows.Forms.Form

Private Sub InitializeComponent()


components = New System.ComponentModel.Container
Me.Text = "Form1"
End Sub
#End Region

Il #Region blocco può essere utilizzato più volte in un file di codice; pertanto, gli utenti possono definire blocchi
di routine e classi che possono, a loro volta, essere compressi. #Region i blocchi possono anche essere annidati
all'interno di altri #Region blocchi.

NOTE
Il codice nascosto non ne impedisce la compilazione e non influisce sulle #If...#End If istruzioni.

Vedi anche
Compilazione condizionale
#Region (direttiva)
#If... Direttive then... #Else
struttura
Procedura: etichettare le istruzioni (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

I blocchi di istruzioni sono costituiti da righe di codice delimitate da due punti. Le righe di codice precedute da
una stringa di identificazione o un numero intero sono denominate etichettate. Le etichette di istruzione
vengono utilizzate per contrassegnare una riga di codice per identificarla per l'utilizzo con istruzioni quali
On Error Goto .

Le etichette possono essere identificatori Visual Basic validi, ad esempio quelli che identificano gli elementi di
programmazione, o valori letterali integer. Un'etichetta deve essere visualizzata all'inizio di una riga di codice
sorgente e deve essere seguita da due punti, indipendentemente dal fatto che sia seguita da un'istruzione nella
stessa riga.
Il compilatore identifica le etichette controllando se l'inizio della riga corrisponde a qualsiasi identificatore già
definito. In caso contrario, il compilatore presuppone che si tratta di un'etichetta.
Le etichette hanno uno spazio di dichiarazione e non interferiscono con altri identificatori. L'ambito di
un'etichetta è il corpo del metodo. La dichiarazione di etichetta ha la precedenza in qualsiasi situazione ambigua.

NOTE
Le etichette possono essere utilizzate solo su istruzioni eseguibili all'interno di metodi.

Per etichettare una riga di codice


Posizionare un identificatore, seguito da due punti, all'inizio della riga del codice sorgente.
Ad esempio, le righe di codice seguenti sono etichettate Jump rispettivamente con e 120 :

Jump: FileOpen(1, "testFile", OpenMode.Input)


' ...
120: FileClose(1)

Vedi anche
Istruzioni
Declared Element Names
Struttura del programma e convenzioni del codice
Caratteri speciali nel codice (Visual Basic)
05/03/2021 • 6 minutes to read • Edit Online

In alcuni casi è necessario usare caratteri speciali nel codice, ovvero caratteri non alfabetici o numerici. La
punteggiatura e i caratteri speciali del set di caratteri Visual Basic hanno diversi usi, dall'organizzazione del testo
del programma alla definizione delle attività eseguite dal compilatore o dal programma compilato. Questi
caratteri non specificano l'esecuzione di un'operazione.

Parentesi
Usare le parentesi quando si definisce una routine, ad esempio Sub o Function . È necessario racchiudere tra
parentesi tutti gli elenchi di argomenti di routine. È inoltre possibile utilizzare le parentesi per inserire variabili o
argomenti in gruppi logici, in particolare per eseguire l'override dell'ordine predefinito di precedenza degli
operatori in un'espressione complessa. Questa condizione è illustrata nell'esempio seguente.

Dim a, b, c, d, e As Double
a = 3.2
b = 7.6
c = 2
d = b + c / a
e = (b + c) / a

Dopo l'esecuzione del codice precedente, il valore di d è 8,225 e il valore di e è 3. Il calcolo per d utilizza la
precedenza predefinita di / over + ed è equivalente a d = b + (c / a) . Le parentesi nel calcolo per
eseguono l' e override della precedenza predefinita.

Separatori
I separatori eseguono le operazioni che il nome suggerisce: separano sezioni di codice. In Visual Basic il carattere
separatore è costituito dai due punti ( : ). Usare i separatori quando si desidera includere più istruzioni su una
sola riga anziché su righe separate. Questo consente di risparmiare spazio e di migliorare la leggibilità del
codice. Nell'esempio seguente vengono illustrate tre istruzioni separate da due punti.

a = 3.2 : b = 7.6 : c = 2

Per altre informazioni, vedere procedura: interrompere e combinare istruzioni nel codice.
Il carattere due punti ( : ) viene utilizzato anche per identificare un'etichetta di istruzione. Per altre
informazioni, vedere How to: Label statements.

Concatenazione
Utilizzare l' & operatore per la concatenazione o collegare le stringhe. Non confonderla con l' + operatore, che
somma i valori numerici. Se si utilizza l' + operatore per concatenare quando si opera su valori numerici, è
possibile ottenere risultati non corretti. L'esempio seguente illustra questa operazione.
var1 = "10.01"
var2 = 11
resultA = var1 + var2
resultB = var1 & var2

Dopo l'esecuzione del codice precedente, il valore di resultA è 21,01 e il valore di resultB è "10,0111".

Operatori di accesso ai membri


Per accedere a un membro di un tipo, usare l'operatore punto ( . ) o punto esclamativo ( ! ) tra il nome del
tipo e il nome del membro.
Punto (.) Operatore
Usare l' . operatore in una classe, una struttura, un'interfaccia o un'enumerazione come operatore di accesso
ai membri. Il membro può essere un campo, una proprietà, un evento o un metodo. Questa condizione è
illustrata nell'esempio seguente.

Dim nextForm As New System.Windows.Forms.Form


' Access Text member (property) of Form class (on nextForm object).
nextForm.Text = "This is the next form"
' Access Close member (method) on nextForm.
nextForm.Close()

Punto esclamativo (!) Operatore


Usare l' ! operatore solo in una classe o in un'interfaccia come operatore di accesso del dizionario. La classe o
l'interfaccia deve avere una proprietà predefinita che accetta un singolo String argomento. L'identificatore
immediatamente successivo all' ! operatore diventa il valore dell'argomento passato alla proprietà predefinita
sotto forma di stringa. L'esempio seguente illustra questa operazione.

Public Class hasDefault


Default Public ReadOnly Property index(ByVal s As String) As Integer
Get
Return 32768 + AscW(s)
End Get
End Property
End Class
Public Class testHasDefault
Public Sub compareAccess()
Dim hD As hasDefault = New hasDefault()
MsgBox("Traditional access returns " & hD.index("X") & vbCrLf &
"Default property access returns " & hD("X") & vbCrLf &
"Dictionary access returns " & hD!X)
End Sub
End Class

Le tre righe di output di MsgBox tutti visualizzano il valore 32856 . La prima riga usa l'accesso tradizionale alla
proprietà index , il secondo usa il fatto che index è la proprietà predefinita della classe hasDefault e la terza
usa l'accesso tramite dizionario alla classe.
Si noti che il secondo operando dell' ! operatore deve essere un identificatore di Visual Basic valido non
racchiuso tra virgolette doppie ( " " ). In altre parole, non è possibile usare un valore letterale stringa o una
variabile di stringa. La seguente modifica all'ultima riga della MsgBox chiamata genera un errore perché "X" è
un valore letterale stringa racchiuso.
"Dictionary access returns " & hD!"X")
NOTE
I riferimenti alle raccolte predefinite devono essere espliciti. In particolare, non è possibile usare l' ! operatore su una
variabile ad associazione tardiva.

Il ! carattere viene utilizzato anche come Single carattere di tipo.

Vedi anche
Struttura del programma e convenzioni del codice
Caratteri tipo
Commenti nel codice (Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

Negli esempi di codice viene spesso utilizzato il simbolo di commento ( ' ). Questo simbolo indica al
compilatore Visual Basic di ignorare il testo che lo segue o il Commento. I commenti sono brevi annotazioni
descrittive che vengono aggiunte al codice per agevolarne la lettura.
È buona norma di programmazione iniziare tutte le routine con un breve commento che ne descriva le
caratteristiche funzionali, ovvero le operazioni che vengono compiute. Ciò può rivelarsi a proprio vantaggio e di
chi esaminerà il codice. È opportuno separare le informazioni dettagliate relative alle modalità di
implementazione dai commenti che descrivono le caratteristiche funzionali. Quando si includono informazioni
dettagliate sulle modalità di implementazione, è importante che queste vengano aggiornate contestualmente
all'aggiornamento della funzione.
I commenti possono seguire un'istruzione sulla stessa riga oppure occupare una riga intera. Nell'esempio di
codice seguente vengono illustrate entrambe le opzioni.

' This is a comment beginning at the left edge of the screen.


text1.Text = "Hi!" ' This is an inline comment.

Se il commento richiede più di una riga, utilizzare il simbolo di commento su ogni riga, così come viene
illustrato nell'esempio seguente:

' This comment is too long to fit on a single line, so we break


' it into two lines. Some comments might need three or more lines.

Indicazioni sui commenti


Nella tabella riportata di seguito vengono fornite indicazioni generali sui tipi di commenti che possono
precedere una sezione del codice. Si tratta di suggerimenti; Visual Basic non impone regole per l'aggiunta di
commenti. Scrivere il testo che si ritiene più adatto alle proprie esigenze e a quelle di chi leggerà il codice.

Tipo di commento Descrizione del commento

Scopo Descrive le operazioni eseguite dalla routine, non la modalità


di esecuzione

Presupposti Elenca tutte le variabili esterne, i controlli, i file aperti o gli


altri elementi a cui accede la routine

Effetti Elenca tutte le variabili esterne, i controlli o i file interessati,


nonché l'effetto su di essi (solo se non è ovvio)

Input Specifica lo scopo dell'argomento

Restituisce Spiega i valori restituiti dalla routine

È importante tenere presente i seguenti punti:


Le dichiarazioni di variabili importanti devono essere precedute da un commento in cui viene descritto
l'utilizzo della variabile dichiarata.
I nomi di variabili, controlli e routine devono essere descrittivi in modo da rendere necessaria l'aggiunta
di commenti solo per la descrizione di implementazioni complesse.
Non è possibile inserire sulla stessa riga una sequenza di continuazione di riga seguita da un commento.
È possibile aggiungere o rimuovere i simboli di commento per un blocco di codice selezionando una o più righe
di codice e scegliendo il Commento ( ) e rimuovere il Commento ( ) nella barra degli strumenti
modifica .

NOTE
Per aggiungere commenti al codice è possibile anche inserire la parola chiave REM prima del testo. Tuttavia, i ' pulsanti
simbolo e Rimuovi / Commento sono più semplici da utilizzare e richiedono meno spazio e memoria.

Vedi anche
Istinti di base-documentazione del codice con commenti XML
Procedura: Creare documentazione XML
Tag di commento XML
Struttura del programma e convenzioni del codice
Istruzione REM
Parole chiave come nomi di elementi nel codice
(Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Qualsiasi elemento del programma, ad esempio una variabile, una classe o un membro, può avere lo stesso
nome di una parola chiave con restrizioni. Ad esempio, è possibile creare una variabile denominata Loop .
Tuttavia, per fare riferimento alla relativa versione, che ha lo stesso nome della parola chiave Restricted, Loop è
necessario precederla con una stringa di qualificazione completa o racchiuderla tra parentesi quadre ( [ ] ),
come illustrato nell'esempio seguente.

' The following statement precedes Loop with a full qualification string.
sampleForm.Loop.Visible = True
' The following statement encloses Loop in square brackets.
[Loop].Visible = True

Se non si esegue una di queste operazioni, Visual Basic presuppone l'uso della Loop parola chiave intrinseca e
genera un errore, come nell'esempio seguente:
' The following statement causes a compiler error.

Loop.Visible = True

È possibile utilizzare le parentesi quadre per fare riferimento a form e controlli e quando si dichiara una variabile
o si definisce una routine con lo stesso nome di una parola chiave con restrizioni. Può essere facile dimenticare
di qualificare i nomi o includere le parentesi quadre e quindi introdurre errori nel codice e renderlo più difficile
da leggere. Per questo motivo, è consigliabile non usare parole chiave con restrizioni come nomi degli elementi
del programma. Tuttavia, se una versione futura di Visual Basic definisce una parola chiave nuova che è in
conflitto con un modulo o un nome di controllo esistente, è possibile utilizzare questa tecnica quando si
aggiorna il codice per utilizzare la nuova versione.

NOTE
Il programma può inoltre includere i nomi degli elementi forniti da altri assembly a cui si fa riferimento. Se questi nomi
sono in conflitto con parole chiave con restrizioni, l'inserimento di parentesi quadre attorno ad essi causa la Visual Basic di
interpretarli come elementi definiti.

Vedi anche
Convenzioni di denominazione di Visual Basic
Struttura del programma e convenzioni del codice
Parole chiave
Me, My, MyBase e MyClass in Visual Basic
05/03/2021 • 2 minutes to read • Edit Online

Me , My , MyBase e MyClass in Visual Basic hanno nomi simili, ma scopi diversi. In questo argomento vengono
descritte le singole entità per distinguerle.

Me stesso
La Me parola chiave fornisce un modo per fare riferimento all'istanza specifica di una classe o struttura in cui è
attualmente in esecuzione il codice. Me si comporta come una variabile oggetto o una variabile di struttura che
fa riferimento all'istanza corrente. L'utilizzo di Me è particolarmente utile per passare informazioni sull'istanza
attualmente in esecuzione di una classe o di una struttura a una routine in un'altra classe, struttura o modulo.
Si supponga, ad esempio, di avere la procedura seguente in un modulo.

Sub ChangeFormColor(FormName As Form)


Randomize()
FormName.BackColor = Color.FromArgb(Rnd() * 256, Rnd() * 256, Rnd() * 256)
End Sub

È possibile chiamare questa procedura e passare l'istanza corrente della Form classe come argomento usando
l'istruzione seguente.

ChangeFormColor(Me)

My
Questa My funzionalità consente di accedere in modo semplice e intuitivo a numerose classi di .NET
Framework, consentendo all'utente di Visual Basic di interagire con il computer, l'applicazione, le impostazioni,
le risorse e così via.

MyBase
La MyBase parola chiave si comporta come una variabile oggetto che fa riferimento alla classe di base
dell'istanza corrente di una classe. MyBase viene in genere usato per accedere ai membri della classe di base
sottoposti a override o nascosti in una classe derivata. MyBase.New viene usato per chiamare in modo esplicito
un costruttore della classe base da un costruttore di classe derivata.

MyClass
La MyClass parola chiave si comporta come una variabile oggetto che fa riferimento all'istanza corrente di una
classe come implementata originariamente. MyClass è simile a Me , ma tutte le chiamate al metodo su di essa
sono trattate come se il metodo fosse NotOverridable .

Vedi anche
Nozioni fondamentali sull'ereditarietà
Limitazioni di Visual Basic
05/03/2021 • 2 minutes to read • Edit Online

Le versioni precedenti di Visual Basic applicano limiti nel codice, ad esempio la lunghezza dei nomi delle
variabili, il numero di variabili consentite nei moduli e le dimensioni del modulo. In Visual Basic .NET queste
restrizioni sono state attenuate, garantendo una maggiore libertà di scrittura e disposizione del codice.
I limiti fisici dipendono maggiormente dalla memoria in fase di esecuzione rispetto alle considerazioni in fase di
compilazione. Se si usano procedure di programmazione prudenti e si dividono applicazioni di grandi
dimensioni in più classi e moduli, è possibile che si verifichi una limitazione di Visual Basic interna.
Di seguito sono riportate alcune limitazioni che è possibile riscontrare in casi estremi:
Lunghezza del nome. È presente un numero massimo di caratteri per il nome di ogni elemento di
programmazione dichiarato. Questo valore massimo si applica a un'intera stringa di qualificazione se il
nome dell'elemento è qualificato. Vedere Declared Element Names.
Lunghezza riga. È presente un massimo di 65535 caratteri in una riga fisica di codice sorgente. La riga
di codice sorgente logica può essere più lunga se si utilizzano caratteri di continuazione di riga. Vedere
procedura: interrompere e combinare istruzioni nel codice.
Dimensioni della matrice. Per una matrice è possibile dichiarare un numero massimo di dimensioni.
Questo limita il numero di indici che è possibile utilizzare per specificare un elemento di matrice. Vedere
dimensioni della matrice in Visual Basic.
Lunghezza della stringa. È disponibile un numero massimo di caratteri Unicode che è possibile
archiviare in una singola stringa. Vedere tipo di dati String.
Lunghezza della stringa dell'ambiente. Per qualsiasi stringa di ambiente utilizzata come argomento
della riga di comando è disponibile un massimo di 32768 caratteri. Si tratta di una limitazione per tutte le
piattaforme.

Vedi anche
Struttura del programma e convenzioni del codice
Convenzioni di denominazione di Visual Basic
Funzionalità del linguaggio Visual Basic
05/03/2021 • 5 minutes to read • Edit Online

Gli argomenti seguenti introducono e discutono i componenti essenziali di Visual Basic, un linguaggio di
programmazione orientato a oggetti. Dopo aver creato l'interfaccia utente per l'applicazione usando form e
controlli, è necessario scrivere il codice per la definizione del comportamento dell'applicazione. Come per
qualsiasi linguaggio di programmazione moderno, Visual Basic supporta numerosi costrutti di programmazione
e elementi di linguaggio comuni.
Se si conoscono altri linguaggi di programmazione, molti dei concetti trattati in questa sezione potrebbero
sembrare familiari. Anche se la maggior parte dei costrutti è simile a quella di altri linguaggi, la natura guidata
dagli eventi di Visual Basic introduce alcune piccole differenze.
Se non si ha esperienza di programmazione, le informazioni in questa sezione possono fungere da introduzione
ai concetti fondamentali per la scrittura di codice. Una volta appreso le nozioni di base, è possibile creare potenti
applicazioni usando Visual Basic.

Contenuto della sezione


Matrici
Informazioni su come rendere il codice più compatto e potente tramite la dichiarazione e l'uso delle matrici, che
contengono più valori correlati.
Inizializzatori di insieme
Descrizione degli inizializzatori di raccolta, che consentono di creare una raccolta e popolarla con un set iniziale
di valori.
Costanti ed enumerazioni
Informazioni sull'archiviazione dei valori costanti per l'uso ripetuto, compresi i set di valori costanti correlati.
Flusso di controllo
Informazioni su come regolare il flusso di esecuzione del programma.
Tipi di dati
Descrizione dei tipi di dati che può contenere un elemento di programmazione e delle modalità di archiviazione
di tali dati.
Elementi dichiarati
Informazioni sugli elementi di programmazione che è possibile dichiarare, i relativi nomi e caratteristiche e su
come il compilatore risolve i riferimenti a tali elementi.
Delegati
Introduzione ai delegati e ai possibili usi in Visual Basic.
Associazione anticipata e tardiva
Descrizione dell'associazione, eseguita dal compilatore quando un oggetto viene assegnato a una variabile
oggetto, e informazioni sulle differenze tra gli oggetti ad associazione anticipata e tardiva.
Tipi di errore
Panoramica degli errori di sintassi, degli errori di run-time e degli errori di logica.
Eventi
Informazioni su come dichiarare e usare gli eventi.
Interfacce
Descrizione delle caratteristiche delle interfacce e di come si possono usare nelle applicazioni.
LINQ
Vengono forniti collegamenti ad argomenti che introducono le funzionalità e la programmazione di Language-
Integrated query (LINQ).
Oggetti e classi
Panoramica di oggetti e classi, di come vengono usati, delle relazioni tra questi elementi e delle proprietà, dei
metodi e degli eventi che espongono.
Operatori ed espressioni
Descrizione degli elementi di codice che consentono di modificare gli elementi contenenti valori, di come usarli
in modo efficiente e come combinarli per ottenere nuovi valori.
Procedure
Descrizione delle routine Sub , Function , Property e Operator , oltre ad argomenti avanzati quali come le
routine ricorsive e di overload.
Istruzioni
Descrizione della dichiarazione e delle istruzioni eseguibili.
Stringhe
Collegamenti ad argomenti che descrivono i concetti di base sull'uso delle stringhe in Visual Basic.
Variabili
Introduzione alle variabili e descrizione di come usarle in Visual Basic.
XML
Collegamenti ad argomenti che descrivono come usare XML in Visual Basic.

Sezioni correlate
raccolte
Descrizione di alcuni dei tipi di raccolte disponibili in .NET Framework. Viene mostrato come usare raccolte
semplici e raccolte di coppie chiave/valore.
Riferimenti al linguaggio Visual Basic
Vengono fornite informazioni di riferimento su vari aspetti della programmazione Visual Basic.
Matrici in Visual Basic
05/03/2021 • 45 minutes to read • Edit Online

Una matrice è un set di valori, che sono elementi definiti, che sono logicamente correlati tra loro. Una matrice,
ad esempio, può essere costituita dal numero di studenti di ogni classe in una scuola elementare; ogni elemento
della matrice è il numero di studenti in un singolo livello. Analogamente, una matrice può contenere i voti di uno
studente per una classe; ogni elemento della matrice è un singolo livello.
È possibile che singole variabili memorizzino tutti gli elementi di dati. Se, ad esempio, l'applicazione analizza i
voti degli studenti, è possibile usare una variabile separata per ogni livello di studente, ad esempio
englishGrade1 , englishGrade2 e così via. Questo approccio presenta tre limitazioni principali:

Dobbiamo capire in fase di progettazione esattamente il numero di voti da gestire.


La gestione rapida di un numero elevato di voti diventa poco ingombrante. Questa operazione a sua volta
rende molto più probabile che un'applicazione presenti bug gravi.
È difficile da gestire. Ogni nuovo livello aggiunto richiede che l'applicazione venga modificata, ricompilata e
ridistribuita.
Usando una matrice, è possibile fare riferimento a questi valori correlati con lo stesso nome e usare un numero
denominato Indice o pedice per identificare un singolo elemento in base alla relativa posizione nella matrice. Gli
indici di una matrice variano da 0 a uno inferiore al numero totale di elementi nella matrice. Quando si usa
Visual Basic sintassi per definire la dimensione di una matrice, è necessario specificare l'indice più alto, non il
numero totale di elementi nella matrice. È possibile utilizzare la matrice come un'unità e la possibilità di iterare
gli elementi evita di dover capire esattamente il numero di elementi che contiene in fase di progettazione.
Di seguito sono riportati alcuni esempi:

' Declare a single-dimension array of 5 numbers.


Dim numbers(4) As Integer

' Declare a single-dimension array and set its 4 values.


Dim numbers = New Integer() {1, 2, 4, 8}

' Change the size of an existing array to 16 elements and retain the current values.
ReDim Preserve numbers(15)

' Redefine the size of an existing array and reset the values.
ReDim numbers(15)

' Declare a 6 x 6 multidimensional array.


Dim matrix(5, 5) As Double

' Declare a 4 x 3 multidimensional array and set array element values.


Dim matrix = New Integer(3, 2) {{1, 2, 3}, {2, 3, 4}, {3, 4, 5}, {4, 5, 6}}

' Declare a jagged array


Dim sales()() As Double = New Double(11)() {}

Elementi di matrice in una matrice semplice


Viene ora creata una matrice denominata students per archiviare il numero di studenti in ogni classe di una
scuola elementare. Gli indici degli elementi sono compresi tra 0 e 6. L'uso di questa matrice è più semplice
rispetto alla dichiarazione di sette variabili.
Nella figura seguente viene illustrata la students matrice. Per ogni elemento della matrice:
L'indice dell'elemento rappresenta l'anno scolastico (l'indice 0 rappresenta l'asilo).
Il valore contenuto nell'elemento rappresenta il numero degli studenti iscritti a tale anno scolastico.

L'esempio seguente contiene il codice Visual Basic che crea e usa la matrice:

Module SimpleArray
Public Sub Main()
' Declare an array with 7 elements.
Dim students(6) As Integer

' Assign values to each element.


students(0) = 23
students(1) = 19
students(2) = 21
students(3) = 17
students(4) = 19
students(5) = 20
students(6) = 22

' Display the value of each element.


For ctr As Integer = 0 To 6
Dim grade As String = If(ctr = 0, "kindergarten", $"grade {ctr}")
Console.WriteLine($"Students in {grade}: {students(ctr)}")
Next
End Sub
End Module
' The example displays the following output:
' Students in kindergarten: 23
' Students in grade 1: 19
' Students in grade 2: 21
' Students in grade 3: 17
' Students in grade 4: 19
' Students in grade 5: 20
' Students in grade 6: 22

Nell'esempio vengono eseguite tre operazioni:


Dichiara una students matrice con sette elementi. Il numero 6 nella dichiarazione di matrice indica l'ultimo
indice nella matrice, ovvero uno inferiore al numero di elementi nella matrice.
Assegna i valori a ogni elemento nella matrice. Gli elementi della matrice sono accessibili usando il nome
della matrice e includendo l'indice del singolo elemento tra parentesi.
Elenca ogni valore della matrice. Nell'esempio viene utilizzata un' For istruzione per accedere a ogni
elemento della matrice in base al numero di indice.
La students matrice nell'esempio precedente è una matrice unidimensionale perché usa un indice. Una matrice
che usa più indici o indici è detta multidimensionale. Per ulteriori informazioni, vedere il resto di questo articolo
e le dimensioni delle matrici in Visual Basic.
Creazione di una matrice
È possibile definire le dimensioni di una matrice in diversi modi:
È possibile specificare la dimensione quando la matrice viene dichiarata:

' Declare an array with 10 elements.


Dim cargoWeights(9) As Double
' Declare a 24 x 2 array.
Dim hourlyTemperatures(23, 1) As Integer
' Declare a jagged array with 31 elements.
Dim januaryInquiries(30)() As String

È possibile usare una New clausola per specificare la dimensione di una matrice al momento della
creazione:

' Declare an array with 10 elements.


Dim cargoWeights() As Double = New Double(9) {}
' Declare a 24 x 2 array.
Dim hourlyTemperatures(,) As Integer = New Integer(23, 1) {}
' Declare a jagged array with 31 elements.
Dim januaryInquiries()() As String = New String(30)() {}

Se si dispone di una matrice esistente, è possibile ridefinirne la dimensione usando l' ReDim istruzione. È
possibile specificare che l' ReDim istruzione mantenga i valori presenti nella matrice oppure è possibile
specificare che crei una matrice vuota. L'esempio seguente illustra vari modi di usare l'istruzione ReDim per
modificare la dimensione di una matrice esistente.

' Assign a new array size and retain the current values.
ReDim Preserve cargoWeights(20)
' Assign a new array size and retain only the first five values.
ReDim Preserve cargoWeights(4)
' Assign a new array size and discard all current element values.
ReDim cargoWeights(15)

Per ulteriori informazioni, vedere l' istruzione ReDim.

Archiviazione di valori in una matrice


È possibile accedere a ogni posizione in una matrice usando un indice di tipo Integer . È possibile archiviare e
recuperare i valori in una matrice facendo riferimento a ogni posizione della matrice tramite il relativo indice
racchiuso tra parentesi. Gli indici per le matrici multidimensionali sono separati da virgole (,). È necessario un
indice per ogni dimensione della matrice.
Nell'esempio seguente vengono illustrate alcune istruzioni per l'archiviazione e il recupero di valori nelle
matrici.
Module Example
Public Sub Main()
' Create a 10-element integer array.
Dim numbers(9) As Integer
Dim value As Integer = 2

' Write values to it.


For ctr As Integer = 0 To 9
numbers(ctr) = value
value *= 2
Next

' Read and sum the array values.


Dim sum As Integer
For ctr As Integer = 0 To 9
sum += numbers(ctr)
Next
Console.WriteLine($"The sum of the values is {sum:N0}")
End Sub
End Module
' The example displays the following output:
' The sum of the values is 2,046

Popolamento di una matrice con valori letterali di matrice


Usando un valore letterale di matrice, è possibile popolare una matrice con un set iniziale di valori nello stesso
momento in cui viene creata. Un valore letterale di matrice è costituito da un elenco di valori delimitati da
virgole racchiusi tra parentesi graffe ( {} ).
Quando si usa un valore letterale di matrice per creare una matrice, è possibile specificare il tipo o usare
l'inferenza del tipo per determinare il tipo di matrice. Nell'esempio seguente vengono illustrate entrambe le
opzioni.

' Array literals with explicit type definition.


Dim numbers = New Integer() {1, 2, 4, 8}
' Array literals with type inference.
Dim doubles = {1.5, 2, 9.9, 18}
' Array literals with explicit type definition.
Dim articles() As String = { "the", "a", "an" }

' Array literals with explicit widening type definition.


Dim values() As Double = { 1, 2, 3, 4, 5 }

Quando si usa l'inferenza del tipo, il tipo della matrice viene determinato dal tipo dominante nell'elenco di valori
letterali. Il tipo dominante è il tipo in cui tutti gli altri tipi nella matrice possono ampliarsi. Se non è possibile
determinare il tipo univoco, il tipo dominante è il tipo univoco in cui possono restringersi tutti gli altri tipi nella
matrice. Se nessuno di questi tipi univoci può essere determinato, il tipo dominante è Object . Se, ad esempio,
l'elenco di valori fornito al valore letterale di matrice contiene valori di tipo Integer , Long e Double , la matrice
risultante è di tipo Double . Poiché Integer e Long si ampliano solo a Double , Double è il tipo dominante. Per
altre informazioni, vedere Widening and Narrowing Conversions.

NOTE
È possibile utilizzare l'inferenza del tipo solo per le matrici definite come variabili locali in un membro di tipo. Se una
definizione di tipo esplicita è assente, le matrici definite con valori letterali di matrice a livello di classe sono di tipo
Object[] . Per altre informazioni, vedere inferenza dei tipi locali.
Si noti che nell'esempio precedente viene definito values come una matrice di tipo Double anche se tutti i
valori letterali di matrice sono di tipo Integer . È possibile creare questa matrice perché i valori nel valore
letterale di matrice possono ampliarsi ai Double valori.
È inoltre possibile creare e popolare una matrice multidimensionale tramite valori letterali di matrice annidati. I
valori letterali di matrice annidati devono avere un certo numero di dimensioni coerenti con la matrice
risultante. Nell'esempio seguente viene creata una matrice bidimensionale di numeri interi utilizzando valori
letterali di matrice annidati.

' Create and populate a 2 x 2 array.


Dim grid1 = {{1, 2}, {3, 4}}
' Create and populate a 2 x 2 array with 3 elements.
Dim grid2(,) = {{1, 2}, {3, 4}, {5, 6}}

Quando si usano valori letterali di matrice annidati per creare e popolare una matrice, si verifica un errore se il
numero di elementi nei valori letterali di matrice annidati non corrisponde. Si verifica un errore anche se la
variabile di matrice viene dichiarata in modo esplicito con un numero diverso di dimensioni rispetto ai valori
letterali di matrice.
Come è possibile per le matrici unidimensionali, è possibile basarsi sull'inferenza del tipo durante la creazione di
una matrice multidimensionale con valori letterali di matrice annidati. Il tipo dedotto è il tipo dominante per tutti
i valori in tutti i valori letterali di matrice per tutti i livelli di annidamento. Nell'esempio seguente viene creata
una matrice bidimensionale di tipo Double[,] da valori di tipo Integer e Double .

Dim arr = {{1, 2.0}, {3, 4}, {5, 6}, {7, 8}}

Per altri esempi, vedere Procedura: inizializzare una variabile di matrice in Visual Basic.

Iterazione in una matrice


Quando si scorre una matrice, si accede a ogni elemento nella matrice dall'indice più basso al più alto o dal più
alto al più basso. In genere, usare l'oggetto per... Istruzione Next o per each... Istruzione Next per scorrere gli
elementi di una matrice. Quando non si conoscono i limiti superiori della matrice, è possibile chiamare il
Array.GetUpperBound metodo per ottenere il valore massimo dell'indice. Sebbene il valore di indice più basso
sia quasi sempre 0, è possibile chiamare il Array.GetLowerBound metodo per ottenere il valore più basso
dell'indice.
Nell'esempio seguente viene eseguita l'iterazione di una matrice unidimensionale utilizzando l' For...Next
istruzione.

Module IterateArray
Public Sub Main()
Dim numbers = {10, 20, 30}

For index = 0 To numbers.GetUpperBound(0)


Console.WriteLine(numbers(index))
Next
End Sub
End Module
' The example displays the following output:
' 10
' 20
' 30
Nell'esempio seguente viene eseguita l'iterazione di una matrice multidimensionale usando un' For...Next
istruzione. Il metodo GetUpperBound ha un parametro che specifica la dimensione. GetUpperBound(0)
Restituisce l'indice più alto della prima dimensione e GetUpperBound(1) restituisce l'indice più alto della seconda
dimensione.

Module IterateArray
Public Sub Main()
Dim numbers = {{1, 2}, {3, 4}, {5, 6}}

For index0 = 0 To numbers.GetUpperBound(0)


For index1 = 0 To numbers.GetUpperBound(1)
Console.Write($"{numbers(index0, index1)} ")
Next
Console.WriteLine()
Next
End Sub
End Module
' The example displays the following output:
' Output
' 1 2
' 3 4
' 5 6

Nell'esempio seguente viene usato un oggetto per ogni... Istruzione successivaper scorrere una matrice
unidimensionale e una matrice bidimensionale.

Module IterateWithForEach
Public Sub Main()
' Declare and iterate through a one-dimensional array.
Dim numbers1 = {10, 20, 30}

For Each number In numbers1


Console.WriteLine(number)
Next
Console.WriteLine()

Dim numbers = {{1, 2}, {3, 4}, {5, 6}}

For Each number In numbers


Console.WriteLine(number)
Next
End Sub
End Module
' The example displays the following output:
' 10
' 20
' 30
'
' 1
' 2
' 3
' 4
' 5
' 6

Dimensioni della matrice


La dimensione di una matrice è il prodotto delle lunghezze di tutte le relative dimensioni e rappresenta il
numero totale di elementi attualmente contenuti nella matrice. Nell'esempio seguente viene dichiarata una
matrice bidimensionale con quattro elementi in ogni dimensione. Come illustrato nell'output dell'esempio, le
dimensioni della matrice sono pari a 16 (o (3 + 1) * (3 + 1).

Module Example
Public Sub Main()
Dim arr(3, 3) As Integer
Console.WriteLine(arr.Length)
End Sub
End Module
' The example displays the following output:
' 16

NOTE
Questa discussione sulle dimensioni della matrice non si applica alle matrici irregolari. Per informazioni sulle matrici
irregolari e sulla determinazione delle dimensioni di una matrice di matrici, vedere la sezione matrici di matrici.

È possibile determinare le dimensioni di una matrice usando la proprietà Array.Length. È possibile trovare la
lunghezza di ogni dimensione di una matrice multidimensionale usando il Array.GetLength metodo.
È possibile ridimensionare una variabile di matrice assegnando un nuovo oggetto matrice o usando l'istruzione
ReDim Statement . Nell'esempio seguente viene utilizzata l' ReDim istruzione per modificare una matrice di 100
elementi in una matrice di elementi 51.

Module Example
Public Sub Main()
Dim arr(99) As Integer
Console.WriteLine(arr.Length)

Redim arr(50)
Console.WriteLine(arr.Length)
End Sub
End Module
' The example displays the following output:
' 100
' 51

Di seguito sono indicati alcuni elementi importanti relativi alla dimensione di una matrice.

Lunghezza delle dimensioni L'indice di ogni dimensione è in base 0, ovvero è compreso


tra 0 e il relativo limite superiore. La lunghezza di una
determinata dimensione è quindi maggiore di uno rispetto al
limite superiore dichiarato di tale dimensione.

Limiti di lunghezza La lunghezza di ogni dimensione di una matrice è limitata al


valore massimo del tipo di Integer dati, ovvero
Int32.MaxValue o (2 ^ 31)-1. La dimensione totale di una
matrice, tuttavia, è limitata anche dalla memoria disponibile
nel sistema. Se si tenta di inizializzare una matrice che supera
la quantità di memoria disponibile, il runtime genera
un'eccezione OutOfMemoryException .
Dimensione ed elementi della matrice La dimensione di una matrice è indipendente dal tipo di dati
dei relativi elementi. La dimensione rappresenta sempre il
numero totale di elementi e non il numero di byte utilizzati
in memoria.

Consumo di memoria Non è possibile fare ipotesi sulla modalità di archiviazione di


una matrice in memoria. L'archiviazione dipende dalla
larghezza dei dati delle diverse piattaforme. Di conseguenza,
è possibile che l'archiviazione di una stessa matrice richieda
più memoria in un sistema a 64 bit che in un sistema a 32
bit. A seconda della configurazione di sistema al momento
dell'inizializzazione di una matrice, Common Language
Runtime (CLR) può assegnare la memoria in modo da
compattare al massimo gli elementi oppure in modo da
allinearli tutti in base ai limiti dell'hardware. Per le
informazioni di controllo di una matrice è richiesto un
sovraccarico di archiviazione che aumenta con ogni
dimensione aggiunta.

Tipo di matrice
Ogni matrice ha un tipo di dati che differisce dal tipo di dati dei relativi elementi. Non esiste un singolo tipo di
dati per tutte le matrici. Il tipo di dati di una matrice viene invece determinato dal numero di dimensioni, o
rango, della matrice e dal tipo di dati degli elementi nella matrice. Due variabili di matrice hanno lo stesso tipo di
dati solo se hanno lo stesso rango e i relativi elementi hanno lo stesso tipo di dati. La lunghezza delle dimensioni
di una matrice non influisce sul tipo di dati della matrice.
Ogni matrice eredita dalla classe System.Array. È possibile dichiarare una variabile di tipo Array , ma non è
possibile creare una matrice di tipo Array . Ad esempio, anche se il codice seguente dichiara arr che la
variabile è di tipo Array e chiama il Array.CreateInstance metodo per creare un'istanza della matrice, il tipo della
matrice viene dimostrato come oggetto [].

Module Example
Public Sub Main()
Dim arr As Array = Array.CreateInstance(GetType(Object), 19)
Console.WriteLine(arr.Length)
Console.WriteLine(arr.GetType().Name)
End Sub
End Module
' The example displays the following output:
' 19
' Object[]

L'istruzione ReDim non può inoltre operare su una variabile dichiarata di tipo Array . Per questi motivi, e per
l'indipendenza dai tipi, è consigliabile dichiarare ogni matrice come un tipo specifico.
È possibile determinare il tipo di dati di una matrice o dei relativi elementi in diversi modi.
È possibile chiamare il GetType Metodo sulla variabile per ottenere un Type oggetto che rappresenta il tipo in
fase di esecuzione della variabile. Nelle proprietà e nei metodi dell'oggetto Type sono presenti informazioni
complete.
È possibile passare la variabile alla TypeName funzione per ottenere un oggetto String con il nome del tipo
in fase di esecuzione.
Nell'esempio seguente vengono chiamati sia il GetType metodo che la TypeName funzione per determinare il
tipo di una matrice. Il tipo di matrice è Byte(,) . Si noti che la Type.BaseType proprietà indica anche che il tipo di
base della matrice di byte è la Array classe.

Module Example
Public Sub Main()
Dim bytes(9,9) As Byte
Console.WriteLine($"Type of {nameof(bytes)} array: {bytes.GetType().Name}")
Console.WriteLine($"Base class of {nameof(bytes)}: {bytes.GetType().BaseType.Name}")
Console.WriteLine()
Console.WriteLine($"Type of {nameof(bytes)} array: {TypeName(bytes)}")
End Sub
End Module
' The example displays the following output:
' Type of bytes array: Byte[,]
' Base class of bytes: Array
'
' Type of bytes array: Byte(,)

Matrici come valori restituiti e parametri


Per restituire una matrice da una routine Function , specificare il tipo di dati della matrice e il numero di
dimensioni come tipo restituito dell'istruzione Function. All'interno della funzione dichiarare una variabile di
matrice locale con lo stesso tipo di dati degli elementi e lo stesso numero di dimensioni. Includere la variabile di
matrice locale senza parentesi nell'istruzione Return.
Per specificare una matrice come parametro in una routine Sub o Function , definire il parametro come
matrice con un tipo di dati e un numero di dimensioni specificati. Nella chiamata alla routine passare una
variabile di matrice con lo stesso tipo di dati e il numero di dimensioni.
Nell'esempio seguente, la GetNumbers funzione restituisce un oggetto Integer() , una matrice unidimensionale
di tipo Integer . La routine ShowNumbers accetta un argomento Integer() .

Module ReturnValuesAndParams
Public Sub Main()
Dim numbers As Integer() = GetNumbers()
ShowNumbers(numbers)
End Sub

Private Function GetNumbers() As Integer()


Dim numbers As Integer() = {10, 20, 30}
Return numbers
End Function

Private Sub ShowNumbers(numbers As Integer())


For index = 0 To numbers.GetUpperBound(0)
Console.WriteLine($"{numbers(index)} ")
Next
End Sub
End Module
' The example displays the following output:
' 10
' 20
' 30

Nell'esempio seguente, la GetNumbersMultiDim funzione restituisce un oggetto Integer(,) , una matrice


bidimensionale di tipo Integer . La routine ShowNumbersMultiDim accetta un argomento Integer(,) .

Module Example
Public Sub Main()
Dim numbers As Integer(,) = GetNumbersMultidim()
ShowNumbersMultidim(numbers)
End Sub

Private Function GetNumbersMultidim() As Integer(,)


Dim numbers As Integer(,) = {{1, 2}, {3, 4}, {5, 6}}
Return numbers
End Function

Private Sub ShowNumbersMultidim(numbers As Integer(,))


For index0 = 0 To numbers.GetUpperBound(0)
For index1 = 0 To numbers.GetUpperBound(1)
Console.Write($"{numbers(index0, index1)} ")
Next
Console.WriteLine()
Next
End Sub
End Module
' The example displays the following output:
' 1 2
' 3 4
' 5 6

Matrici di matrici
In alcuni casi la struttura dei dati nell'applicazione è bidimensionale, ma non rettangolare. Ad esempio, è
possibile usare una matrice per archiviare i dati relativi alla temperatura elevata di ogni giorno del mese. La
prima dimensione della matrice rappresenta il mese, ma la seconda dimensione rappresenta il numero di giorni
e il numero di giorni in un mese non è uniforme. Una matrice irregolare, definita anche matrice di matrici, è
progettata per scenari di questo tipo. Una matrice irregolare è una matrice i cui elementi sono anche matrici.
Una matrice irregolare e ogni elemento di una matrice irregolare possono avere una o più dimensioni.
Nell'esempio seguente viene utilizzata una matrice di mesi, ogni elemento di che è una matrice di giorni.
Nell'esempio viene utilizzata una matrice di matrici perché i mesi diversi hanno un numero di giorni diverso.
Nell'esempio viene illustrato come creare una matrice di matrici, assegnarvi valori e recuperare e visualizzare i
relativi valori.

Imports System.Globalization

Module JaggedArray
Public Sub Main()
' Declare the jagged array of 12 elements. Each element is an array of Double.
Dim sales(11)() As Double
' Set each element of the sales array to a Double array of the appropriate size.
For month As Integer = 0 To 11
' The number of days in the month determines the appropriate size.
Dim daysInMonth As Integer =
DateTime.DaysInMonth(Year(Now), month + 1)
sales(month) = New Double(daysInMonth - 1) {}
Next

' Store values in each element.


For month As Integer = 0 To 11
For dayOfMonth = 0 To sales(month).GetUpperBound(0)
sales(month)(dayOfMonth) = (month * 100) + dayOfMonth
Next
Next
Next

' Retrieve and display the array values.


Dim monthNames = DateTimeFormatInfo.CurrentInfo.AbbreviatedMonthNames
' Display the month names.
Console.Write(" ")
For ctr = 0 To sales.GetUpperBound(0)
Console.Write($" {monthNames(ctr)} ")
Next
Console.WriteLine()
' Display data for each day in each month.
For dayInMonth = 0 To 30
Console.Write($"{dayInMonth + 1,2}. ")
For monthNumber = 0 To sales.GetUpperBound(0)
If dayInMonth > sales(monthNumber).GetUpperBound(0) Then
Console.Write(" ")
Else
Console.Write($"{sales(monthNumber)(dayInMonth),-5} ")
End If
Next
Console.WriteLine()
Next
End Sub
End Module
' The example displays the following output:
' Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
' 1. 0 100 200 300 400 500 600 700 800 900 1000 1100
' 2. 1 101 201 301 401 501 601 701 801 901 1001 1101
' 3. 2 102 202 302 402 502 602 702 802 902 1002 1102
' 4. 3 103 203 303 403 503 603 703 803 903 1003 1103
' 5. 4 104 204 304 404 504 604 704 804 904 1004 1104
' 6. 5 105 205 305 405 505 605 705 805 905 1005 1105
' 7. 6 106 206 306 406 506 606 706 806 906 1006 1106
' 8. 7 107 207 307 407 507 607 707 807 907 1007 1107
' 9. 8 108 208 308 408 508 608 708 808 908 1008 1108
' 10. 9 109 209 309 409 509 609 709 809 909 1009 1109
' 11. 10 110 210 310 410 510 610 710 810 910 1010 1110
' 12. 11 111 211 311 411 511 611 711 811 911 1011 1111
' 13. 12 112 212 312 412 512 612 712 812 912 1012 1112
' 14. 13 113 213 313 413 513 613 713 813 913 1013 1113
' 15. 14 114 214 314 414 514 614 714 814 914 1014 1114
' 16. 15 115 215 315 415 515 615 715 815 915 1015 1115
' 17. 16 116 216 316 416 516 616 716 816 916 1016 1116
' 18. 17 117 217 317 417 517 617 717 817 917 1017 1117
' 19. 18 118 218 318 418 518 618 718 818 918 1018 1118
' 20. 19 119 219 319 419 519 619 719 819 919 1019 1119
' 21. 20 120 220 320 420 520 620 720 820 920 1020 1120
' 22. 21 121 221 321 421 521 621 721 821 921 1021 1121
' 23. 22 122 222 322 422 522 622 722 822 922 1022 1122
' 24. 23 123 223 323 423 523 623 723 823 923 1023 1123
' 25. 24 124 224 324 424 524 624 724 824 924 1024 1124
' 26. 25 125 225 325 425 525 625 725 825 925 1025 1125
' 27. 26 126 226 326 426 526 626 726 826 926 1026 1126
' 28. 27 127 227 327 427 527 627 727 827 927 1027 1127
' 29. 28 228 328 428 528 628 728 828 928 1028 1128
' 30. 29 229 329 429 529 629 729 829 929 1029 1129
' 31. 30 230 430 630 730 930 1130

Nell'esempio precedente i valori vengono assegnati alla matrice di matrici in base a un elemento per elemento
tramite un For...Next ciclo. È anche possibile assegnare valori agli elementi di una matrice irregolare usando
valori letterali di matrice annidati. Tuttavia, il tentativo di usare valori letterali di matrice annidati, ad esempio,
Dim valuesjagged = {{1, 2}, {2, 3, 4}} genera l'errore del compilatore BC30568. Per correggere l'errore,
racchiudere tra parentesi i valori letterali della matrice interna. Le parentesi forzano la valutazione
dell'espressione letterale di matrice e i valori risultanti vengono usati con il valore letterale di matrice esterno,
come illustrato nell'esempio riportato di seguito.
Module Example
Public Sub Main()
Dim values1d = { 1, 2, 3 }
Dim values2d = {{1, 2}, {2, 3}, {3, 4}}
Dim valuesjagged = {({1, 2}), ({2, 3, 4})}
End Sub
End Module

Una matrice di matrici è una matrice unidimensionale i cui elementi contengono matrici. Pertanto, la
Array.Length proprietà e il Array.GetLength(0) metodo restituiscono il numero di elementi nella matrice
unidimensionale e Array.GetLength(1) genera un oggetto IndexOutOfRangeException perché una matrice
irregolare non è multidimensionale. Per determinare il numero di elementi in ogni sottomatrice è necessario
recuperare il valore della proprietà di ogni sottomatrice Array.Length . Nell'esempio seguente viene illustrato
come determinare il numero di elementi in una matrice di matrici.

Module Example
Public Sub Main()
Dim jagged = { ({1, 2}), ({2, 3, 4}), ({5, 6}), ({7, 8, 9, 10}) }
Console.WriteLine($"The value of jagged.Length: {jagged.Length}.")
Dim total = jagged.Length
For ctr As Integer = 0 To jagged.GetUpperBound(0)
Console.WriteLine($"Element {ctr + 1} has {jagged(ctr).Length} elements.")
total += jagged(ctr).Length
Next
Console.WriteLine($"The total number of elements in the jagged array: {total}")
End Sub
End Module
' The example displays the following output:
' The value of jagged.Length: 4.
' Element 1 has 2 elements.
' Element 2 has 3 elements.
' Element 3 has 2 elements.
' Element 4 has 4 elements.
' The total number of elements in the jagged array: 15

Matrici di lunghezza zero


Visual Basic distingue tra una matrice non inizializzata (una matrice il cui valore è Nothing ) e una matrice di
lunghezza zero o una matrice vuota, ovvero una matrice priva di elementi. Una matrice non inizializzata è una
matrice che non è stata dimensionata o a cui sono stati assegnati valori. Ad esempio:

Dim arr() As String

Una matrice di lunghezza zero viene dichiarata con una dimensione di-1. Ad esempio:

Dim arrZ(-1) As String

Potrebbe essere necessario creare una matrice di lunghezza zero nelle circostanze seguenti:
Senza rischiare un' NullReferenceException eccezione, il codice deve accedere ai membri della Array
classe, ad esempio Length o Rank , oppure chiamare una funzione Visual Basic quale UBound .
Si vuole che il codice venga mantenuto semplice, non è necessario verificarlo Nothing come caso
speciale.
Il codice interagisce con un'API (Application Programming Interface) che richiede il passaggio di una
matrice di lunghezza zero a una o più routine oppure che restituisce una matrice di lunghezza zero da
una o più routine.

Suddivisione di una matrice


In alcuni casi, potrebbe essere necessario suddividere una singola matrice in più matrici. Ciò implica
l'identificazione del punto o dei punti in cui deve essere divisa la matrice, quindi la copia della matrice in due o
più matrici separate.

NOTE
In questa sezione non viene illustrata la suddivisione di una singola stringa in una matrice di stringhe basata su un
delimitatore. Per informazioni sulla suddivisione di una stringa, vedere il String.Split metodo.

I criteri più comuni per suddividere una matrice sono:


Numero di elementi nella matrice. Ad esempio, potrebbe essere necessario suddividere una matrice di
più di un numero specificato di elementi in un numero di parti approssimativamente uguali. A questo
scopo, è possibile usare il valore restituito dal Array.Length Array.GetLength metodo o.
Valore di un elemento che funge da delimitatore che indica dove deve essere suddivisa la matrice. È
possibile cercare un valore specifico chiamando i Array.FindIndex Array.FindLastIndex metodi e.
Dopo aver determinato l'indice o gli indici in corrispondenza del quale deve essere suddivisa la matrice, è
possibile creare le singole matrici chiamando il Array.Copy metodo.
Nell'esempio seguente una matrice viene suddivisa in due matrici di dimensioni approssimativamente uguali.
Se il numero totale di elementi della matrice è dispari, la prima matrice avrà un elemento maggiore del secondo.

Module Example
Public Sub Main()
' Create an array of 100 elements.
Dim arr(99) As Integer
' Populate the array.
Dim rnd As new Random()
For ctr = 0 To arr.GetUpperBound(0)
arr(ctr) = rnd.Next()
Next

' Determine how many elements should be in each array.


Dim divisor = 2
Dim remainder As Integer
Dim boundary = Math.DivRem(arr.GetLength(0), divisor, remainder)

' Copy the array.


Dim arr1(boundary - 1 + remainder), arr2(boundary - 1) as Integer
Array.Copy(arr, 0, arr1, 0, boundary + remainder)
Array.Copy(arr, boundary + remainder, arr2, 0, arr.Length - boundary)
End Sub
End Module

Nell'esempio seguente viene divisa una matrice di stringhe in due matrici in base alla presenza di un elemento il
cui valore è "zzz", che funge da delimitatore di matrice. Le nuove matrici non includono l'elemento che contiene
il delimitatore.
Module Example
Public Sub Main()
Dim rnd As New Random()

' Create an array of 100 elements.


Dim arr(99) As String
' Populate each element with an arbitrary ASCII character.
For ctr = 0 To arr.GetUpperBound(0)
arr(ctr) = ChrW(Rnd.Next(&h21, &h7F))
Next
' Get a random number that will represent the point to insert the delimiter.
arr(rnd.Next(0, arr.GetUpperBound(0))) = "zzz"

' Find the delimiter.


Dim location = Array.FindIndex(arr, Function(x) x = "zzz")

' Create the arrays.


Dim arr1(location - 1) As String
Dim arr2(arr.GetUpperBound(0) - location - 1) As String

' Populate the two arrays.


Array.Copy(arr, 0, arr1, 0, location)
Array.Copy(arr, location + 1, arr2, 0, arr.GetUpperBound(0) - location)
End Sub
End Module

Unione di matrici
È anche possibile combinare un numero di matrici in una singola matrice più grande. A tale scopo, è possibile
usare anche il Array.Copy metodo.

NOTE
Questa sezione non illustra l'aggiunta di una matrice di stringhe in una singola stringa. Per informazioni sull'aggiunta di
una matrice di stringhe, vedere il String.Join metodo.

Prima di copiare gli elementi di ogni matrice nella nuova matrice, è necessario prima di tutto assicurarsi di avere
inizializzato la matrice in modo che sia sufficientemente grande da contenere la nuova matrice. Questa
operazione può essere eseguita in due modi:
Usare l' ReDim Preserve istruzione per espandere dinamicamente la matrice prima di aggiungervi nuovi
elementi. Questa è la tecnica più semplice, ma può comportare una riduzione delle prestazioni e un utilizzo
eccessivo della memoria durante la copia di matrici di grandi dimensioni.
Calcolare il numero totale di elementi necessari per la nuova matrice di grandi dimensioni, quindi
aggiungervi gli elementi di ogni matrice di origine.
Nell'esempio seguente viene usato il secondo approccio per aggiungere quattro matrici con dieci elementi
ciascuno a una singola matrice.
Imports System.Collections.Generic
Imports System.Threading.Tasks

Module Example
Public Sub Main()
Dim tasks As New List(Of Task(Of Integer()))
' Generate four arrays.
For ctr = 0 To 3
Dim value = ctr
tasks.Add(Task.Run(Function()
Dim arr(9) As Integer
For ndx = 0 To arr.GetUpperBound(0)
arr(ndx) = value
Next
Return arr
End Function))
Next
Task.WaitAll(tasks.ToArray())
' Compute the number of elements in all arrays.
Dim elements = 0
For Each task In tasks
elements += task.Result.Length
Next
Dim newArray(elements - 1) As Integer
Dim index = 0
For Each task In tasks
Dim n = task.Result.Length
Array.Copy(task.Result, 0, newArray, index, n)
index += n
Next
Console.WriteLine($"The new array has {newArray.Length} elements.")
End Sub
End Module
' The example displays the following output:
' The new array has 40 elements.

Poiché in questo caso le matrici di origine sono di dimensioni ridotte, è anche possibile espandere
dinamicamente la matrice quando si aggiungono gli elementi di ogni nuova matrice. Nell'esempio seguente
viene eseguita questa operazione.
Imports System.Collections.Generic
Imports System.Threading.Tasks

Module Example
Public Sub Main()
Dim tasks As New List(Of Task(Of Integer()))
' Generate four arrays.
For ctr = 0 To 3
Dim value = ctr
tasks.Add(Task.Run(Function()
Dim arr(9) As Integer
For ndx = 0 To arr.GetUpperBound(0)
arr(ndx) = value
Next
Return arr
End Function))
Next
Task.WaitAll(tasks.ToArray())

' Dimension the target array and copy each element of each source array to it.
Dim newArray() As Integer = {}
' Define the next position to copy to in newArray.
Dim index = 0
For Each task In tasks
Dim n = Task.Result.Length
ReDim Preserve newArray(newArray.GetUpperBound(0) + n)
Array.Copy(task.Result, 0, newArray, index, n)
index += n
Next
Console.WriteLine($"The new array has {newArray.Length} elements.")
End Sub
End Module
' The example displays the following output:
' The new array has 40 elements.

Raccolte come alternativa alle matrici


Le matrici sono estremamente utili per la creazione e l'uso di un numero fisso di oggetti fortemente tipizzati. Le
raccolte consentono di lavorare in modo più flessibile con gruppi di oggetti. Diversamente dalle matrici, che
richiedono la modifica esplicita delle dimensioni di una matrice con l' ReDim istruzione, le raccolte crescono e si
riducono dinamicamente in base alle esigenze di un'applicazione.
Quando si usa ReDim per ridimensionare una matrice, Visual Basic crea una nuova matrice e rilascia quella
precedente. Questa operazione causa un aumento del tempo di esecuzione. Di conseguenza, se il numero di
elementi che si utilizza cambiano di frequente oppure non è possibile prevedere il numero massimo di elementi
necessari, in genere si otterranno prestazioni migliori utilizzando una raccolta.
Per alcune raccolte è possibile assegnare una chiave a qualsiasi oggetto inserito nella raccolta in modo da
recuperare rapidamente l'oggetto usando la chiave.
Se la raccolta contiene elementi di un solo tipo di dati, è possibile usare una delle classi dello spazio dei nomi
System.Collections.Generic. In una raccolta generica viene imposta l'indipendenza dai tipi, in modo da impedire
che vengano aggiunti altri tipi di dati alla raccolta.
Per altre informazioni sulle raccolte, vedere Raccolte.

Argomenti correlati
T ERM IN E DEF IN IZ IO N E

Array Dimensions in Visual Basic Illustra il numero di dimensioni, o rango, e le dimensioni


delle matrici.

Procedura: Inizializzare una variabile di matrice in Visual Basic Descrive come popolare le matrici con valori iniziali.

Procedura: ordinare una matrice in Visual Basic Illustra come ordinare alfabeticamente gli elementi di una
matrice.

Procedura: Assegnare una matrice a un'altra matrice Descrive regole e passaggi per l'assegnazione di una matrice
a un'altra variabile di matrice.

Risoluzione dei problemi relativi alle matrici Illustra alcuni problemi comuni che si verificano quando si
usano le matrici.

Vedi anche
System.Array
Istruzione Dim
Istruzione ReDim
Inizializzatori di raccolta (Visual Basic)
05/03/2021 • 9 minutes to read • Edit Online

Gli inizializzatori di insieme consentono di creare una raccolta e popolarla con un set iniziale di valori. Gli
inizializzatori di insieme sono utili quando si crea una raccolta da un set di valori noti, ad esempio un elenco di
opzioni di menu o categorie, un set iniziale di valori numerici, un elenco statico di stringhe quali nomi di giorni o
mesi o un elenco di aree geografiche, ad esempio un elenco di stati che viene usato per la convalida.
Per altre informazioni sulle raccolte, vedere Raccolte.
È possibile identificare un inizializzatore di insieme usando la parola chiave From seguita da parentesi graffe (
{} ). Questo approccio è simile alla sintassi dei valori letterali di matrice, descritta in Matrici. Gli esempi seguenti
illustrano diversi metodi d'uso degli inizializzatori di insieme per la creazione di raccolte.

' Create an array of type String().


Dim winterMonths = {"December", "January", "February"}

' Create an array of type Integer()


Dim numbers = {1, 2, 3, 4, 5}

' Create a list of menu options. (Requires an extension method


' named Add for List(Of MenuOption)
Dim menuOptions = New List(Of MenuOption) From {{1, "Home"},
{2, "Products"},
{3, "News"},
{4, "Contact Us"}}

NOTE
Anche C# offre inizializzatori di insieme. Gli inizializzatori di insieme di C# offrono la stessa funzionalità degli inizializzatori
di insieme di Visual Basic. Per altre informazioni sugli inizializzatori di insieme di C#, vedere Inizializzatori di oggetto e di
insieme.

Sintassi
Un inizializzatore di insieme è costituito da un elenco di valori delimitati da virgole racchiusi tra parentesi graffe
( {} ) e preceduti dalla parola chiave From come illustrato nel codice seguente.

Dim names As New List(Of String) From {"Christa", "Brian", "Tim"}

Quando si crea una raccolta, ad esempio List<T> o Dictionary<TKey,TValue>, è necessario specificare il tipo di
raccolta prima dell'inizializzatore di insieme, come illustrato nel codice seguente.

Public Class AppMenu


Public Property Items As List(Of String) =
New List(Of String) From {"Home", "About", "Contact"}
End Class
NOTE
È possibile combinare un inizializzatore di insieme e un inizializzatore di oggetto per inizializzare lo stesso oggetto raccolta.
È possibile usare gli inizializzatori di oggetto per inizializzare oggetti in un inizializzatore di insieme.

Creazione di una raccolta tramite un inizializzatore di raccolta


Quando si crea una raccolta usando un inizializzatore di insieme, ogni valore specificato nell'inizializzatore di
insieme viene passato al metodo Add appropriato della raccolta. Se ad esempio si crea un List<T> usando un
inizializzatore di insieme, ogni valore stringa nell'inizializzatore di insieme viene passato al metodo Add. Se si
vuole creare una raccolta usando un inizializzatore di insieme, il tipo specificato deve essere un tipo di raccolta
valido. Sono esempi di tipi di raccolta validi le classi che implementano l'interfaccia IEnumerable<T> o ereditano
la classe CollectionBase. Il tipo specificato deve anche esporre un metodo Add che soddisfa i criteri seguenti.
Il metodo Add deve essere disponibile dall'ambito in cui viene chiamato l'inizializzatore di insieme. Non
è necessario che il metodo Add sia pubblico se l'inizializzatore di insieme è usato in uno scenario in cui è
possibile accedere a metodi non pubblici della raccolta.
Il metodo Add deve essere un membro di istanza o un membro Shared della classe di raccolta oppure
un metodo di estensione.
Deve esistere un metodo Add che può corrispondere ai tipi specificati nell'inizializzatore di insieme, in
base alle regole di risoluzione dell'overload.
Il codice di esempio seguente illustra come creare una raccolta List(Of Customer) usando un inizializzatore di
insieme. Quando il codice viene eseguito ogni oggetto Customer viene passato al metodo Add(Customer)
dell'elenco generico.

Dim customers = New List(Of Customer) From


{
New Customer("City Power & Light", "http://www.cpandl.com/"),
New Customer("Wide World Importers", "http://www.wideworldimporters.com/"),
New Customer("Lucerne Publishing", "http://www.lucernepublishing.com/")
}

L'esempio di codice seguente visualizza codice equivalente che non usa un inizializzatore di insieme.

Dim customers = New List(Of Customer)


customers.Add(New Customer("City Power & Light", "http://www.cpandl.com/"))
customers.Add(New Customer("Wide World Importers", "http://www.wideworldimporters.com/"))
customers.Add(New Customer("Lucerne Publishing", "http://www.lucernepublishing.com/"))

Se la raccolta ha un metodo Add con parametri che corrispondono al costruttore dell'oggetto Customer è
possibile nidificare i valori dei parametri per il metodo Add all'interno di inizializzatori di insieme, come
descritto nella sezione successiva. Se la raccolta non dispone di tale metodo Add è possibile crearne uno come
metodo di estensione. Per un esempio di creazione di un metodo Add come metodo di estensione per una
raccolta, vedere Procedura: Creare un metodo di estensione Add usato da un inizializzatore di insieme. Per un
esempio di creazione di una raccolta personalizzata che può essere usata con un inizializzatore di insieme,
vedere Procedura: Creare una raccolta usata da un inizializzatore di insieme.

Annidamento di inizializzatori di insieme


È possibile annidare valori in un inizializzatore di insieme per identificare un overload specifico di un metodo
Add per la raccolta che viene creata. I valori passati al metodo Add devono essere separati da virgole e
racchiusi tra parentesi graffe ( {} ), come nella sintassi di un valore letterale di matrice o di un inizializzatore di
insieme.
Quando si crea una raccolta usando valori annidati ogni elemento dell'elenco di valori annidati viene passato
come argomento al metodo Add , che corrisponde ai tipi di elemento. Ad esempio il codice seguente crea un
Dictionary<TKey,TValue> in cui le chiavi sono di tipo Integer e i valori sono di tipo String . Ogni elenco di
valori annidati viene associato al metodo Add per Dictionary .

Dim days = New Dictionary(Of Integer, String) From


{{0, "Sunday"}, {1, "Monday"}}

Il codice dell'esempio precedente equivale al seguente codice.

Dim days = New Dictionary(Of Integer, String)


days.Add(0, "Sunday")
days.Add(1, "Monday")

Solo gli elenchi di valori annidati al primo livello di annidamento vengono inviati al metodo Add per il tipo di
raccolta. I livelli di annidamento più profondi vengono considerati come valori letterali di matrice e gli elenchi di
valori annidati non vengono associati al metodo Add di una raccolta.

Argomenti correlati
T ITO LO DESC RIZ IO N E

Procedura: creare un metodo di estensione Add utilizzato da Illustra come creare un metodo di estensione denominato
un inizializzatore di raccolta Add che può essere usato per popolare una raccolta con
valori di un inizializzatore di insieme.

Procedura: Creare una raccolta usata da un inizializzatore di Illustra come abilitare l'uso di un inizializzatore di insieme
raccolta includendo un metodo Add in una classe di raccolte che
implementa IEnumerable .

Vedi anche
raccolte
Matrici
Inizializzatori di oggetto: tipi denominati e tipi anonimi
Operatore New
Proprietà implementate automaticamente
Procedura: Inizializzare una variabile di matrice in Visual Basic
Inferenza del tipo di variabile locale
Tipi anonimi
Introduzione a LINQ in Visual Basic
Procedura: Creare un elenco di elementi
Costanti ed enumerazioni in Visual Basic
05/03/2021 • 2 minutes to read • Edit Online

Le costanti consentono di usare nomi significativi al posto di un valore che non cambia. Archiviano i valori che,
come suggerisce il nome, rimangono costanti durante l'esecuzione di un'applicazione. È possibile usare le
costanti per specificare nomi descrittivi, anziché numeri, rendendo il codice più leggibile.
Le enumerazioni offrono un modo pratico per usare i set di costanti correlate e per associare i valori delle
costanti ai nomi. Ad esempio, si può dichiarare un'enumerazione per un set di costanti integer associate ai giorni
della settimana e quindi usare i nomi dei giorni anziché i relativi valori integer nel codice.

Contenuto della sezione


T ERM IN E DEF IN IZ IO N E

Cenni preliminari sulle costanti Gli argomenti di questa sezione descrivono le costanti e il
relativo utilizzo.

Cenni preliminari sulle enumerazioni Gli argomenti di questa sezione descrivono le enumerazioni
e il relativo utilizzo.

Sezioni correlate
T ERM IN E DEF IN IZ IO N E

Istruzione Const Viene descritta l'istruzione Const , usata per dichiarare le


costanti.

Istruzione Enum Viene descritta l'istruzione Enum , usata per creare le


enumerazioni.

Istruzione Option Explicit Viene descritta l'istruzione Option Explicit , usata a livello
di modulo per imporre la dichiarazione esplicita di tutte le
variabili di tale modulo.

Option Infer (istruzione) Viene descritta l'istruzione Option Infer , che abilita l'uso
dell'inferenza del tipo di variabile locale nelle variabili
dichiaranti.

Option Strict Statement Viene descritta l'istruzione Option Strict , che limita le
conversioni implicite di tipi di dati sollo alle conversioni verso
tipi di dati più grandi, non consente l'associazione tardiva né
la tipizzazione implicita che genera un tipo Object .
Flusso di controllo in Visual Basic
05/03/2021 • 2 minutes to read • Edit Online

Se non vengono applicate regole, un programma procede attraverso le relative istruzioni dall'inizio alla fine.
Alcuni programmi molto semplici possono essere scritti con solo questo flusso unidirezionale. Tuttavia,
l'efficacia e l'utilità di un linguaggio di programmazione sono in gran parte correlate alla possibilità di
modificare l'ordine di esecuzione con cicli e istruzioni di controllo.
Le strutture di controllo consentono di regolare il flusso di esecuzione del programma. Usando le strutture di
controllo, è possibile scrivere Visual Basic codice che prende decisioni o che ripete le azioni. Altre strutture di
controllo consentono di garantire l'eliminazione di una risorsa o di eseguire una serie di istruzioni per lo stesso
riferimento a un oggetto.

Contenuto della sezione


Strutture decisionali
Descrive le strutture di controllo usate per la creazione di rami.
Strutture di ciclo
Illustra le strutture di controllo usate per la ripetizione dei processi.
Altre strutture di controllo
Descrive le strutture di controllo usate per l'eliminazione delle risorse e l'accesso agli oggetti.
Strutture di controllo annidate
Illustra le strutture di controllo situate all'interno di altre strutture di controllo.

Sezioni correlate
Riepilogo del flusso di controllo
Offre collegamenti alle pagine dei riferimenti al linguaggio per questo argomento.
Tipi di dati in Visual Basic
05/03/2021 • 2 minutes to read • Edit Online

Il tipo di dati di un elemento di programmazione indica la tipologia di dati che può contenere e la modalità di
archiviazione di tali dati. I tipi di dati si applicano a tutti i valori che possono essere archiviati nella memoria del
computer o partecipano alla valutazione di un'espressione. Ogni variabile, valore letterale, costante,
enumerazione, proprietà, parametro di routine, argomento di routine e valore restituito di routine ha un tipo di
dati.

Tipi di dati dichiarati


Un elemento di programmazione viene definito con un'istruzione di dichiarazione e il relativo tipo di dati viene
specificato con la clausola As . La tabella seguente mostra le istruzioni usate per dichiarare i vari elementi.

EL EM EN TO DI P RO GRA M M A Z IO N E DIC H IA RA Z IO N E DEL T IP O DI DAT I

Variabile In un'istruzione Dim

Dim amount As Double

Static yourName As String

Public billsPaid As Decimal = 0

Literal (Valore letterale) Con un carattere di tipo letterale. Vedere "Caratteri di tipo
letterale" in Caratteri tipo

Dim searchChar As Char = "." C

Costante In un'istruzione Const

Const modulus As Single = 4.17825F

Enumerazione In un'istruzione Enum

Public Enum colors

Proprietà In un'istruzione Property

Property region() As String

Parametro di routine In un'istruzione Sub, un'istruzione Function o un'istruzione


Operator

Sub addSale(ByVal amount As Double)

Argomento di routine Nel codice chiamante; ogni argomento è un elemento di


programmazione già dichiarato o un'espressione che
contiene elementi dichiarati

subString = Left( inputString , 5 )


EL EM EN TO DI P RO GRA M M A Z IO N E DIC H IA RA Z IO N E DEL T IP O DI DAT I

Valore restituito di routine In un'istruzione Function o un'istruzione Operator

Function convert(ByVal b As Byte) As String

Per un elenco dei tipi di dati di Visual Basic, vedere Tipi di dati.

Vedi anche
Caratteri tipo
Tipi di dati elementari
Tipi di dati compositi
Generic Types in Visual Basic
Tipi di valore e tipi di riferimento
Conversioni di tipi in Visual Basic
Strutture
Tuple
Risoluzione dei problemi relativi ai tipi di dati
Tipi di dati
Utilizzo efficiente dei tipi di dati
Caratteri di tipo (Visual Basic)
05/03/2021 • 7 minutes to read • Edit Online

Oltre a specificare un tipo di dati in un'istruzione di dichiarazione, è possibile forzare il tipo di dati di alcuni
elementi di programmazione con un carattere tipo. Il carattere tipo deve seguire immediatamente l'elemento,
senza alcun carattere corrispondente.
Il tipo di carattere non fa parte del nome dell'elemento. È possibile fare riferimento a un elemento definito con
un carattere di tipo senza il carattere tipo.

Caratteri di tipo identificatore


Visual Basic fornisce un set di caratteri di tipo identificatore che è possibile utilizzare in una dichiarazione per
specificare il tipo di dati di una variabile o di una costante. Nella tabella seguente sono illustrati i caratteri di tipo
identificatore disponibili con esempi di utilizzo.

C A RAT T ERE DI T IP O IDEN T IF IC ATO RE T IP O DI DAT I ESEM P IO

% Integer Dim L%

& Long Dim M&

@ Decimal Const W@ = 37.5

! Single Dim Q!

# Double Dim X#

$ String Dim V$ = "Secret"

Nessun carattere di tipo identificatore esistente per Boolean i Byte tipi di dati,, Char , Date , Object , SByte ,
Short , UInteger , ULong o o UShort per qualsiasi tipo di dati composito, ad esempio matrici o strutture.

In alcuni casi, è possibile aggiungere il $ carattere a una funzione Visual Basic, ad esempio Left$ anziché
Left , per ottenere un valore restituito di tipo String .

In tutti i casi, il carattere di tipo identificatore deve seguire immediatamente il nome dell'identificatore.

Caratteri di tipo letterale


Un valore letterale è una rappresentazione testuale di un particolare valore di un tipo di dati.
Tipi di valore letterale predefinito
Il formato di un valore letterale come appare nel codice determina in genere il tipo di dati. Nella tabella seguente
vengono illustrati questi tipi predefiniti.

F O RM A T EST UA L E DI VA LO RE
L ET T ERA L E T IP O DI DAT I P REDEF IN ITO ESEM P IO

Numeric, nessuna parte frazionaria Integer 2147483647


F O RM A T EST UA L E DI VA LO RE
L ET T ERA L E T IP O DI DAT I P REDEF IN ITO ESEM P IO

Numerico, nessuna parte frazionaria, Long 2147483648


troppo grande per Integer

Numerica, parte frazionaria Double 1.2

Racchiuso tra virgolette doppie String "A"

Racchiuso tra segni di cancelletto Date #5/17/1993 9:32 AM#

Tipi di valori letterali forzati


Visual Basic fornisce un set di caratteri di tipo letterale, che è possibile usare per imporre a un valore letterale di
assumere un tipo di dati diverso da quello indicato dal form. A tale scopo, aggiungere il carattere alla fine del
valore letterale. Nella tabella seguente vengono illustrati i caratteri di tipo letterale disponibili con esempi di
utilizzo.

C A RAT T ERE DI T IP O L ET T ERA L E T IP O DI DAT I ESEM P IO

S Short I = 347S

I Integer J = 347I

L Long K = 347L

D Decimal X = 347D

F Single Y = 347F

R Double Z = 347R

US UShort L = 347US

UI UInteger M = 347UI

UL ULong N = 347UL

C Char Q = "."C

Nessun carattere di tipo letterale esistente per i Boolean Byte tipi di dati,, Date , Object ,, o SByte String
per qualsiasi tipo di dati composito, ad esempio matrici o strutture.
I valori letterali possono anche usare i caratteri di tipo identificatore ( % , & , @ , ! , # , $ ), così come
possono variabili, costanti ed espressioni. Tuttavia, i caratteri di tipo letterale ( S , I , L , D , F , R , C )
possono essere utilizzati solo con valori letterali.
In tutti i casi, il carattere di tipo letterale deve seguire immediatamente il valore letterale.

Valori letterali esadecimali, binari e ottali


Il compilatore interpreta in genere un valore letterale integer che si trova nel sistema numerico Decimal (base
10). È anche possibile definire un valore letterale integer come numero esadecimale (base 16) con il &H
prefisso, come numero binario (base 2) con il &B prefisso e come numero ottale (base 8) con il &O prefisso. Le
cifre che seguono il prefisso devono essere appropriate per il sistema di numeri. Questa operazione è illustrata
nella tabella seguente.

B A SE N UM ERO P REF ISSO VA LO RI N UM ERIC I VA L IDI ESEM P IO

Esadecimale (base 16) &H 0-9 e A-F &HFFFF

Binary (base 2) &B 0-1 &B01111100

Ottale (base 8) &O 0-7 &O77

A partire da Visual Basic 2017, è possibile usare il carattere di sottolineatura ( _ ) come separatore di gruppo
per migliorare la leggibilità di un valore letterale integrale. Nell'esempio seguente viene usato il _ carattere per
raggruppare un valore letterale binario in gruppi a 8 bit:

Dim number As Integer = &B00100010_11000101_11001111_11001101

È possibile seguire un valore letterale con prefisso con un carattere di tipo letterale. Nell'esempio riportato di
seguito viene illustrata questa situazione.

Dim counter As Short = &H8000S


Dim flags As UShort = &H8000US

Nell'esempio precedente, counter ha il valore decimale di-32768 e flags il valore decimale è + 32768.
A partire da Visual Basic 15,5, è anche possibile usare il carattere di sottolineatura ( _ ) come separatore iniziale
tra il prefisso e le cifre esadecimali, binarie o ottali. Ad esempio:

Dim number As Integer = &H_C305_F860

Per usare il carattere di sottolineatura come separatore iniziale, è necessario aggiungere l'elemento seguente al
file di progetto (*.vbproj) di Visual Basic:

<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>

Per ulteriori informazioni, vedere Impostazione della versione del linguaggio Visual Basic.

Vedere anche
Tipi di dati
Tipi di dati elementari
Tipi di valore e tipi di riferimento
Conversioni di tipi in Visual Basic
Risoluzione dei problemi relativi ai tipi di dati
Dichiarazione di variabile
Tipi di dati
Tipi di dati elementari (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Visual Basic fornisce un set di tipi di dati predefiniti che è possibile usare per molti degli elementi di
programmazione. Questa sezione descrive questi tipi e come usarli.

NOTE
Ogni tipo di dati elementare in Visual Basic è supportato da una struttura o da una classe presente nello System spazio
dei nomi. Il compilatore USA ogni parola chiave del tipo di dati come alias per la struttura o la classe sottostante. Ad
esempio, la dichiarazione di una variabile tramite la parola riservata Byte equivale alla dichiarazione usando il nome
completo della struttura System.Byte .

Contenuto della sezione


Tipi di dati numerici
Descrive i tipi numerici integrali e non integrali.
Tipi di dati carattere
Descrive i Char String tipi e.
Tipi di dati vari
Vengono descritti Boolean i Date tipi, e Object .

Sezioni correlate
Tipi di dati
Introduce i tipi di dati Visual Basic e ne descrive l'utilizzo.
Tipi di dati
Viene fornita una panoramica dei tipi di dati elementari forniti da Visual Basic.
Tipi di dati numerici (Visual Basic)
05/03/2021 • 8 minutes to read • Edit Online

Visual Basic fornisce diversi tipi di dati numerici per la gestione di numeri in varie rappresentazioni. I tipi
integrali rappresentano solo numeri interi (positivi, negativi e zero) e i tipi non integrali rappresentano numeri
con parti intere e frazionarie.
Per una tabella che mostra un confronto affiancato dei tipi di dati Visual Basic, vedere tipi di dati.

Tipi numerici integrali


I tipi di dati integrali sono quelli che rappresentano solo numeri senza parti frazionarie.
I tipi di dati integrali con segno sono tipo di dati SByte (8 bit), tipo di dati Short (a 16 bit), tipo di dati Integer (a
32 bit) e tipo di dati Long (64-bit). Se una variabile archivia sempre numeri interi anziché numeri frazionari,
dichiararli come uno di questi tipi.
I tipi integrali senza segno sono tipo di dati byte (8 bit), tipo di dati ushort (a 16 bit), tipo di dati UInteger (32 bit)
e tipo di dati ulong (64 bit). Se una variabile contiene dati binari o dati di natura sconosciuta, dichiararli come
uno di questi tipi.
Prestazioni
Le operazioni aritmetiche sono più veloci con i tipi integrali rispetto ad altri tipi di dati. Sono più veloci con i
Integer tipi e UInteger in Visual Basic.

Numeri interi grandi


Se è necessario mantenere un numero intero maggiore di quello che Integer può essere utilizzato dal tipo di
dati, è possibile utilizzare il tipo di Long dati. Long le variabili possono ospitare numeri da-
9.223.372.036.854.775.808 a 9.223.372.036.854.775.807. Le operazioni con Long sono leggermente più lente
rispetto a Integer .
Se sono necessari valori ancora maggiori, è possibile usare il tipo di dati Decimal. Decimal Se non si utilizzano
posizioni decimali, è possibile mantenere i numeri da-79.228.162.514.264.337.593.543.950.335 a
79.228.162.514.264.337.593.543.950.335 in una variabile. Tuttavia, le operazioni con Decimal numeri sono
notevolmente più lente rispetto a qualsiasi altro tipo di dati numerico.
Numeri interi piccoli
Se non è necessario l'intervallo completo del tipo di Integer dati, è possibile usare il Short tipo di dati, che
può ospitare numeri interi compresi tra-32.768 e 32.767. Per l'intervallo di valori integer più piccolo, il SByte
tipo di dati include numeri interi compresi tra-128 e 127. Se si dispone di un numero molto elevato di variabili
che contengono numeri interi di piccole dimensioni, i Common Language Runtime a volte possono archiviare le
Short variabili e in SByte modo più efficiente e risparmiare sull'utilizzo della memoria. Tuttavia, le operazioni
con Short e SByte sono piuttosto più lente rispetto a Integer .
Interi senza segno
Se si è certi che la variabile non deve mai avere un numero negativo, è possibile usare i tipi non firmati Byte ,,
UShort UInteger e ULong . Ognuno di questi tipi di dati può avere un numero intero positivo due volte
superiore al tipo con segno corrispondente ( SByte ,, Short Integer e Long ). In termini di prestazioni, ogni
tipo senza segno è esattamente altrettanto efficiente del tipo con segno corrispondente. In particolare, UInteger
condivide con Integer la differenza che è più efficiente di tutti i tipi di dati numerici elementari.
Tipi numerici non integrali
I tipi di dati non integrali sono quelli che rappresentano numeri con parti intere e frazionarie.
I tipi di dati numerici non integrali sono Decimal (punto fisso a 128 bit), tipo di dati singolo (virgola mobile a 32
bit) e tipo di dati Double (virgola mobile a 64 bit). Sono tutti tipi firmati. Se una variabile può contenere una
frazione, dichiararla come uno di questi tipi.
Decimal non è un tipo di dati a virgola mobile. Decimal i numeri hanno un valore integer binario e un fattore di
scala integer che specifica quale parte del valore è una frazione decimale.
È possibile usare le Decimal variabili per i valori money. Il vantaggio è la precisione dei valori. Il Double tipo di
dati è più veloce e richiede un minor numero di memoria, ma è soggetto a errori di arrotondamento. Il Decimal
tipo di dati mantiene l'accuratezza completa per 28 posizioni decimali.
I numeri a virgola mobile ( Single e Double ) hanno intervalli maggiori dei Decimal numeri, ma possono
essere soggetti a errori di arrotondamento. I tipi a virgola mobile supportano meno cifre significative di
Decimal ma possono rappresentare valori di grandezza maggiore.

I valori numerici non integrali possono essere espressi come mmmEeee, in cui MMM è il mantissa (cifre
significative) e Eee è l' esponente (una potenza di 10). I valori positivi più alti dei tipi non integrali sono
7.9228162514264337593543950335 E + 28 per Decimal , 3.4028235 e + 38 per Single e
1.79769313486231570 e + 308 per Double .
Prestazioni
Double è il più efficiente dei tipi di dati frazionari, perché i processori sulle piattaforme correnti eseguono
operazioni a virgola mobile con precisione doppia. Tuttavia, le operazioni con Double non sono altrettanto
veloci dei tipi integrali, ad esempio Integer .
Magnitude ridotte
Per i numeri con la grandezza minima possibile (più vicino a 0), le Double variabili possono mantenere i numeri
4.94065645841246544 e-324 per i valori negativi e 4.94065645841246544 e-324 per i valori positivi.
Numeri frazionari piccoli
Se non è necessario l'intervallo completo del tipo di Double dati, è possibile usare il Single tipo di dati, che
può mantenere i numeri a virgola mobile da-3.4028235 e + 38 a 3.4028235 e + 38. Le Magnitude più piccole
per le Single variabili sono-401298E e-45 per i valori negativi e 401298E e-45 per i valori positivi. Se si
dispone di un numero molto elevato di variabili che contengono numeri a virgola mobile ridotti, i Common
Language Runtime a volte possono archiviare le Single variabili in modo più efficiente e risparmiare
sull'utilizzo della memoria.

Vedi anche
Tipi di dati elementari
Tipi di dati carattere
Tipi di dati vari
Risoluzione dei problemi relativi ai tipi di dati
Procedura: Chiamare una funzione Windows che accetta tipi senza segno
Dati di tipo carattere (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Visual Basic fornisce tipi di dati di tipo carattere per gestire i caratteri stampabili e visualizzabili. Mentre
entrambi gestiscono i caratteri Unicode, contiene Char un singolo carattere mentre String contiene un
numero di caratteri indefinito.
Per una tabella in cui viene visualizzato un confronto affiancato dei tipi di dati Visual Basic, vedere tipi di dati.

Tipo char
Il Char tipo di dati è un singolo carattere Unicode a due byte (a 16 bit). Se una variabile archivia sempre
esattamente un carattere, dichiararlo come Char . Ad esempio:

' Initialize the prefix variable to the character 'a'.


Dim prefix As Char = "a"

Ogni valore possibile in una Char String variabile o è un punto di codice, o codice carattere, nel set di caratteri
Unicode. I caratteri Unicode includono il set di caratteri ASCII di base, diverse altre lettere di alfabeto, accenti,
simboli di valuta, frazioni, segni diacritici e simboli matematici e tecnici.

NOTE
Il set di caratteri Unicode riserva i punti di codice da D800 a DFFF (da 55296 a 55551 Decimal) per le coppie di surrogati,
che richiedono valori 2 16 bit per rappresentare un singolo punto di codice. Una Char variabile non può avere una
coppia di surrogati e un oggetto String Usa due posizioni per mantenere tale coppia.

Per altre informazioni, vedere tipo di dati char.

Tipo di stringa
Il String tipo di dati è una sequenza di zero o più caratteri Unicode a 2 byte (a 16 bit). Se una variabile può
contenere un numero indefinito di caratteri, dichiararla come String . Ad esempio:

' Initialize the name variable to "Monday".


Dim name As String = "Monday"

Per ulteriori informazioni, vedere tipo di dati String.

Vedi anche
Tipi di dati elementari
Tipi di dati compositi
Generic Types in Visual Basic
Tipi di valore e tipi di riferimento
Conversioni di tipi in Visual Basic
Risoluzione dei problemi relativi ai tipi di dati
Caratteri tipo
Tipi di dati vari (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Visual Basic fornisce diversi tipi di dati che non sono orientati verso numeri o caratteri. Si occupano invece di
dati specializzati quali i valori Yes/No, i valori di data e ora e gli indirizzi degli oggetti.
Per una tabella che mostra un confronto affiancato dei tipi di dati Visual Basic, vedere tipi di dati.

Tipo Boolean
Il tipo di dati booleano è un valore senza segno interpretato come True o False . La larghezza dei dati dipende
dalla piattaforma di implementazione. Se una variabile può contenere solo valori a due Stati, ad esempio
true/false, Yes/No o on/off, dichiararla come Boolean .

Tipo di data
Il tipo di dati date è un valore a 64 bit che include le informazioni di data e ora. Ogni incremento rappresenta
100 nanosecondi di tempo trascorso dall'inizio (12:00 AM) del 1 ° gennaio dell'anno 1 nel calendario
gregoriano. Se una variabile può contenere un valore di data, un valore di ora o entrambi, dichiararla come
Date .

Tipo di oggetto
Il tipo di dati Object è un indirizzo a 32 bit che punta a un'istanza dell'oggetto all'interno dell'applicazione o in
un'altra applicazione. Una Object variabile può fare riferimento a qualsiasi oggetto riconosciuto
dall'applicazione o ai dati di qualsiasi tipo di dati. Sono inclusi entrambi i tipi di valore, ad esempio le Integer
Boolean istanze di struttura, e e i tipi di riferimento, che sono istanze di oggetti creati da classi quali e e istanze
di String Form matrice.
Se una variabile archivia un puntatore a un'istanza di una classe che non è noto in fase di compilazione o se può
puntare a dati di vari tipi di dati, dichiararla come Object .
Il vantaggio del Object tipo di dati è che è possibile utilizzarlo per archiviare dati di qualsiasi tipo di dati. Lo
svantaggio è che vengono eseguite operazioni aggiuntive che impongono un tempo di esecuzione maggiore e
rallentano le prestazioni dell'applicazione. Se si usa una Object variabile per i tipi di valore, si comporterà la
conversione boxing e unboxing. Se viene usato per i tipi di riferimento, si incorre in un binding tardivo.

Vedi anche
Caratteri tipo
Tipi di dati elementari
Tipi di dati numerici
Tipi di dati carattere
Risoluzione dei problemi relativi ai tipi di dati
Associazione anticipata e tardiva
Tipi di dati compositi (Visual Basic)
05/03/2021 • 5 minutes to read • Edit Online

Oltre ai tipi di dati elementari Visual Basic fornisce, è anche possibile assemblare elementi di tipi diversi per
creare tipi di dati compositi , ad esempio strutture, matrici e classi. È possibile compilare tipi di dati compositi da
tipi elementari e da altri tipi compositi. Ad esempio, è possibile definire una matrice di elementi della struttura o
una struttura con membri di matrice.

Tipi di dati
Un tipo composito è diverso dal tipo di dati di uno dei relativi componenti. Una matrice di elementi, ad esempio,
Integer non è del Integer tipo di dati.

Un tipo di dati di matrice viene in genere rappresentato utilizzando il tipo di elemento, le parentesi e le virgole
secondo necessità. Ad esempio, una matrice unidimensionale di String elementi viene rappresentata come
String() e una matrice bidimensionale di Boolean elementi viene rappresentata come Boolean(,) .

Tipi di struttura
Non esiste un singolo tipo di dati costituito da tutte le strutture. Al contrario, ogni definizione di una struttura
rappresenta un tipo di dati univoco, anche se due strutture definiscono elementi identici nello stesso ordine.
Tuttavia, se si creano due o più istanze della stessa struttura, Visual Basic considera che siano dello stesso tipo di
dati.

Tuple
Una tupla è una struttura leggera che contiene due o più campi i cui tipi sono predefiniti. Le tuple sono
supportate a partire da Visual Basic 2017. Le tuple vengono in genere utilizzate per restituire più valori da una
singola chiamata al metodo senza dover passare argomenti per riferimento o per comprimere i campi restituiti
in una classe o una struttura più pesante. Per ulteriori informazioni sulle tuple, vedere l'argomento Tuple .

Tipi di matrici
Non esiste un singolo tipo di dati costituito da tutte le matrici. Il tipo di dati di una determinata istanza di una
matrice è determinato dai seguenti elementi:
Il fatto di essere una matrice
Rango (numero di dimensioni) della matrice
Tipo di elemento della matrice.
In particolare, la lunghezza di una determinata dimensione non fa parte del tipo di dati dell'istanza. Questa
condizione è illustrata nell'esempio seguente.

Dim arrayA( ) As Byte = New Byte(12) {}


Dim arrayB( ) As Byte = New Byte(100) {}
Dim arrayC( ) As Short = New Short(100) {}
Dim arrayD( , ) As Short
Dim arrayE( , ) As Short = New Short(4, 10) {}

Nell'esempio precedente, le variabili arrayA di matrice e arrayB sono considerate dello stesso tipo di dati,
Byte() anche se vengono inizializzate su lunghezze diverse. arrayB Le variabili e arrayC non sono dello stesso
tipo perché i tipi di elemento sono diversi. arrayC Le variabili e arrayD non sono dello stesso tipo perché le
rispettive dimensioni sono diverse. Le variabili arrayD e arrayE hanno lo stesso tipo Short(,) , perché i
relativi tipi di rango e di elemento sono gli stessi, anche se arrayD non è stato ancora inizializzato.
Per ulteriori informazioni sulle matrici, vedere matrici.

Tipi di classe
Non esiste un singolo tipo di dati costituito da tutte le classi. Sebbene una classe possa ereditare da un'altra
classe, ognuno è un tipo di dati separato. Più istanze della stessa classe sono dello stesso tipo di dati. Se si
assegna una variabile di istanza di classe a un'altra, non solo i tipi di dati hanno lo stesso tipo di dati, fanno
riferimento alla stessa istanza della classe in memoria.
Per ulteriori informazioni sulle classi, vedere oggetti e classi.

Vedi anche
Tipi di dati
Tipi di dati elementari
Generic Types in Visual Basic
Tipi di valore e tipi di riferimento
Conversioni di tipi in Visual Basic
Strutture
Risoluzione dei problemi relativi ai tipi di dati
Procedura: Inserire più valori in una variabile
Procedura: inserire più valori in una variabile (Visual
Basic)
05/03/2021 • 2 minutes to read • Edit Online

Una variabile include più di un valore se lo si dichiara come tipo di dati composito.
I tipi di dati compositi includono strutture, matrici e classi. Una variabile di un tipo di dati composito può avere
una combinazione di tipi di dati elementari e altri tipi compositi. Le strutture e le classi possono conservare il
codice e i dati.

Per conservare più di un valore in una variabile


1. Determinare il tipo di dati composito che si desidera utilizzare per la variabile.
2. Se il tipo di dati composito non è già definito, definirlo in modo che possa essere utilizzato dalla variabile.
Definire una struttura con un' istruzione Structure.
Definire una matrice con un' istruzione Dim.
Definire una classe con un' istruzione di classe.
3. Dichiarare la variabile con un' Dim istruzione.
4. Seguire il nome della variabile con una As clausola.
5. Seguire la As parola chiave con il nome del tipo di dati composito appropriato.

Vedi anche
Tipi di dati
Caratteri tipo
Tipi di dati compositi
Strutture
Matrici
Oggetti e classi
Tipi di valore e tipi di riferimento
Tipi generici in Visual Basic (Visual Basic)
05/03/2021 • 14 minutes to read • Edit Online

Un tipo generico è un singolo elemento di programmazione che si adatta per eseguire la stessa funzionalità per
diversi tipi di dati. Quando si definisce una classe o una routine generica, non è necessario definire una versione
distinta per ogni tipo di dati per il quale si vuole eseguire tale funzionalità.
Un'analogia è un cacciavite con diverse punte rimovibili. Si esamina la vite che è necessario ruotare e si
seleziona la punta corretta per tale vite (a taglio, a croce, a stella). Dopo avere inserito la punta corretta nel
manico del cacciavite, si esegue in tutti i casi la stessa funzione, ovvero ruotare la vite.

Quando si definisce un tipo generico, questo viene parametrizzato con uno o più tipi di dati. Questo consente di
usare il codice per adattare i tipi di dati ai propri requisiti. Il codice può dichiarare più elementi di
programmazione dall'elemento generico, ciascuno dei quali agisce su un diverso set di tipi di dati. Tuttavia, tutti
gli elementi dichiarati eseguono la stessa logica, indipendentemente dai tipi di dati in uso.
È ad esempio possibile creare e usare una classe queue che opera su un tipo di dati specifico, quale String . È
possibile dichiarare tale classe da System.Collections.Generic.Queue<T>, come illustrato nell'esempio seguente.

Public stringQ As New System.Collections.Generic.Queue(Of String)

È ora possibile usare stringQ per lavorare esclusivamente con i valori String . Poiché stringQ è specifico per
String anziché essere generalizzato per i valori Object , non viene eseguita alcuna associazione tardiva o
conversione di tipo. Questo consente di risparmiare il tempo di esecuzione e riduce gli errori di runtime.
Per altre informazioni sull'uso di un tipo generico, vedere How to: Use a Generic Class.

Esempio di classe generica


Nell'esempio seguente viene illustrata la struttura della definizione di una classe generica.

Public Class classHolder(Of t)


Public Sub processNewItem(ByVal newItem As t)
Dim tempItem As t
' Insert code that processes an item of data type t.
End Sub
End Class

Nella struttura precedente t è un parametro di tipo, ovvero un segnaposto per un tipo di dati che viene fornito
quando si dichiara la classe. In un'altra posizione nel codice è possibile dichiarare varie versioni di classHolder
fornendo diversi tipi di dati per t . Gli esempi seguenti mostrano due dichiarazioni di questo tipo.
Public integerClass As New classHolder(Of Integer)
Friend stringClass As New classHolder(Of String)

Le istruzioni precedenti dichiarano classi costruite, in cui un tipo specifico sostituisce il parametro di tipo. Questa
sostituzione viene propagata in tutto il codice all'interno della classe costruita. Nell'esempio seguente viene
illustrato l'aspetto della routine processNewItem in integerClass .

Public Sub processNewItem(ByVal newItem As Integer)


Dim tempItem As Integer
' Inserted code now processes an Integer item.
End Sub

Per un esempio più completo, vedere procedura: definire una classe in grado di fornire funzionalità identiche su
tipi di dati diversi.

Elementi di programmazione idonei


È possibile definire e usare classi, strutture, interfacce, routine e delegati generici. Si noti che il .NET Framework
definisce diverse classi, strutture e interfacce generiche che rappresentano elementi generici usati
comunemente. Lo spazio dei nomi System.Collections.Generic fornisce dizionari, elenchi, code e stack. Prima di
definire un elemento generico personalizzato, verificare se è già disponibile in System.Collections.Generic.
Le routine non sono tipi, ma è possibile definire e usare routine generiche. Vedere Generic Procedures in Visual
Basic.

Vantaggi dei tipi generici


Un tipo generico serve come base per dichiarare molti elementi di programmazione diversi, ognuno dei quali
opera su un tipo di dati specifico. Le alternative a un tipo generico sono:
1. Un singolo tipo che opera sul tipo di dati Object .
2. Set di versioni specifiche del tipo , ciascuna versione codificata individualmente e che opera su un tipo di
dati specifico, ad esempio String , Integer o un tipo definito dall'utente, ad esempio customer .
Un tipo generico offre i vantaggi seguenti rispetto a queste alternative:
Indipendenza dai tipi. I tipi generici applicano il controllo dei tipi in fase di compilazione. I tipi basati su
Object accettano qualsiasi tipo di dati ed è necessario scrivere codice per verificare se un tipo di dati di
input è accettabile. Con i tipi generici, il compilatore può intercettare i tipi non corrispondenti prima della
fase di esecuzione.
Prestazioni. I tipi generici non devono eseguire il boxing e l' unboxinging dei dati, perché ognuno è
specializzato per un solo tipo di dati. Le operazioni basate su Object devono eseguire il boxing dei tipi di
dati di input per convertirli in Object e l'unboxing dei dati destinati all'output. Il boxing e l'unboxing
riducono le prestazioni.
I tipi basati su Object sono anche ad associazione tardiva, il che significa che l'accesso ai membri
richiede codice aggiuntivo in fase di esecuzione. Anche questo riduce le prestazioni.
Consolidamento del codice. Il codice in un tipo generico deve essere definito una sola volta. Un set di
versioni specifiche del tipo deve replicare lo stesso codice in ogni versione, con la sola differenza del tipo
di dati specifico per tale versione. Con i tipi generici, tutte le versioni specifiche del tipo sono generate dal
tipo generico originale.
Riutilizzo del codice. Il codice che non dipende da un particolare tipo di dati può essere riutilizzato con
vari tipi di dati se è generico. Spesso è possibile riutilizzarlo anche con un tipo di dati che non era
originariamente previsto.
Suppor to IDE. Quando si usa un tipo costruito dichiarato da un tipo generico, l'ambiente di sviluppo
integrato (IDE) può consentire di ottenere maggiore supporto durante lo sviluppo di codice. Ad esempio,
IntelliSense può visualizzare le opzioni specifiche del tipo per un argomento di un costruttore o un
metodo.
Algoritmi generici. Gli algoritmi astratti indipendenti dal tipo sono buoni candidati per i tipi generici.
Ad esempio, una routine generica che ordina gli elementi tramite l'interfaccia IComparable può essere
usata con qualsiasi tipo di dati che implementa IComparable.

Vincoli
Sebbene il codice nella definizione di un tipo generico debba essere quanto più indipendente dal tipo possibile,
potrebbe essere necessario richiedere che una determinata funzionalità di qualsiasi tipo di dati sia disponibile
per il tipo generico. Ad esempio, se si vuole confrontare due elementi per ordinarli, il relativo tipo di dati deve
implementare l'interfaccia IComparable . È possibile applicare questo requisito aggiungendo un vincolo al
parametro di tipo.
Esempio di vincolo
Nell'esempio seguente viene illustrata una struttura di definizione di una classe con un vincolo che richiede che
l'argomento di tipo implementi IComparable.

Public Class itemManager(Of t As IComparable)


' Insert code that defines class members.
End Class

Se il codice successivo tenta di costruire una classe da itemManager fornendo un tipo che non implementa
IComparable, il compilatore segnala un errore.
Tipi di vincoli
I vincoli possono specificare i requisiti seguenti in qualsiasi combinazione:
L'argomento di tipo deve implementare una o più interfacce
L'argomento di tipo deve essere del tipo di, o ereditare da, una classe al massimo
L'argomento di tipo deve esporre un costruttore senza parametri accessibile al codice che crea oggetti in
base ad esso
L'argomento di tipo deve essere un tipo riferimento oppure deve essere un tipo di valore
Se è necessario imporre più di un requisito, usare un elenco di vincoli separati da virgole tra parentesi graffe (
{ } ). Per richiedere un costruttore accessibile, includere la parola chiave new operator nell'elenco. Per
richiedere un tipo di riferimento, includere la parola chiave Class ; per richiedere un tipo di valore, includere la
parola chiave Structure .
Per altre informazioni sui vincoli, vedere Type List.
Esempio di più vincoli
Nell'esempio seguente viene illustrata una struttura di definizione di una classe generica con un elenco di vincoli
per il parametro di tipo. Nel codice che crea un'istanza di questa classe, l'argomento di tipo deve implementare
entrambe le interfacce IComparable e IDisposable , essere un tipo di riferimento ed esporre un costruttore senza
parametri accessibile.
Public Class thisClass(Of t As {IComparable, IDisposable, Class, New})
' Insert code that defines class members.
End Class

Termini importanti
I tipi generici introducono e usano i termini seguenti:
Tipo generico. Una definizione di una classe, una struttura, un'interfaccia, una routine o un delegato per
cui si fornisce almeno un tipo di dati al momento della dichiarazione.
Parametro di tipo. In una definizione di tipo generico, un segnaposto per un tipo di dati fornito al
momento della dichiarazione del tipo.
Argomento di tipo. Tipo di dati specifico che sostituisce un parametro di tipo quando si dichiara un tipo
costruito da un tipo generico.
Vincolo. Condizione su un parametro di tipo che limita l'argomento di tipo che è possibile specificare. Un
vincolo può richiedere che l'argomento di tipo debba implementare un'interfaccia specifica, essere o
ereditare da una classe particolare, avere un costruttore senza parametri accessibile o essere un tipo di
riferimento o un tipo di valore. Questi vincoli possono essere combinati, ma è possibile specificare al
massimo una classe.
Tipo costruito. Una classe, una struttura, un'interfaccia, una routine o un delegato dichiarato da un tipo
generico fornendo argomenti di tipo per i relativi parametri di tipo.

Vedi anche
Tipi di dati
Caratteri tipo
Tipi di valore e tipi di riferimento
Conversioni di tipi in Visual Basic
Risoluzione dei problemi relativi ai tipi di dati
Tipi di dati
Di
Come
Object Data Type
Covarianza e controvarianza
Iterators
Procedura: definire una classe in grado di fornire
funzionalità identiche con tipi di dati diversi (Visual
Basic)
05/03/2021 • 6 minutes to read • Edit Online

È possibile definire una classe dalla quale creare oggetti in grado di fornire funzionalità identiche su tipi di dati
diversi. A questo scopo, specificare uno o più parametri di tipo nella definizione. La classe potrà quindi servire
come modello per gli oggetti che usano tipi di dati diversi. Una classe definita in questo modo viene denominata
classe generica.
Il vantaggio della definizione di una classe generica sta nel fatto che viene definita un'unica volta e che può
essere usata dal codice per la creazione di molti oggetti che usano una vasta gamma di tipi di dati. Questo
comporta prestazioni superiori rispetto alla definizione della classe con il tipo Object .
Oltre alle classi, è possibile definire e usare anche strutture, interfacce, routine e delegati generici.
Per definire una classe con un parametro di tipo
1. Definire la classe nel modo normale.
2. Aggiungere (Of typeparameter ) subito dopo il nome della classe per specificare un parametro di tipo.
3. Se esiste più di un parametro di tipo, creare un elenco separato da virgole all'interno delle parentesi. Non
ripetere la parola chiave Of .
4. Se le operazioni eseguite dal codice su un parametro di tipo sono diverse da una semplice assegnazione,
far seguire il parametro di tipo da una clausola As per l'aggiunta di uno o più vincoli. Un vincolo
garantisce che il tipo fornito per tale parametro di tipo soddisfi un requisito, ad esempio:
Supporta un'operazione, quale > , eseguita dal codice
Supporta un membro, quale un metodo, a cui accede il codice
Espone un costruttore senza parametri
Se non si specifica alcun vincolo, le uniche operazioni e gli unici membri usati dal codice sono quelli
supportati dal Object Data Type. Per altre informazioni, vedere Type List.
5. Identificare ogni membro della classe da dichiarare con un tipo fornito e dichiararlo As typeparameter .
Questo vale per l'archiviazione interna, i parametri di routine e i valori restituiti.
6. Accertarsi che il codice usi solo operazioni e metodi supportati da qualsiasi tipo di dati che può fornire a
itemType .

Nell'esempio riportato di seguito viene definita una classe che gestisce un elenco molto semplice.
L'elenco è contenuto negli items della matrice interna e il tipo di dati degli elementi dell'elenco può
essere dichiarato dal codice. Un costruttore con parametri consente di usare il codice per impostare il
limite superiore di items e il costruttore senza parametri imposta questa proprietà su 9 (per un totale di
10 elementi).
Public Class simpleList(Of itemType)
Private items() As itemType
Private top As Integer
Private nextp As Integer
Public Sub New()
Me.New(9)
End Sub
Public Sub New(ByVal t As Integer)
MyBase.New()
items = New itemType(t) {}
top = t
nextp = 0
End Sub
Public Sub add(ByVal i As itemType)
insert(i, nextp)
End Sub
Public Sub insert(ByVal i As itemType, ByVal p As Integer)
If p > nextp OrElse p < 0 Then
Throw New System.ArgumentOutOfRangeException("p",
" less than 0 or beyond next available list position")
ElseIf nextp > top Then
Throw New System.ArgumentException("No room to insert at ",
"p")
ElseIf p < nextp Then
For j As Integer = nextp To p + 1 Step -1
items(j) = items(j - 1)
Next j
End If
items(p) = i
nextp += 1
End Sub
Public Sub remove(ByVal p As Integer)
If p >= nextp OrElse p < 0 Then
Throw New System.ArgumentOutOfRangeException("p",
" less than 0 or beyond last list item")
ElseIf nextp = 0 Then
Throw New System.ArgumentException("List empty; cannot remove ",
"p")
ElseIf p < nextp - 1 Then
For j As Integer = p To nextp - 2
items(j) = items(j + 1)
Next j
End If
nextp -= 1
End Sub
Public ReadOnly Property listLength() As Integer
Get
Return nextp
End Get
End Property
Public ReadOnly Property listItem(ByVal p As Integer) As itemType
Get
If p >= nextp OrElse p < 0 Then
Throw New System.ArgumentOutOfRangeException("p",
" less than 0 or beyond last list item")
End If
Return items(p)
End Get
End Property
End Class

È possibile dichiarare una classe da simpleList per contenere un elenco di valori Integer , un'altra
classe per contenere un elenco di valori String e un'altra per contenere valori Date . Ad eccezione del
tipo di dati dei membri dell'elenco, gli oggetti creati da tutte queste classi si comportano in maniera
identica.
L'argomento di tipo fornito dal codice a itemType può essere di tipo intrinseco come Boolean o Double ,
una struttura, un'enumerazione o qualsiasi tipo di classe, compresa una di quelle definite
dall'applicazione.
È possibile verificare la classe simpleList con il codice seguente.

Public Sub useSimpleList()


Dim iList As New simpleList(Of Integer)(2)
Dim sList As New simpleList(Of String)(3)
Dim dList As New simpleList(Of Date)(2)
iList.add(10)
iList.add(20)
iList.add(30)
sList.add("First")
sList.add("extra")
sList.add("Second")
sList.add("Third")
sList.remove(1)
dList.add(#1/1/2003#)
dList.add(#3/3/2003#)
dList.insert(#2/2/2003#, 1)
Dim s =
"Simple list of 3 Integer items (reported length " &
CStr(iList.listLength) & "):" &
vbCrLf & CStr(iList.listItem(0)) &
vbCrLf & CStr(iList.listItem(1)) &
vbCrLf & CStr(iList.listItem(2)) &
vbCrLf &
"Simple list of 4 - 1 String items (reported length " &
CStr(sList.listLength) & "):" &
vbCrLf & CStr(sList.listItem(0)) &
vbCrLf & CStr(sList.listItem(1)) &
vbCrLf & CStr(sList.listItem(2)) &
vbCrLf &
"Simple list of 2 + 1 Date items (reported length " &
CStr(dList.listLength) & "):" &
vbCrLf & CStr(dList.listItem(0)) &
vbCrLf & CStr(dList.listItem(1)) &
vbCrLf & CStr(dList.listItem(2))
MsgBox(s)
End Sub

Vedi anche
Tipi di dati
Generic Types in Visual Basic
Indipendenza del linguaggio e componenti indipendenti dal linguaggio
Di
Type List
Procedura: Usare una classe generica
Object Data Type
Procedura: utilizzare una classe generica (Visual
Basic)
05/03/2021 • 2 minutes to read • Edit Online

Una classe che accetta parametri di tipo è chiamato classe generica. Se si usa una classe generica, è possibile
generare una classe costruita da essa fornendo un argomento di tipo per ciascuno di questi parametri. È
possibile quindi dichiarare una variabile del tipo di classe costruita, creare un'istanza della classe costruita e
assegnarla alla variabile.
Oltre alle classi, è possibile definire e usare anche strutture, interfacce, routine e delegati generici.
La procedura seguente accetta una classe generica definita nell'.NET Framework e ne crea un'istanza.
Per usare una classe che accetta un parametro di tipo
1. All'inizio del file di origine, includere un' istruzione Imports (tipo e spazio dei nomi .NET) per importare lo
System.Collections.Generic spazio dei nomi. In questo modo è possibile fare riferimento alla classe
System.Collections.Generic.Queue<T> senza doverla specificare completamente per differenziarla da
altre classi queue come System.Collections.Queue.
2. Creare l'oggetto in modo normale, ma aggiungere (Of type) immediatamente dopo il nome della
classe.
L'esempio seguente usa la stessa classe (System.Collections.Generic.Queue<T>) per creare due oggetti
queue che contengono elementi con tipi di dati diversi. Aggiunge gli elementi alla fine di ogni coda e
quindi rimuove e visualizza gli elementi dall'inizio di ogni coda.

Public Sub usequeue()


Dim queueDouble As New System.Collections.Generic.Queue(Of Double)
Dim queueString As New System.Collections.Generic.Queue(Of String)
queueDouble.Enqueue(1.1)
queueDouble.Enqueue(2.2)
queueDouble.Enqueue(3.3)
queueDouble.Enqueue(4.4)
queueString.Enqueue("First string of three")
queueString.Enqueue("Second string of three")
queueString.Enqueue("Third string of three")
Dim s As String = "Queue of Double items (reported length " &
CStr(queueDouble.Count) & "):"
For i As Integer = 1 To queueDouble.Count
s &= vbCrLf & CStr(queueDouble.Dequeue())
Next i
s &= vbCrLf & "Queue of String items (reported length " &
CStr(queueString.Count) & "):"
For i As Integer = 1 To queueString.Count
s &= vbCrLf & queueString.Dequeue()
Next i
MsgBox(s)
End Sub

Vedi anche
Tipi di dati
Generic Types in Visual Basic
Indipendenza del linguaggio e componenti indipendenti dal linguaggio
Di
Istruzione Imports (tipo e spazio dei nomi .NET)
Procedura: Definire una classe in grado di fornire funzionalità identiche con tipi di dati diversi
Iterators
Generic Procedures in Visual Basic
05/03/2021 • 5 minutes to read • Edit Online

Una routine generica, detta anche metodo generico, è una procedura definita con almeno un parametro di tipo.
Ciò consente al codice chiamante di adattare i tipi di dati ai relativi requisiti ogni volta che viene chiamata la
procedura.
Una routine non è generica semplicemente in virtù di essere definita all'interno di una classe generica o di una
struttura generica. Per essere generico, la routine deve assumere almeno un parametro di tipo, oltre ai parametri
normali che potrebbero essere necessari. Una classe o una struttura generica può contenere routine non
generiche e una classe, una struttura o un modulo non generico può contenere routine generiche.
Una routine generica può usare i parametri di tipo nell'elenco di parametri normali, nel tipo restituito, se
presente, e nel codice della procedura.

Inferenza di tipi
È possibile chiamare una routine generica senza fornire alcun argomento di tipo. Se viene chiamato in questo
modo, il compilatore tenta di determinare i tipi di dati appropriati da passare agli argomenti di tipo della stored
procedure. Questa operazione viene definita inferenza del tipo. Nel codice seguente viene illustrata una
chiamata in cui il compilatore deduce che deve passare String il tipo al parametro di tipo t .

Public Sub testSub(Of t)(ByVal arg As t)


End Sub
Public Sub callTestSub()
testSub("Use this string")
End Sub

Se il compilatore non è in grado di dedurre gli argomenti di tipo dal contesto della chiamata, viene segnalato un
errore. Una delle possibili cause di questo errore è la mancata corrispondenza della classificazione della matrice.
Si supponga, ad esempio, di definire un parametro normale come matrice di un parametro di tipo. Se si chiama
la routine generica che fornisce una matrice di un rango diverso (numero di dimensioni), la mancata
corrispondenza causa l'inferenza del tipo. Nel codice seguente viene illustrata una chiamata in cui una matrice
bidimensionale viene passata a una routine che prevede una matrice unidimensionale.

Public Sub demoSub(Of t)(ByVal arg() As t)


End Sub

Public Sub callDemoSub()


Dim twoDimensions(,) As Integer
demoSub(twoDimensions)
End Sub

È possibile richiamare l'inferenza del tipo solo omettendo tutti gli argomenti di tipo. Se si fornisce un solo
argomento di tipo, è necessario fornirli tutti.
L'inferenza del tipo è supportata solo per le routine generiche. Non è possibile richiamare l'inferenza del tipo su
classi, strutture, interfacce o delegati generici.

Esempio
Descrizione
Nell'esempio seguente viene definita una Function routine generica per trovare un particolare elemento in una
matrice. Definisce un parametro di tipo e lo usa per costruire i due parametri nell'elenco di parametri.
Codice

Public Function findElement(Of T As IComparable) (


ByVal searchArray As T(), ByVal searchValue As T) As Integer

If searchArray.GetLength(0) > 0 Then


For i As Integer = 0 To searchArray.GetUpperBound(0)
If searchArray(i).CompareTo(searchValue) = 0 Then Return i
Next i
End If

Return -1
End Function

Commenti
Nell'esempio precedente è richiesta la possibilità di eseguire il confronto searchValue con ogni elemento di
searchArray . Per garantire questa possibilità, vincola il parametro T di tipo per implementare l'
IComparable<T> interfaccia. Il codice usa il CompareTo metodo anziché l' = operatore, perché non esiste
alcuna garanzia che un argomento di tipo fornito per T supporti l' = operatore.
È possibile testare la findElement procedura con il codice seguente.

Public Sub tryFindElement()


Dim stringArray() As String = {"abc", "def", "xyz"}
Dim stringSearch As String = "abc"
Dim integerArray() As Integer = {7, 8, 9}
Dim integerSearch As Integer = 8
Dim dateArray() As Date = {#4/17/1969#, #9/20/1998#, #5/31/2004#}
Dim dateSearch As Date = Microsoft.VisualBasic.DateAndTime.Today
MsgBox(CStr(findElement(Of String)(stringArray, stringSearch)))
MsgBox(CStr(findElement(Of Integer)(integerArray, integerSearch)))
MsgBox(CStr(findElement(Of Date)(dateArray, dateSearch)))
End Sub

Le chiamate precedenti a MsgBox visualizzano rispettivamente "0", "1" e "-1".

Vedi anche
Generic Types in Visual Basic
Procedura: Definire una classe in grado di fornire funzionalità identiche con tipi di dati diversi
Procedura: Usare una classe generica
Procedure
Parametri e argomenti delle routine
Type List
Elenco parametri
Tipi di valori nullable (Visual Basic)
05/03/2021 • 10 minutes to read • Edit Online

Talvolta si utilizza un tipo di valore che non dispone di un valore definito in determinate circostanze. Ad esempio,
un campo in un database potrebbe dover distinguere tra un valore assegnato significativo e senza un valore
assegnato. I tipi di valore possono essere estesi in modo da usare i valori normali o un valore null. Tale
estensione viene chiamata tipo Nullable.
Ogni tipo di valore nullable viene creato dalla struttura generica Nullable<T> . Si consideri un database che
tiene traccia delle attività correlate al lavoro. Nell'esempio seguente viene costruito un Boolean tipo nullable e
viene dichiarata una variabile di quel tipo. È possibile scrivere la dichiarazione in tre modi:

Dim ridesBusToWork1? As Boolean


Dim ridesBusToWork2 As Boolean?
Dim ridesBusToWork3 As Nullable(Of Boolean)

La variabile ridesBusToWork può avere un valore True , un valore False o nessun valore. Il valore predefinito
iniziale non è alcun valore, che in questo caso potrebbe indicare che le informazioni non sono state ancora
ottenute per questa persona. Al contrario, False potrebbe significare che le informazioni sono state ottenute e
che la persona non esegue il bus per lavorare.
È possibile dichiarare variabili e proprietà con tipi di valore Nullable ed è possibile dichiarare una matrice con
elementi di un tipo di valore Nullable. È possibile dichiarare procedure con tipi di valore nullable come
parametri ed è possibile restituire un tipo di valore Nullable da una Function routine.
Non è possibile costruire un tipo nullable in un tipo di riferimento, ad esempio una matrice, un oggetto String
o una classe. Il tipo sottostante deve essere un tipo valore. Per altre informazioni, vedere Value Types and
Reference Types.

Uso di una variabile di tipo Nullable


I membri più importanti di un tipo di valore nullable sono le relative HasValue Value proprietà e. Per una
variabile di un tipo di valore Nullable, HasValue indica se la variabile contiene un valore definito. Se HasValue è
True , è possibile leggere il valore da Value . Si noti che HasValue e Value sono ReadOnly Proprietà.

Valori predefiniti
Quando si dichiara una variabile con un tipo di valore Nullable, la relativa HasValue proprietà ha il valore
predefinito False . Questo significa che per impostazione predefinita la variabile non ha un valore definito,
anziché il valore predefinito del tipo di valore sottostante. Nell'esempio seguente, la variabile numberOfChildren
inizialmente non ha un valore definito, anche se il valore predefinito del Integer tipo è 0.

Dim numberOfChildren? As Integer

Un valore null è utile per indicare un valore non definito o sconosciuto. Se numberOfChildren è stata dichiarata
come Integer , non esiste alcun valore che potrebbe indicare che le informazioni non sono attualmente
disponibili.
Archiviazione di valori
È possibile archiviare un valore in una variabile o in una proprietà di un tipo di valore nullable in modo tipico.
Nell'esempio seguente viene assegnato un valore alla variabile numberOfChildren dichiarata nell'esempio
precedente.

numberOfChildren = 2

Se una variabile o una proprietà di un tipo di valore Nullable contiene un valore definito, è possibile fare in
modo che venga ripristinato lo stato iniziale della mancata assegnazione di un valore. A tale scopo, impostare la
variabile o la proprietà su Nothing , come illustrato nell'esempio seguente.

numberOfChildren = Nothing

NOTE
Sebbene sia possibile assegnare Nothing a una variabile di un tipo di valore Nullable, non è possibile eseguirne il test per
Nothing utilizzando il segno di uguale. Il confronto che usa il segno di uguale, someVar = Nothing , restituisce sempre
Nothing . È possibile eseguire il test della HasValue proprietà della variabile per False o eseguire il test usando l' Is
IsNot operatore OR.

Recupero di valori
Per recuperare il valore di una variabile di un tipo di valore Nullable, è necessario innanzitutto testarne la
HasValue proprietà per verificare che disponga di un valore. Se si tenta di leggere il valore quando HasValue è
False , Visual Basic genera un' InvalidOperationException eccezione. Nell'esempio seguente viene illustrata la
modalità consigliata per leggere la variabile numberOfChildren degli esempi precedenti.

If numberOfChildren.HasValue Then
MsgBox("There are " & CStr(numberOfChildren) & " children.")
Else
MsgBox("It is not known how many children there are.")
End If

Confronto tra tipi Nullable


Quando Boolean le variabili nullable vengono utilizzate nelle espressioni booleane, il risultato può essere True
, False o Nothing . Di seguito è riportata la tabella di verità per And e Or . Poiché b1 e b2 ora hanno tre
valori possibili, è possibile valutare nove combinazioni.

B1 B2 B1 E B2 B1 O B2

Nothing Nothing Nothing Nothing

Nothing True Nothing True

Nothing False False Nothing

True Nothing Nothing True

True True True True

True False False True

False Nothing False Nothing


B1 B2 B1 E B2 B1 O B2

False True False True

False False False False

Quando il valore di una variabile o di un'espressione booleana è Nothing , non è true né false . Si consideri
l'esempio seguente.

Dim b1? As Boolean


Dim b2? As Boolean
b1 = True
b2 = Nothing

' The following If statement displays "Expression is not true".


If (b1 And b2) Then
Console.WriteLine("Expression is true")
Else
Console.WriteLine("Expression is not true")
End If

' The following If statement displays "Expression is not false".


If Not (b1 And b2) Then
Console.WriteLine("Expression is false")
Else
Console.WriteLine("Expression is not false")
End If

In questo esempio, b1 And b2 restituisce Nothing . Di conseguenza, la Else clausola viene eseguita in ogni
If istruzione e l'output è il seguente:

Expression is not true

Expression is not false

NOTE
AndAlso e OrElse , che usano la valutazione del cortocircuito, devono valutare i secondi operandi quando il primo
restituisce Nothing .

Propagazione
Se uno o entrambi gli operandi di un'operazione aritmetica, di confronto, di spostamento o di tipo è un tipo di
valore Nullable, il risultato dell'operazione è anche un tipo di valore Nullable. Se entrambi gli operandi hanno
valori che non lo sono Nothing , l'operazione viene eseguita sui valori sottostanti degli operandi, come se
nessuno dei due fosse un tipo di valore Nullable. Nell'esempio seguente le variabili compare1 e sum1 sono
tipizzate in modo implicito. Se si posiziona il puntatore del mouse su di essi, si noterà che il compilatore deduce i
tipi di valore Nullable per entrambi.
' Variable n is a nullable type, but both m and n have proper values.
Dim m As Integer = 3
Dim n? As Integer = 2

' The comparison evaluated is 3 > 2, but compare1 is inferred to be of


' type Boolean?.
Dim compare1 = m > n
' The values summed are 3 and 2, but sum1 is inferred to be of type Integer?.
Dim sum1 = m + n

' The following line displays: 3 * 2 * 5 * True


Console.WriteLine($"{m} * {n} * {sum1} * {compare1}")

Se uno o entrambi gli operandi hanno un valore Nothing , il risultato sarà Nothing .

' Change the value of n to Nothing.


n = Nothing

Dim compare2 = m > n


Dim sum2 = m + n

' Because the values of n, compare2, and sum2 are all Nothing, the
' following line displays: 3 * <null> * <null> * <null>
Console.WriteLine($"{m} * {If(n, "<null>")} * {If(sum2, "<null>")} * {If(compare2, "<null>")}")

Utilizzo di tipi nullable con dati


Un database è uno dei punti più importanti per l'utilizzo di tipi di valore Nullable. Non tutti gli oggetti di
database supportano attualmente i tipi di valore Nullable, mentre gli adattatori di tabella generati dalla finestra
di progettazione. Vedere supporto TableAdapter per i tipi nullable.

Vedi anche
InvalidOperationException
HasValue
Tipi di dati
Tipi di valore e tipi di riferimento
Risoluzione dei problemi relativi ai tipi di dati
Compilare i set di dati usando oggetti TableAdapter
Operatore If
Inferenza del tipo di variabile locale
Operatore Is
Operatore IsNot
Tipi di valore Nullable (C#)
Value Types and Reference Types
05/03/2021 • 5 minutes to read • Edit Online

Esistono due tipi di tipi in Visual Basic: tipi di riferimento e tipi di valore. Le variabili dei tipi di riferimento
archiviano i riferimenti ai relativi dati (oggetti), mentre le variabili dei tipi di valore contengono direttamente i
dati. Con i tipi di riferimento, due variabili possono fare riferimento allo stesso oggetto. Di conseguenza le
operazioni su una variabile possono influire sull'oggetto a cui fa riferimento l'altra variabile. Con i tipi valore,
ogni variabile ha una propria copia dei dati e non è possibile che le operazioni su una variabile influiscano
sull'altra (tranne nel caso del modificatore ByRef nei parametri).

Tipi valore
Un tipo di dati è un tipo di valore se include i dati all'interno della propria allocazione di memoria. I tipi di valore
includono i seguenti:
Tutti i tipi di dati numerici
Boolean , Char e Date

Tutte le strutture, anche se i relativi membri sono tipi di riferimento


Enumerazioni, poiché il tipo sottostante è sempre,,,,,, SByte Short Integer Long Byte UShort
UInteger o ULong

Ogni struttura è un tipo valore, anche se contiene membri di tipo riferimento. Per questo motivo, i tipi di valore
come Char e Integer vengono implementati da strutture di .NET Framework.
È possibile dichiarare un tipo valore utilizzando la parola chiave riservata, ad esempio Decimal . È anche
possibile usare la New parola chiave per inizializzare un tipo di valore. Questa operazione è particolarmente
utile se il tipo dispone di un costruttore che accetta parametri. Un esempio è il Decimal(Int32, Int32, Int32,
Boolean, Byte) costruttore, che compila un nuovo Decimal valore dalle parti fornite.

Tipi riferimento
Un tipo riferimento archivia un riferimento ai relativi dati. I tipi di riferimento includono gli elementi seguenti:
String

Tutte le matrici, anche se i relativi elementi sono tipi di valore


Tipi di classe, ad esempio Form
Delegati
Una classe è un tipo di riferimento. Si noti che ogni matrice è un tipo di riferimento, anche se i relativi membri
sono tipi valore.
Poiché ogni tipo di riferimento rappresenta una classe .NET Framework sottostante, è necessario utilizzare la
parola chiave new operator quando viene inizializzata. L'istruzione seguente Inizializza una matrice.

Dim totals() As Single = New Single(8) {}


Elementi che non sono tipi
Gli elementi di programmazione seguenti non sono qualificati come tipi, perché non è possibile specificarli
come tipo di dati per un elemento dichiarato:
Spazi dei nomi
Moduli
Eventi
Proprietà e procedure
Variabili, costanti e campi

Utilizzo del tipo di dati Object


È possibile assegnare un tipo di riferimento o un tipo di valore a una variabile del Object tipo di dati. Una
Object variabile include sempre un riferimento ai dati, non i dati stessi. Tuttavia, se si assegna un tipo valore a
una Object variabile, si comporta come se contiene i propri dati. Per ulteriori informazioni, vedere tipo di dati
Object.
È possibile verificare se una Object variabile funge da tipo di riferimento o un tipo di valore passandola al
IsReference metodo nella Information classe dello Microsoft.VisualBasic spazio dei nomi.
Information.IsReference restituisce True se il contenuto della Object variabile rappresenta un tipo di
riferimento.

Vedi anche
Tipi di valore Nullable
Conversioni di tipi in Visual Basic
Istruzione Structure
Utilizzo efficiente dei tipi di dati
Object Data Type
Tipi di dati
Conversioni di tipi in Visual Basic
05/03/2021 • 2 minutes to read • Edit Online

Il processo di modifica di un valore da un tipo di dati a un altro tipo è denominato conversione. Le conversioni
sono verso un tipo di dati più ampio o più piccolo, a seconda delle capacità dei dati dei tipi interessati. Sono
anche implicite o esplicite, a seconda della sintassi nel codice sorgente.

Contenuto della sezione


Widening and Narrowing Conversions
Vengono illustrate le conversioni classificate in base a se il tipo di destinazione può conservare i dati.
Conversioni implicite ed esplicite
Vengono illustrate le conversioni classificate in base al fatto che Visual Basic le esegua automaticamente.
Conversioni fra stringhe e altri tipi
Viene illustrata la conversione tra stringhe e valori numerici, Boolean o di data/ora.
Procedura: convertire un oggetto in un altro tipo in Visual Basic
Viene illustrato come convertire una Object variabile in qualsiasi altro tipo di dati.
Conversioni di matrice
Illustra il processo di conversione tra matrici di tipi di dati diversi.

Sezioni correlate
Tipi di dati
Introduce i tipi di dati Visual Basic e ne descrive l'utilizzo.
Tipi di dati
Elenca i tipi di dati elementari forniti da Visual Basic.
Risoluzione dei problemi relativi ai tipi di dati
Vengono illustrati alcuni problemi comuni che possono verificarsi quando si utilizzano i tipi di dati di.
Conversioni di ampliamento e restrizione (Visual
Basic)
05/03/2021 • 9 minutes to read • Edit Online

Una considerazione importante per la conversione di un tipo è la possibilità che il risultato della conversione sia
compreso nell'intervallo del tipo di dati di destinazione.
Una conversione verso un tipo di dati più ampio modifica un valore in un tipo di dati che può consentire
qualsiasi valore possibile dei dati originali. Le conversioni verso un tipo di dati più ampio conservano il valore di
origine ma possono modificarne la rappresentazione. Questo errore si verifica se si esegue la conversione da un
tipo integrale a Decimal o da Char a String .
Una conversione verso un tipo di dati più piccolo imposta un valore su un tipo di dati che potrebbe non
contenere alcuni dei possibili valori. Ad esempio, un valore frazionario viene arrotondato quando viene
convertito in un tipo integrale e un tipo numerico convertito in Boolean viene ridotto a True o False .

conversioni verso un tipo di dati più grande


Nella tabella seguente vengono illustrate le conversioni standard verso un tipo di ampliamento.

T IP O DI DAT I VIEN E A M P L IATO A I T IP I DI DAT I 1

SByte SByte , Short , Integer , Long , Decimal , Single ,


Double

Byte Byte , Short , UShort , Integer , UInteger , Long ,


ULong , Decimal , Single , Double

Breve Short , Integer , Long , Decimal , Single , Double

UShort UShort , Integer , UInteger , Long , ULong , Decimal ,


Single , Double

Integer Integer , Long , Decimal , Single , Double 2

UInteger UInteger , Long , ULong , Decimal , Single ,


Double 2

Long Long , Decimal , Single , Double 2

ULong ULong , Decimal , Single , Double 2

Decimale Decimal , Single , Double 2

Singolo Single , Double

Double Double
T IP O DI DAT I VIEN E A M P L IATO A I T IP I DI DAT I

Qualsiasi tipo enumerato (enum) Il tipo integrale sottostante e qualsiasi tipo in cui viene
ampliato il tipo sottostante.

Char Char , String

Matrice Char Char matrice String

Qualsiasi tipo Object

Qualsiasi tipo derivato Qualsiasi tipo di base da cui è derivato 3 .

Qualsiasi tipo Qualsiasi interfaccia implementata.

Nothing Qualsiasi tipo di dati o tipo di oggetto.

1 per definizione, ogni tipo di dati viene ampliato a se stesso.


2 le conversioni da Integer , UInteger , Long , ULong o Decimal a o potrebbero comportare Single Double
la perdita di precisione, ma mai in perdita di grandezza. In questo senso, non subiscono perdite di informazioni.
3 potrebbe sembrare sorprendente che una conversione da un tipo derivato a uno dei relativi tipi di base sia più

ampia. La giustificazione è che il tipo derivato contiene tutti i membri del tipo di base, quindi è qualificato come
un'istanza del tipo di base. Nella direzione opposta, il tipo di base non contiene i nuovi membri definiti dal tipo
derivato.
Le conversioni verso un tipo di dati più ampio hanno sempre esito positivo in fase di esecuzione e non
subiscono mai È sempre possibile eseguirli in modo implicito, se l' istruzione Option Strict imposta l'opzione di
controllo del tipo su On o su Off .

conversioni verso un tipo di dati più piccolo


Di seguito sono riportate le conversioni standard più strette:
Direzioni inverse delle conversioni verso un tipo di inverso più ampio nella tabella precedente, ad
eccezione del fatto che ogni tipo viene ampliato a se stesso.
Conversioni in entrambe le direzioni tra il tipo booleano e qualsiasi tipo numerico
Conversioni da qualsiasi tipo numerico a qualsiasi tipo enumerato ( Enum )
Conversioni in entrambe le direzioni tra stringa e qualsiasi tipo numerico, Boolean o Data
Conversioni da un tipo di dati o da un tipo di oggetto a un tipo derivato da esso
Le conversioni verso un tipo di dati più piccolo non vengono sempre eseguite in fase di esecuzione e possono
avere esito negativo o causare una perdita di dati. Si verifica un errore se il tipo di dati di destinazione non è in
grado di ricevere il valore da convertire. Una conversione numerica, ad esempio, può causare un overflow. Il
compilatore non consente di eseguire in modo implicito le conversioni verso un tipo di caratteri più piccolo, a
meno che l' istruzione Option Strict non imposti l'opzione di controllo del tipo su Off .
NOTE
L'errore di conversione verso un tipo di ristringimento viene eliminato per le conversioni dagli elementi di una
For Each…Next raccolta alla variabile di controllo del ciclo. Per ulteriori informazioni ed esempi, vedere la sezione relativa
alle conversioni verso un tipo di dati più piccolo in per ciascuna... Istruzione successiva.

Quando usare le conversioni verso un tipo di caratteri più piccolo


Si utilizza una conversione verso un tipo di dati più piccolo quando si sa che il valore di origine può essere
convertito nel tipo di dati di destinazione senza errori o perdita di dati. Se, ad esempio, si dispone di un oggetto
String che si conosce contiene "true" o "false", è possibile utilizzare la CBool parola chiave per convertirlo in
Boolean .

Eccezioni durante la conversione


Poiché le conversioni verso un tipo di conversione più ampio hanno sempre esito positivo, non generano
eccezioni. Le conversioni verso un tipo di testo più piccolo, in caso di errore, generano in genere le eccezioni
seguenti:
InvalidCastException : se non è stata definita alcuna conversione tra i due tipi
OverflowException : (solo tipi integrali) se il valore convertito è troppo grande per il tipo di destinazione
Se una classe o una struttura definisce una funzione CType che funge da operatore di conversione verso o da
tale classe o struttura, che CType può generare qualsiasi eccezione ritenuta appropriata. Inoltre, è CType
possibile che venga chiamato Visual Basic funzioni o metodi .NET Framework, che a loro volta possono generare
una serie di eccezioni.

Modifiche durante le conversioni di tipi di riferimento


Una conversione da un tipo riferimento copia solo il puntatore al valore. Il valore stesso non viene copiato né
modificato in alcun modo. L'unica cosa che può cambiare è il tipo di dati della variabile che contiene il puntatore.
Nell'esempio seguente il tipo di dati viene convertito dalla classe derivata alla relativa classe di base, ma
l'oggetto a cui puntano entrambe le variabili è invariato.

' Assume class cSquare inherits from class cShape.


Dim shape As cShape
Dim square As cSquare = New cSquare
' The following statement performs a widening
' conversion from a derived class to its base class.
shape = square

Vedi anche
Tipi di dati
Conversioni di tipi in Visual Basic
Conversioni implicite ed esplicite
Conversioni fra stringhe e altri tipi
Procedura: convertire un oggetto in un altro tipo in Visual Basic
Conversioni di matrice
Tipi di dati
CString
Conversioni implicite ed esplicite (Visual Basic)
05/03/2021 • 9 minutes to read • Edit Online

Una conversione implicita non richiede alcuna sintassi speciale nel codice sorgente. Nell'esempio seguente
Visual Basic converte in modo implicito il valore di k in un valore a virgola mobile a precisione singola prima
di assegnarlo a q .

Dim k As Integer
Dim q As Double
' Integer widens to Double, so you can do this with Option Strict On.
k = 432
q = k

Una conversione esplicita usa una parola chiave di conversione del tipo. Visual Basic fornisce diverse parole
chiave, che assegnano un'espressione tra parentesi al tipo di dati desiderato. Queste parole chiave agiscono
come funzioni, ma il compilatore genera il codice inline, quindi l'esecuzione è leggermente più veloce rispetto a
una chiamata di funzione.
Nell'estensione seguente dell'esempio precedente, la CInt parola chiave converte il valore di di q nuovo in un
intero prima di assegnarlo a k .

' q had been assigned the value 432 from k.


q = Math.Sqrt(q)
k = CInt(q)
' k now has the value 21 (rounded square root of 432).

Parole chiave di conversione


Nella tabella seguente vengono illustrate le parole chiave di conversione disponibili.

PA RO L A C H IAVE DI C O N VERSIO N E DEL C O N VERT E UN 'ESP RESSIO N E IN UN T IP I DI DAT I C O N SEN T IT I DI


T IP O T IP O DI DAT I ESP RESSIO N E DA C O N VERT IRE

CBool Tipo di dati Boolean Qualsiasi tipo numerico (inclusi Byte i


SByte tipi enumerati, e), String ,
Object

CByte Tipo di dati Byte Qualsiasi tipo numerico (inclusi i


SByte tipi enumerati e),, Boolean
String , Object

CChar Tipo di dati Char String , Object

CDate Tipo di dati Date String , Object

CDbl Tipo di dati Double Qualsiasi tipo numerico (inclusi Byte i


SByte tipi enumerati, e), Boolean ,
String , Object
PA RO L A C H IAVE DI C O N VERSIO N E DEL C O N VERT E UN 'ESP RESSIO N E IN UN T IP I DI DAT I C O N SEN T IT I DI
T IP O T IP O DI DAT I ESP RESSIO N E DA C O N VERT IRE

CDec Tipo di dati Decimal Qualsiasi tipo numerico (inclusi Byte i


SByte tipi enumerati, e), Boolean ,
String , Object

CInt Tipo di dati Integer Qualsiasi tipo numerico (inclusi Byte i


SByte tipi enumerati, e), Boolean ,
String , Object

CLng Tipo di dati Long Qualsiasi tipo numerico (inclusi Byte i


SByte tipi enumerati, e), Boolean ,
String , Object

CObj Object Data Type Qualsiasi tipo

CSByte Tipo di dati SByte Qualsiasi tipo numerico (inclusi i Byte


tipi enumerati e),, Boolean String ,
Object

CShort Tipo di dati Short Qualsiasi tipo numerico (inclusi Byte i


SByte tipi enumerati, e), Boolean ,
String , Object

CSng Tipo di dati Single Qualsiasi tipo numerico (inclusi Byte i


SByte tipi enumerati, e), Boolean ,
String , Object

CStr Tipo di dati String Qualsiasi tipo numerico (inclusi Byte i


SByte tipi enumerati, e), Boolean ,
Char , Char matrice, Date ,
Object

CType Tipo specificato dopo la virgola ( , ) Quando si esegue la conversione in un


tipo di dati Elementary (inclusa una
matrice di un tipo elementare), gli
stessi tipi consentiti per la parola
chiave di conversione corrispondente

Quando si esegue la conversione in un


tipo di dati composito, le interfacce
implementate e le classi da cui eredita

Quando si esegue la conversione in


una classe o struttura in cui è stato
sottoposto a overload CType , tale
classe o struttura

CUInt Tipo di dati UInteger Qualsiasi tipo numerico (inclusi Byte i


SByte tipi enumerati, e), Boolean ,
String , Object

CULng Tipo di dati ULong Qualsiasi tipo numerico (inclusi Byte i


SByte tipi enumerati, e), Boolean ,
String , Object
PA RO L A C H IAVE DI C O N VERSIO N E DEL C O N VERT E UN 'ESP RESSIO N E IN UN T IP I DI DAT I C O N SEN T IT I DI
T IP O T IP O DI DAT I ESP RESSIO N E DA C O N VERT IRE

CUShort Tipo di dati UShort Qualsiasi tipo numerico (inclusi Byte i


SByte tipi enumerati, e), Boolean ,
String , Object

Funzione CType
La funzione CType opera su due argomenti. Il primo è l'espressione da convertire e la seconda è il tipo di dati di
destinazione o la classe di oggetti. Si noti che il primo argomento deve essere un'espressione, non un tipo.
CType è una funzione inline, ovvero il codice compilato esegue la conversione, spesso senza generare una
chiamata di funzione. In questo modo le prestazioni risultano migliorate.
Per un confronto di CType con le altre parole chiave di conversione dei tipi, vedere Operatore DirectCast e
operatore TryCast.
Tipi elementari
L'esempio seguente illustra l'uso di CType .

k = CType(q, Integer)
' The following statement coerces w to the specific object class Label.
f = CType(w, Label)

Tipi compositi
È possibile usare CType per convertire i valori in tipi di dati compositi e in tipi elementari. È anche possibile
usarlo per forzare una classe di oggetti nel tipo di una delle relative interfacce, come nell'esempio seguente.

' Assume class cZone implements interface iZone.


Dim h As Object
' The first argument to CType must be an expression, not a type.
Dim cZ As cZone
' The following statement coerces a cZone object to its interface iZone.
h = CType(cZ, iZone)

Tipi di matrici
CType può anche convertire i tipi di dati della matrice, come nell'esempio seguente.

Dim v() As classV


Dim obArray() As Object
' Assume some object array has been assigned to obArray.
' Check for run-time type compatibility.
If TypeOf obArray Is classV()
' obArray can be converted to classV.
v = CType(obArray, classV())
End If

Per ulteriori informazioni e un esempio, vedere conversioni di matrici.


Tipi che definiscono CType
È possibile definire CType in una classe o una struttura definita. In questo modo è possibile convertire i valori
da e verso il tipo della classe o della struttura. Per altre informazioni e per un esempio, vedere procedura:
definire un operatore di conversione.
NOTE
I valori utilizzati con una parola chiave di conversione devono essere validi per il tipo di dati di destinazione oppure si
verifica un errore. Se, ad esempio, si tenta di convertire un oggetto Long in un oggetto Integer , il valore di Long
deve essere compreso nell'intervallo valido per il Integer tipo di dati.

Cau t i on

CType La specifica di per la conversione da un tipo di classe a un altro non riesce in fase di esecuzione se il tipo
di origine non deriva dal tipo di destinazione. Tale errore genera un' InvalidCastException eccezione.
Tuttavia, se uno dei tipi è una struttura o una classe definita e se è stato definito CType su tale struttura o classe,
una conversione può avere esito positivo se soddisfa i requisiti di CType . Vedere procedura: definire un
operatore di conversione.
L'esecuzione di una conversione esplicita è nota anche come cast di un'espressione a un tipo di dati o a una
classe di oggetti specificati.

Vedi anche
Conversioni di tipi in Visual Basic
Conversioni fra stringhe e altri tipi
Procedura: convertire un oggetto in un altro tipo in Visual Basic
Strutture
Tipi di dati
CString
Risoluzione dei problemi relativi ai tipi di dati
Conversioni fra stringhe e altri tipi (Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

È possibile convertire un valore numerico, Boolean o data/ora in un oggetto String . È anche possibile
eseguire la conversione in senso inverso, da un valore stringa a numeric, Boolean o, Date purché il contenuto
della stringa possa essere interpretato come un valore valido del tipo di dati di destinazione. In caso affermativo,
si verifica un errore in fase di esecuzione.
Le conversioni per tutte queste assegnazioni, in entrambe le direzioni, sono le conversioni verso un tipo di
caratteri più piccolo. È necessario utilizzare le parole chiave di conversione dei tipi ( CBool ,, CByte CDate ,
CDbl , CDec , CInt , CLng , CSByte , CShort , CSng , CStr , CUInt , CULng , CUShort e CType ). Le Format
Val funzioni e offrono un maggiore controllo sulle conversioni tra stringhe e numeri.
Se è stata definita una classe o una struttura, è possibile definire operatori di conversione String dei tipi tra e il
tipo della classe o della struttura. Per altre informazioni, vedere How to: Define a Conversion Operator.

Conversione di numeri in stringhe


È possibile usare la Format funzione per convertire un numero in una stringa formattata, che può includere non
solo le cifre appropriate, ma anche la formattazione di simboli quali un segno di valuta, ad esempio $ ,
separatori di migliaia o simboli di raggruppamento di cifre (ad esempio , ) e un separatore decimale (ad
esempio . ). Format Usa automaticamente i simboli appropriati in base alle impostazioni delle Opzioni
internazionali specificate nel Pannello di controllo di Windows.
Si noti che l'operatore di concatenazione ( & ) può convertire un numero in una stringa in modo implicito,
come illustrato nell'esempio riportato di seguito.

' The following statement converts count to a String value.


Str = "The total count is " & count

Conversione di stringhe in numeri


È possibile usare la Val funzione per convertire in modo esplicito le cifre di una stringa in un numero. Val
legge la stringa fino a quando non viene rilevato un carattere diverso da una cifra, uno spazio, una tabulazione,
un avanzamento riga o un punto. Le sequenze "&O" e "&H" modificano la base del sistema numerico e
terminano l'analisi. Fino a quando non viene arrestata la lettura, Val converte tutti i caratteri appropriati in un
valore numerico. Ad esempio, l'istruzione seguente restituisce il valore 141.825 .
Val(" 14 1.825 miles")

Quando Visual Basic converte una stringa in un valore numerico, USA le impostazioni delle Opzioni
internazionali specificate nel pannello di controllo di Windows per interpretare il separatore delle migliaia, il
separatore decimale e il simbolo di valuta. Ciò significa che una conversione potrebbe avere esito positivo in
un'impostazione ma non in un'altra. Ad esempio, "$14.20" è accettabile nelle impostazioni locali in inglese
(Stati Uniti) ma non in tutte le impostazioni locali francesi.

Vedi anche
Conversioni di tipi in Visual Basic
Widening and Narrowing Conversions
Conversioni implicite ed esplicite
Procedura: convertire un oggetto in un altro tipo in Visual Basic
Conversioni di matrice
Tipi di dati
CString
Sviluppare app globalizzate e localizzate
Procedura: convertire un oggetto in un altro tipo in
Visual Basic
05/03/2021 • 2 minutes to read • Edit Online

Per convertire una Object variabile in un altro tipo di dati, è possibile utilizzare una parola chiave di
conversione come la funzione CType.

Esempio
Nell'esempio seguente viene convertita una Object variabile in un oggetto Integer e un oggetto String .

Public Sub objectConversion(ByVal anObject As Object)


Dim anInteger As Integer
Dim aString As String
anInteger = CType(anObject, Integer)
aString = CType(anObject, String)
End Sub

Se si sa che il contenuto di una Object variabile è di un determinato tipo di dati, è preferibile convertire la
variabile in quel tipo di dati. Se si continua a usare la Object variabile, è necessario eseguire la conversione
boxing e unboxing (per un tipo di valore) o l' associazione tardiva (per un tipo di riferimento). Queste operazioni
consentono di ottenere tempo di esecuzione aggiuntivo e rallentare le prestazioni.

Compilare il codice
L'esempio presenta i requisiti seguenti:
Un riferimento allo spazio dei nomi System.

Vedi anche
Object
Conversioni di tipi in Visual Basic
Widening and Narrowing Conversions
Conversioni implicite ed esplicite
Conversioni fra stringhe e altri tipi
Conversioni di matrice
Strutture
Tipi di dati
CString
Conversioni di matrici (Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

È possibile convertire un tipo di matrice in un tipo di matrice diverso purché si soddisfino le condizioni seguenti:
Rango uguale. Le classificazioni delle due matrici devono essere uguali, ovvero devono avere lo stesso
numero di dimensioni. Tuttavia, non è necessario che le lunghezze delle rispettive dimensioni siano
uguali.
Tipo di dati dell'elemento. I tipi di dati degli elementi di entrambe le matrici devono essere tipi di
riferimento. Non è possibile convertire una Integer matrice in una matrice Long o anche in una Object
matrice perché è necessario almeno un tipo di valore. Per altre informazioni, vedere Value Types and
Reference Types.
Conver tibilità della. È necessario che sia possibile eseguire una conversione verso un tipo di
ingrandimento o una riduzione tra i tipi di elemento delle due matrici. Un esempio in cui si verifica un
errore di questo requisito è un tentativo di conversione tra una String matrice e una matrice di una
classe derivata da System.Attribute . Questi due tipi non hanno nulla in comune e non esiste alcuna
conversione di alcun tipo.
Una conversione di un tipo di matrice in un altro viene ampliata o ristretta a seconda che la conversione dei
rispettivi elementi sia allargata o ridotta. Per altre informazioni, vedere Widening and Narrowing Conversions.

Conversione in una matrice di oggetti


Quando si dichiara una Object matrice senza inizializzarla, il relativo tipo di elemento è purché Object
rimanga non inizializzato. Quando lo si imposta su una matrice di una classe specifica, viene utilizzato il tipo di
tale classe. Tuttavia, il tipo sottostante è ancora Object e successivamente è possibile impostarlo su un'altra
matrice di una classe non correlata. Poiché tutte le classi derivano da Object , è possibile modificare il tipo di
elemento della matrice da qualsiasi classe a qualsiasi altra classe.
Nell'esempio seguente non esiste alcuna conversione tra i tipi student e String , ma entrambi derivano da
Object , quindi tutte le assegnazioni sono valide.

' Assume student has already been defined as a class.


Dim testArray() As Object
' testArray is still an Object array at this point.
Dim names() As String = New String(3) {"Name0", "Name1", "Name2", "Name3"}
testArray = New student(3) {}
' testArray is now of type student().
testArray = names
' testArray is now a String array.

Tipo sottostante di una matrice


Se si dichiara originariamente una matrice con una classe specifica, il relativo tipo di elemento sottostante è tale
classe. Se successivamente lo si imposta su una matrice di un'altra classe, è necessario eseguire una conversione
tra le due classi.
Nell'esempio seguente students è una student matrice. Poiché non esiste alcuna conversione tra String e
student , l'ultima istruzione ha esito negativo.
Dim students() As student
Dim names() As String = New String(3) {"Name0", "Name1", "Name2", "Name3"}
students = New Student(3) {}
' The following statement fails at compile time.
students = names

Vedi anche
Tipi di dati
Conversioni di tipi in Visual Basic
Conversioni implicite ed esplicite
Conversioni fra stringhe e altri tipi
Procedura: convertire un oggetto in un altro tipo in Visual Basic
Tipi di dati
CString
Matrici
Strutture (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Una struttura è una generalizzazione del tipo definito dall'utente (UDT) supportata dalle versioni precedenti di
Visual Basic. Oltre ai campi, le strutture possono esporre proprietà, metodi ed eventi. Una struttura può
implementare una o più interfacce ed è possibile dichiarare i singoli livelli di accesso per ogni campo.
È possibile combinare elementi di dati di tipi diversi per creare una struttura. Una struttura associa uno o più
elementi tra loro e con la struttura stessa. Quando si dichiara una struttura, diventa un tipo di dati composito ed
è possibile dichiarare variabili di quel tipo.
Le strutture sono utili quando si desidera che una singola variabile contenga diverse informazioni correlate. È ad
esempio possibile che si desideri proteggere il nome, l'estensione del telefono e lo stipendio di un dipendente. È
possibile usare diverse variabili per queste informazioni oppure definire una struttura e usarla per una singola
variabile dipendente. Il vantaggio della struttura diventa evidente quando si dispone di molti dipendenti e
pertanto di molte istanze della variabile.

Contenuto della sezione


Procedura: Dichiarare una struttura
Viene illustrato come dichiarare una struttura e i relativi elementi.
Variabili di struttura
Viene illustrata l'assegnazione di una struttura a una variabile e l'accesso ai relativi elementi.
Strutture e altri elementi di programmazione
Riepiloga il modo in cui le strutture interagiscono con matrici, oggetti, procedure e viceversa.
Strutture e classi
Descrive le analogie e le differenze tra le strutture e le classi.

Sezioni correlate
Tipi di dati
Introduce i tipi di dati Visual Basic e ne descrive l'utilizzo.
Tipi di dati
Elenca i tipi di dati elementari forniti da Visual Basic.
Procedura: dichiarare una struttura (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Si inizia una dichiarazione di struttura con l' istruzione Structuree la si termina con l' End Structure istruzione.
Tra queste due istruzioni è necessario dichiarare almeno un elemento. Gli elementi possono essere di qualsiasi
tipo di dati, ma almeno uno deve essere una variabile non condivisa o un evento non condiviso non
personalizzato.
Non è possibile inizializzare alcuno degli elementi della struttura nella dichiarazione della struttura. Quando si
dichiara una variabile come un tipo di struttura, si assegnano valori agli elementi accedendo tramite la variabile.
Per informazioni sulle differenze tra le strutture e le classi, vedere strutture e classi.
A scopo dimostrativo, si consideri una situazione in cui si desidera tenere traccia del nome di un dipendente,
dell'estensione telefonico e dello stipendio. Una struttura consente di eseguire questa operazione in una singola
variabile.
Per dichiarare una struttura
1. Creare le istruzioni iniziali e finali per la struttura.
È possibile specificare il livello di accesso di una struttura utilizzando la parola chiave public, protected,
Friendo private oppure è possibile consentire l'impostazione predefinita di Public .

Private Structure employee


End Structure

2. Aggiungere elementi al corpo della struttura.


Una struttura deve contenere almeno un elemento. È necessario dichiarare ogni elemento e specificare
un livello di accesso. Se si usa l' istruzione Dim senza parole chiave, l'impostazione predefinita
dell'accessibilità è Public .

Private Structure employee


Public givenName As String
Public familyName As String
Public phoneExtension As Long
Private salary As Decimal
Public Sub giveRaise(raise As Double)
salary *= raise
End Sub
Public Event salaryReviewTime()
End Structure

Il salary campo nell'esempio precedente è Private , il che significa che non è accessibile all'esterno
della struttura, anche dalla classe che lo contiene. Tuttavia, la giveRaise procedura è Public , quindi può
essere chiamata dall'esterno della struttura. Analogamente, è possibile generare l' salaryReviewTime
evento dall'esterno della struttura.
Oltre a variabili, Sub routine ed eventi, è anche possibile definire costanti, Function procedure e
proprietà in una struttura. È possibile designare al massimo una proprietà come proprietà predefinita,
purché accetti almeno un argomento. È possibile gestire un evento con una procedura condivisa Sub .
Per altre informazioni, vedere procedura: dichiarare e chiamare una proprietà predefinita in Visual Basic.
Vedi anche
Tipi di dati
Tipi di dati elementari
Tipi di dati compositi
Tipi di valore e tipi di riferimento
Strutture
Risoluzione dei problemi relativi ai tipi di dati
Variabili di struttura
Strutture e altri elementi di programmazione
Strutture e classi
Tipo di dati definito dall'utente
Variabili di struttura (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Dopo aver creato una struttura, è possibile dichiarare le variabili a livello di procedura e a livello di modulo
come quel tipo. Ad esempio, è possibile creare una struttura che registra le informazioni relative a un sistema di
computer. L'esempio seguente illustra questa operazione.

Public Structure systemInfo


Public cPU As String
Public memory As Long
Public purchaseDate As Date
End Structure

È ora possibile dichiarare variabili di quel tipo. Questa operazione viene illustrata nella dichiarazione seguente.

Dim mySystem, yourSystem As systemInfo

NOTE
Nelle classi e nei moduli, le strutture dichiarate con l' istruzione Dim sono predefinite per l'accesso pubblico. Se si vuole che
una struttura sia privata, assicurarsi di dichiararla usando la parola chiave private .

Accesso ai valori della struttura


Per assegnare e recuperare valori dagli elementi di una variabile di struttura, è possibile utilizzare la stessa
sintassi utilizzata per impostare e ottenere le proprietà di un oggetto. Si inserisce l'operatore di accesso ai
membri ( . ) tra il nome della variabile di struttura e il nome dell'elemento. Nell'esempio seguente viene
eseguito l'accesso agli elementi delle variabili dichiarate in precedenza come tipo systemInfo .

mySystem.cPU = "486"
Dim tooOld As Boolean
If yourSystem.purchaseDate < #1/1/1992# Then tooOld = True

Assegnazione di variabili di struttura


È anche possibile assegnare una variabile a un'altra se entrambe sono dello stesso tipo di struttura. In questo
modo tutti gli elementi di una struttura vengono copiati negli elementi corrispondenti dell'altro. Questa
operazione viene illustrata nella dichiarazione seguente.

yourSystem = mySystem

Se un elemento della struttura è un tipo di riferimento, ad esempio una String Object matrice, o, viene
copiato il puntatore ai dati. Nell'esempio precedente, se systemInfo era inclusa una variabile oggetto, l'esempio
precedente avrebbe copiato il puntatore da mySystem a yourSystem e una modifica ai dati dell'oggetto tramite
una struttura verrebbe applicata quando si accede tramite l'altra struttura.

Vedi anche
Tipi di dati
Tipi di dati elementari
Tipi di dati compositi
Tipi di valore e tipi di riferimento
Strutture
Risoluzione dei problemi relativi ai tipi di dati
Procedura: Dichiarare una struttura
Strutture e altri elementi di programmazione
Strutture e classi
Istruzione Structure
Strutture e altri elementi di programmazione (Visual
Basic)
05/03/2021 • 4 minutes to read • Edit Online

È possibile utilizzare le strutture insieme a matrici, oggetti e procedure, nonché reciprocamente. Le interazioni
utilizzano la stessa sintassi di questi elementi.

NOTE
Non è possibile inizializzare alcuno degli elementi della struttura nella dichiarazione della struttura. È possibile assegnare
valori solo agli elementi di una variabile dichiarata come tipo di struttura.

Strutture e matrici
Una struttura può contenere una matrice come uno o più dei relativi elementi. Questa condizione è illustrata
nell'esempio seguente.

Public Structure systemInfo


Public cPU As String
Public memory As Long
Public diskDrives() As String
Public purchaseDate As Date
End Structure

È possibile accedere ai valori di una matrice all'interno di una struttura nello stesso modo in cui si accede a una
proprietà in un oggetto. Questa condizione è illustrata nell'esempio seguente.

Dim mySystem As systemInfo


ReDim mySystem.diskDrives(3)
mySystem.diskDrives(0) = "1.44 MB"

È anche possibile dichiarare una matrice di strutture. Questa condizione è illustrata nell'esempio seguente.

Dim allSystems(100) As systemInfo

Si seguono le stesse regole per accedere ai componenti di questa architettura di dati. Questa condizione è
illustrata nell'esempio seguente.

ReDim allSystems(5).diskDrives(3)
allSystems(5).CPU = "386SX"
allSystems(5).diskDrives(2) = "100M SCSI"

Strutture e oggetti
Una struttura può contenere un oggetto come uno o più elementi. Questa condizione è illustrata nell'esempio
seguente.
Protected Structure userInput
Public userName As String
Public inputForm As System.Windows.Forms.Form
Public userFileNumber As Integer
End Structure

È consigliabile usare una classe di oggetti specifica in una dichiarazione di questo tipo, anziché Object .

Strutture e procedure
È possibile passare una struttura come argomento di routine. Questa condizione è illustrata nell'esempio
seguente.

Public currentCPUName As String = "700MHz Pentium compatible"


Public currentMemorySize As Long = 256
Public Sub fillSystem(ByRef someSystem As systemInfo)
someSystem.cPU = currentCPUName
someSystem.memory = currentMemorySize
someSystem.purchaseDate = Now
End Sub

Nell'esempio precedente la struttura viene passata per riferimento, che consente alla procedura di modificarne
gli elementi in modo che le modifiche abbiano effetto nel codice chiamante. Se si desidera proteggere una
struttura in base a tale modifica, passarla per valore.
È anche possibile restituire una struttura da una Function routine. Questa condizione è illustrata nell'esempio
seguente.

Dim allSystems(100) As systemInfo


Function findByDate(ByVal searchDate As Date) As systemInfo
Dim i As Integer
For i = 1 To 100
If allSystems(i).purchaseDate = searchDate Then Return allSystems(i)
Next i
' Process error: system with desired purchase date not found.
End Function

Strutture all'interno di strutture


Le strutture possono contenere altre strutture. Questa condizione è illustrata nell'esempio seguente.

Public Structure driveInfo


Public type As String
Public size As Long
End Structure
Public Structure systemInfo
Public cPU As String
Public memory As Long
Public diskDrives() As driveInfo
Public purchaseDate As Date
End Structure

Dim allSystems(100) As systemInfo


ReDim allSystems(1).diskDrives(3)
allSystems(1).diskDrives(0).type = "Floppy"
È anche possibile usare questa tecnica per incapsulare una struttura definita in un modulo all'interno di una
struttura definita in un modulo diverso.
Le strutture possono contenere altre strutture a una profondità arbitraria.

Vedi anche
Tipi di dati
Tipi di dati elementari
Tipi di dati compositi
Tipi di valore e tipi di riferimento
Strutture
Risoluzione dei problemi relativi ai tipi di dati
Procedura: Dichiarare una struttura
Variabili di struttura
Strutture e classi
Istruzione Structure
Strutture e classi (Visual Basic)
05/03/2021 • 9 minutes to read • Edit Online

Visual Basic unifica la sintassi per strutture e classi, con il risultato che entrambe le entità supportano la maggior
parte delle stesse funzionalità. Tuttavia, esistono anche differenze importanti tra le strutture e le classi.
Le classi hanno il vantaggio di essere tipi di riferimento. il passaggio di un riferimento è più efficiente rispetto al
passaggio di una variabile di struttura con tutti i relativi dati. D'altra parte, le strutture non richiedono
l'allocazione della memoria nell'heap globale.
Poiché non è possibile ereditare da una struttura, le strutture devono essere usate solo per gli oggetti che non
devono essere estesi. Usare le strutture quando l'oggetto che si vuole creare ha una dimensione di istanza
ridotta e prendere in considerazione le caratteristiche di prestazioni delle classi rispetto alle strutture.

Somiglianze
Le strutture e le classi sono simili nei seguenti aspetti:
Entrambi sono tipi di contenitori , ovvero contengono altri tipi come membri.
Entrambi hanno membri, che possono includere costruttori, metodi, proprietà, campi, costanti,
enumerazioni, eventi e gestori eventi. Tuttavia, non confondere questi membri con gli elementi dichiarati
di una struttura.
I membri di entrambi possono avere livelli di accesso personalizzati. Ad esempio, un membro può essere
dichiarato Public e un altro Private .
Entrambi possono implementare interfacce.
Entrambi possono avere costruttori condivisi, con o senza parametri.
Entrambi possono esporre una proprietà predefinita, purché la proprietà accetti almeno un parametro.
Entrambi possono dichiarare e generare eventi ed entrambi possono dichiarare delegati.

Differenze
Le strutture e le classi differiscono dai seguenti elementi:
Le strutture sono tipi valore; le classi sono tipi di riferimento. Una variabile di un tipo di struttura contiene
i dati della struttura, anziché contenere un riferimento ai dati come tipo di classe.
Le strutture usano l'allocazione dello stack; le classi usano l'allocazione heap.
Tutti gli elementi della struttura sono Public per impostazione predefinita. le variabili di classe e le
costanti sono per impostazione predefinita Private , mentre altri membri della classe sono Public per
impostazione predefinita. Questo comportamento per i membri della classe garantisce la compatibilità
con il sistema Visual Basic 6,0 di impostazioni predefinite.
Una struttura deve avere almeno una variabile non condivisa o un elemento evento non condiviso, non
personalizzato; una classe può essere completamente vuota.
Gli elementi della struttura non possono essere dichiarati come Protected . i membri della classe
possono.
Una procedura di struttura è in grado di gestire gli eventi solo se si tratta di una procedura condivisa
Sub e solo tramite l' istruzione AddHandler; qualsiasi routine della classe può gestire gli eventi,
utilizzando la parola chiave Handles o l' AddHandler istruzione. Per altre informazioni, vedere Eventi.
Le dichiarazioni di variabili di struttura non possono specificare inizializzatori o dimensioni iniziali per le
matrici; le dichiarazioni di variabili di classe possono.
Le strutture ereditano in modo implicito dalla System.ValueType classe e non possono ereditare da altri
tipi. le classi possono ereditare da qualsiasi classe o classe diversa da System.ValueType .
Le strutture non sono ereditabili; le classi sono.
Le strutture non vengono mai terminate, quindi il Common Language Runtime (CLR) non chiama mai il
Finalize metodo su una struttura; le classi vengono terminate dalla Garbage Collector (GC), che chiama
Finalize su una classe quando rileva che non sono presenti riferimenti attivi rimanenti.
Una struttura non richiede un costruttore. una classe.
Le strutture possono avere costruttori non condivisi solo se accettano parametri. le classi possono avere
con o senza parametri.
Ogni struttura ha un costruttore pubblico implicito senza parametri. Questo costruttore inizializza tutti gli
elementi dati della struttura sui valori predefiniti. Non è possibile ridefinire questo comportamento.

Istanze e variabili
Poiché le strutture sono tipi di valore, ogni variabile di struttura viene associata in modo permanente a una
singola istanza della struttura. Tuttavia, le classi sono tipi di riferimento e una variabile oggetto può fare
riferimento a diverse istanze di classe in momenti diversi. Questa distinzione influiscono sull'utilizzo di strutture
e classi nei modi seguenti:
Inizializzazione. Una variabile di struttura include implicitamente un'inizializzazione degli elementi
usando il costruttore senza parametri della struttura. Pertanto, Dim s As struct1 equivale a
Dim s As struct1 = New struct1() .

Assegnazione di variabili. Quando si assegna una variabile di struttura a un'altra o si passa un'istanza
della struttura a un argomento di routine, i valori correnti di tutti gli elementi variabili vengono copiati
nella nuova struttura. Quando si assegna una variabile oggetto a un'altra o si passa una variabile oggetto
a una routine, viene copiato solo il puntatore di riferimento.
Assegnazione di Nothing. È possibile assegnare il valore Nothing a una variabile di struttura, ma
l'istanza continua a essere associata alla variabile. È comunque possibile chiamare i relativi metodi e
accedere ai relativi elementi dati, anche se gli elementi variabili vengono reinizializzati dall'assegnazione.
Al contrario, se si imposta una variabile oggetto su, l'associazione viene Nothing annullata da qualsiasi
istanza di classe e non è possibile accedere ai membri tramite la variabile finché non viene assegnata
un'altra istanza.
Più istanze. A una variabile oggetto possono essere assegnate istanze di classe diverse in momenti
diversi e diverse variabili oggetto possono fare riferimento alla stessa istanza della classe nello stesso
momento. Le modifiche apportate ai valori dei membri della classe hanno effetto su tali membri quando
si accede tramite un'altra variabile che punta alla stessa istanza.
Gli elementi della struttura, tuttavia, sono isolati all'interno della propria istanza. Le modifiche apportate
ai valori non vengono riflesse in altre variabili di struttura, neanche in altre istanze della stessa Structure
dichiarazione.
Uguaglianza. I test di uguaglianza di due strutture devono essere eseguiti con un test elemento per
elemento. È possibile confrontare due variabili oggetto utilizzando il Equals metodo. Equals indica se le
due variabili puntano alla stessa istanza.

Vedi anche
Tipi di dati
Tipi di dati compositi
Tipi di valore e tipi di riferimento
Strutture
Risoluzione dei problemi relativi ai tipi di dati
Strutture e altri elementi di programmazione
Oggetti e classi
Tuple (Visual Basic)
05/03/2021 • 20 minutes to read • Edit Online

A partire da Visual Basic 2017, il linguaggio Visual Basic offre supporto incorporato per le tuple che
semplificano la creazione di tuple e l'accesso agli elementi delle tuple. Una tupla è una struttura di dati leggera
con un numero e una sequenza di valori specifici. Quando si crea un'istanza della tupla, si definiscono il numero
e il tipo di dati di ogni valore (o elemento). Ad esempio, una tupla con 2 elementi (o coppia) dispone di due
elementi. Il primo può essere un Boolean valore, mentre il secondo è String . Poiché le tuple semplificano
l'archiviazione di più valori in un singolo oggetto, vengono spesso usati come metodo semplice per restituire
più valori da un metodo.

IMPORTANT
Il supporto della tupla richiede il ValueTuple tipo. Se il .NET Framework 4,7 non è installato, è necessario aggiungere il
pacchetto NuGet System.ValueTuple , disponibile nella raccolta NuGet. Senza questo pacchetto, potrebbe essere
presente un errore di compilazione simile a "il tipo predefinito ' ValueTuple (of,,,)' non è definito né importato".

Creazione di istanze e utilizzo di una tupla


Si crea un'istanza di una tupla racchiudendo tra parentesi i valori delimitati da virgole. Ognuno di questi valori
diventa quindi un campo della tupla. Il codice seguente, ad esempio, definisce una tripla (o una tupla con 3
elementi) con un Date come primo valore, un String come secondo e un Boolean come terzo.

Dim holiday = (#07/04/2017#, "Independence Day", True)

Per impostazione predefinita, il nome di ogni campo in una tupla è costituito dalla stringa Item insieme alla
posizione in base 1 del campo nella tupla. Per questa tupla con 3 elementi, il campo è Date Item1 , il campo
String è Item2 e il Boolean campo è Item3 . Nell'esempio seguente vengono visualizzati i valori dei campi
della tupla di cui è stata creata un'istanza nella riga di codice precedente

Console.WriteLine($"{holiday.Item1} is {holiday.Item2}" +
$"{If(holiday.Item3, ", a national holiday", String.Empty)}")
' Output: 7/4/2017 12:00:00 AM Is Independence Day, a national holiday

I campi di una tupla Visual Basic sono di lettura/scrittura; Dopo avere creato un'istanza di una tupla, è possibile
modificarne i valori. Nell'esempio seguente vengono modificati due dei tre campi della tupla creata nell'esempio
precedente e viene visualizzato il risultato.

holiday.Item1 = #01/01/2018#
holiday.Item2 = "New Year's Day"
Console.WriteLine($"{holiday.Item1} is {holiday.Item2}" +
$"{If(holiday.Item3, ", a national holiday", String.Empty)}")
' Output: 1/1/2018 12:00:00 AM Is New Year's Day, a national holiday

Creazione di istanze e utilizzo di una tupla denominata


Anziché utilizzare nomi predefiniti per i campi di una tupla, è possibile creare un'istanza di una tupla denominata
assegnando nomi personalizzati agli elementi della tupla. È possibile accedere ai campi della tupla in base ai
nomi assegnati o ai nomi predefiniti. Nell'esempio seguente viene creata un'istanza della stessa tupla con 3
elementi, ad eccezione del fatto che assegna in modo esplicito il nome del primo campo EventDate , il secondo
Name e il terzo IsHoliday . Visualizza quindi i valori dei campi, li modifica e visualizza di nuovo i valori dei
campi.

Dim holiday = (EventDate:=#07/04/2017#, Name:="Independence Day", IsHoliday:=True)


Console.WriteLine($"{holiday.EventDate} Is {holiday.Name}" +
$"{If(holiday.IsHoliday, ", a national holiday", String.Empty)}")
holiday.Item1 = #01/01/2018#
holiday.Item2 = "New Year's Day"
Console.WriteLine($"{holiday.Item1} is {holiday.Item2}" +
$"{If(holiday.Item3, ", a national holiday", String.Empty)}")
' The example displays the following output:
' 7/4/2017 12:00:00 AM Is Independence Day, a national holiday
' 1/1/2018 12:00:00 AM Is New Year's Day, a national holiday

Nomi di elemento di tupla dedotti


A partire da Visual Basic 15,3, Visual Basic possibile dedurre i nomi degli elementi della tupla. non è necessario
assegnarli in modo esplicito. I nomi di tupla dedotti sono utili quando si Inizializza una tupla da un set di variabili
e si desidera che il nome dell'elemento di tupla corrisponda al nome della variabile.
Nell'esempio seguente viene creata una stateInfo tupla contenente tre elementi denominati in modo esplicito,,
state stateName e capital . Si noti che, nella denominazione degli elementi, l'istruzione di inizializzazione
della tupla assegna semplicemente gli elementi denominati ai valori delle variabili denominate in modo identico.

Const state As String = "MI"


Const stateName As String = "Michigan"
Const capital As String = "Lansing"
Dim stateInfo = (state:=state, stateName:=stateName, capital:=capital)
Console.WriteLine($"{stateInfo.stateName}: 2-letter code: {stateInfo.state}, Capital {stateInfo.capital}")
' The example displays the following output:
' Michigan: 2-letter code: MI, Capital Lansing

Poiché gli elementi e le variabili hanno lo stesso nome, il Visual Basic compilatore può dedurre i nomi dei campi,
come illustrato nell'esempio riportato di seguito.

Const state As String = "MI"


Const stateName As String = "Michigan"
Const capital As String = "Lansing"
Dim stateInfo = (state, stateName, capital)
Console.WriteLine($"{stateInfo.stateName}: 2-letter code: {stateInfo.State}, Capital {stateInfo.capital}")
' The example displays the following output:
' Michigan: 2-letter code: MI, Capital Lansing

Per abilitare i nomi di elementi di tupla derivati, è necessario definire la versione del compilatore Visual Basic da
usare nel file del progetto di Visual Basic ( * . vbproj):

<PropertyGroup>
<LangVersion>15.3</LangVersion>
</PropertyGroup>

Il numero di versione può essere qualsiasi versione del compilatore Visual Basic a partire da 15,3. Anziché
impostare come hardcoded una versione specifica del compilatore, è anche possibile specificare "più recente"
come valore di LangVersion per la compilazione con la versione più recente del compilatore di Visual Basic
installato nel sistema.
Per ulteriori informazioni, vedere impostazione della versione della lingua Visual Basic.
In alcuni casi, il compilatore Visual Basic non è in grado di dedurre il nome dell'elemento di tupla dal nome del
candidato e il campo tupla può essere usato solo con il nome predefinito, ad esempio, e così Item1 Item2 via.
Sono incluse le seguenti:
Il nome del candidato corrisponde al nome di un membro di tupla, ad esempio Item3 , Rest o
ToString .

Il nome candidato viene duplicato nella tupla.


Quando l'inferenza del nome campo ha esito negativo, Visual Basic non genera un errore del compilatore, né
un'eccezione generata in fase di esecuzione. Al contrario, è necessario fare riferimento ai campi di tupla con i
relativi nomi predefiniti, ad esempio Item1 e Item2 .

Tuple e strutture
Una tupla Visual Basic è un tipo di valore che è un'istanza di uno dei tipi generici System. ValueTuple . Ad
esempio, la holiday tupla definita nell'esempio precedente è un'istanza della ValueTuple<T1,T2,T3> struttura. È
progettato per essere un contenitore leggero per i dati. Poiché la tupla ha lo scopo di semplificare la creazione di
un oggetto con più elementi di dati, mancano alcune delle funzionalità che possono avere una struttura
personalizzata. Tra queste sono incluse:
Membri personalizzati. Non è possibile definire proprietà, metodi o eventi personalizzati per una tupla.
Convalida. Non è possibile convalidare i dati assegnati ai campi.
Immutabilità. Visual Basic tuple sono modificabili. Una struttura personalizzata, invece, consente di
controllare se un'istanza è modificabile o non modificabile.
Se i membri personalizzati, la convalida di proprietà e campi o l'immutabilità sono importanti, è consigliabile
utilizzare l'istruzione Visual Basic Structure per definire un tipo di valore personalizzato.
Una tupla Visual Basic eredita i membri del tipo ValueTuple . Oltre ai relativi campi, includono i metodi
seguenti:

M ETO DO DESC RIZ IO N E

CompareTo Confronta la tupla corrente con un'altra tupla con lo stesso


numero di elementi.

Uguale a Determina se la tupla corrente è uguale a un'altra tupla o a


un altro oggetto.

GetHashCode Calcola il codice hash per l'istanza corrente.

ToString Restituisce la rappresentazione di stringa di questa tupla, che


assume il formato (Item1, Item2...) , dove Item1 e
Item2 rappresentano i valori dei campi della tupla.

Inoltre, i tipi ValueTuple implementano IStructuralComparable le IStructuralEquatable interfacce e, che


consentono di definire operatori di confronto personalizzati.

Assegnazione e tuple
Visual Basic supporta l'assegnazione tra tipi di tupla che hanno lo stesso numero di campi. I tipi di campo
possono essere convertiti se si verifica una delle condizioni seguenti:
Il campo di origine e di destinazione sono dello stesso tipo.
Viene definita una conversione verso un tipo di dati più ampio o implicito del tipo di origine nel tipo di
destinazione.
Option Strict è On e viene definita una conversione verso un tipo di dati più piccolo (o esplicito) del
tipo di origine nel tipo di destinazione. Questa conversione può generare un'eccezione se il valore di
origine non è compreso nell'intervallo del tipo di destinazione.
Non sono considerate altre conversioni per le assegnazioni. Esaminiamo i tipi di assegnazioni consentiti tra i tipi
di tupla.
Considerare le variabili usate negli esempi seguenti:

' The number and field types of all these tuples are compatible.
' The only difference Is the field names being used.
Dim unnamed = (42, "The meaning of life")
Dim anonymous = (16, "a perfect square")
Dim named = (Answer:=42, Message:="The meaning of life")
Dim differentNamed = (SecretConstant:=42, Label:="The meaning of life")

Le prime due variabili, unnamed e anonymous , non hanno nomi semantici forniti per i campi. I nomi dei campi
sono i valori predefiniti Item1 e Item2 . Le ultime due variabili named e differentName hanno nomi di campo
semantico. Si noti che queste due tuple presentano nomi diversi per i campi.
Tutte e quattro le tuple hanno lo stesso numero di campi (definito "grado") e i tipi di tali campi sono identici.
Pertanto, tutte queste assegnazioni funzionano:

' Assign named to unnamed.


named = unnamed

' Despite the assignment, named still has fields that can be referred to as 'answer' and 'message'.
Console.WriteLine($"{named.Answer}, {named.Message}")
' Output: 42, The meaning of life

' Assign unnamed to anonymous.


anonymous = unnamed
' Because of the assignment, the value of the elements of anonymous changed.
Console.WriteLine($"{anonymous.Item1}, {anonymous.Item2}")
' Output: 42, The meaning of life

' Assign one named tuple to the other.


named = differentNamed
' The field names are Not assigned. 'named' still has 'answer' and 'message' fields.
Console.WriteLine($"{named.Answer}, {named.Message}")
' Output: 42, The meaning of life

Si noti che non sono assegnati i nomi delle tuple. I valori dei campi vengono assegnati seguendo l'ordine dei
campi nella tupla.
Si noti infine che è possibile assegnare la named tupla alla conversion tupla, anche se il primo campo di named
è un Integer e il primo campo di conversion è Long . Questa assegnazione ha esito positivo perché Integer
la conversione di un oggetto in è una conversione verso un tipo di oggetto più Long ampio

' Assign an (Integer, String) tuple to a (Long, String) tuple (using implicit conversion).
Dim conversion As (Long, String) = named
Console.WriteLine($"{conversion.Item1} ({conversion.Item1.GetType().Name}), " +
$"{conversion.Item2} ({conversion.Item2.GetType().Name})")
' Output: 42 (Int64), The meaning of life (String)
Le tuple con numeri diversi di campi non possono essere assegnate:

' Does not compile.


' VB30311: Value of type '(Integer, Integer, Integer)' cannot be converted
' to '(Answer As Integer, Message As String)'
var differentShape = (1, 2, 3)
named = differentShape

Tuple come valori restituiti dal metodo


Un metodo può restituire solo un valore singolo. Spesso, tuttavia, si vuole che una chiamata al metodo
restituisca più valori. Esistono diversi modi per ovviare a questa limitazione:
È possibile creare una classe o una struttura personalizzata le cui proprietà o campi rappresentano i valori
restituiti dal metodo. Quindi è una soluzione pesante; è necessario definire un tipo personalizzato il cui
unico scopo è recuperare i valori da una chiamata al metodo.
È possibile restituire un singolo valore dal metodo e restituire i valori rimanenti passandoli per
riferimento al metodo. Questo implica il sovraccarico della creazione di un'istanza di una variabile e
rischia di sovrascrivere inavvertitamente il valore della variabile passata per riferimento.
È possibile utilizzare una tupla, che fornisce una soluzione leggera per il recupero di più valori restituiti.
Ad esempio, i metodi Tr yParse in .NET restituiscono un Boolean valore che indica se l'operazione di analisi ha
avuto esito positivo. Il risultato dell'operazione di analisi viene restituito in una variabile passata per riferimento
al metodo. In genere, una chiamata al metodo di analisi, ad esempio, ha un Int32.TryParse aspetto simile al
seguente:

Dim numericString As String = "123456"


Dim number As Integer
Dim result = Int32.TryParse(numericString, number)
Console.WriteLine($"{If(result, $"Success: {number:N0}", "Failure")}")
' Output: 123,456

Se si esegue il wrapping della chiamata al Int32.TryParse metodo nel metodo personalizzato, è possibile
restituire una tupla dall'operazione di analisi. Nell'esempio seguente viene NumericLibrary.ParseInteger
chiamato il Int32.TryParse metodo e viene restituita una tupla denominata con due elementi.

Imports System.Globalization

Public Module NumericLibrary


Public Function ParseInteger(value As String) As (Success As Boolean, Number As Int32)
Dim number As Integer
Return (Int32.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, number), number)
End Function
End Module

È quindi possibile chiamare il metodo con codice simile al seguente:

Dim numericString As String = "123,456"


Dim result = ParseInteger(numericString)
Console.WriteLine($"{If(result.Success, $"Success: {result.Number:N0}", "Failure")}")
Console.ReadLine()
' Output: Success: 123,456
Visual Basic Tuple e Tuple nell'.NET Framework
Una tupla Visual Basic è un'istanza di uno dei tipi generici System. ValueTuple introdotti nella .NET Framework
4,7. Il .NET Framework include anche un set di classi System. Tuple generiche. Queste classi, tuttavia,
differiscono da Visual Basic Tuple e dai tipi generici System. ValueTuple in diversi modi:
Gli elementi delle classi Tuple sono proprietà denominate Item1 , Item2 e così via. In Visual Basic Tuple
e i tipi ValueTuple , gli elementi della tupla sono campi.
Non è possibile assegnare nomi significativi agli elementi di un'istanza di tupla o di un'istanza di
ValueTuple . Visual Basic consente di assegnare nomi che comunicano il significato dei campi.
Le proprietà di un'istanza di tupla sono di sola lettura. le tuple non sono modificabili. In Visual Basic Tuple
e i tipi ValueTuple , i campi di tupla sono di lettura/scrittura; le tuple sono modificabili.
I tipi di tupla generici sono tipi di riferimento. L'utilizzo di questi tipi di tupla indica l'allocazione di
oggetti. Nei percorsi critici, ciò può avere un impatto notevole sulle prestazioni dell'applicazione. Visual
Basic Tuple e i tipi ValueTuple sono tipi di valore.
I metodi di estensione nella TupleExtensions classe facilitano la conversione tra Visual Basic Tuple e gli oggetti
tupla .NET. Il metodo ToTuple converte una tupla di Visual Basic in un oggetto tupla .NET e il metodo
ToValueTuple converte un oggetto tupla .NET in una tupla di Visual Basic.
Nell'esempio seguente viene creata una tupla, viene convertita in un oggetto tupla .NET e riconvertita in una
tupla Visual Basic. Nell'esempio viene quindi confrontata la tupla con quella originale per verificare che siano
uguali.

Module Example
Sub Main()
Dim cityInfo = (name:="New York", area:=468.5, population:=8_550_405)
Console.WriteLine($"{cityInfo}, type {cityInfo.GetType().Name}")

' Convert the Visual Basic tuple to a .NET tuple.


Dim cityInfoT = TupleExtensions.ToTuple(cityInfo)
Console.WriteLine($"{cityInfoT}, type {cityInfoT.GetType().Name}")

' Convert the .NET tuple back to a Visual Basic tuple and ensure they are the same.
Dim cityInfo2 = TupleExtensions.ToValueTuple(cityInfoT)
Console.WriteLine($"{cityInfo2}, type {cityInfo2.GetType().Name}")
Console.WriteLine($"{NameOf(cityInfo)} = {NameOf(cityInfo2)}: {cityInfo.Equals(cityInfo2)}")
Console.ReadLine()
End Sub
End Module
' The example displays the following output:
' (New York, 468.5, 8550405), type ValueTuple`3
' (New York, 468.5, 8550405), type Tuple`3
' (New York, 468.5, 8550405), type ValueTuple`3
' cityInfo = cityInfo2 : True

Vedi anche
Riferimenti al linguaggio Visual Basic
Utilizzo efficiente dei tipi di dati (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Alle variabili e alle variabili non dichiarate dichiarate senza un tipo di dati viene assegnato il Object tipo di dati.
In questo modo è facile scrivere rapidamente i programmi, ma è possibile che vengano eseguiti più lentamente.

Tipizzazione forte
Specificare i tipi di dati per tutte le variabili è noto come tipizzazione forte. L'uso di tipizzazione forte presenta
diversi vantaggi:
Abilita il supporto IntelliSense per le variabili. In questo modo è possibile visualizzare le relative proprietà
e altri membri durante la digitazione nel codice.
Sfrutta i vantaggi del controllo dei tipi del compilatore. Questa operazione intercetta le istruzioni che
possono avere esito negativo in fase di esecuzione a causa di errori come l'overflow. Rileva inoltre le
chiamate ai metodi su oggetti che non li supportano.
Questo comporta un'esecuzione più rapida del codice.

Tipi di dati più efficienti


Per le variabili che non contengono mai frazioni, i tipi di dati integrali sono più efficienti dei tipi non integrali. In
Visual Basic Integer e UInteger sono i tipi numerici più efficienti.
Per i numeri frazionari, Double è il tipo di dati più efficiente, perché i processori sulle piattaforme correnti
eseguono operazioni a virgola mobile con precisione doppia. Tuttavia, le operazioni con Double non sono
altrettanto veloci dei tipi integrali, ad esempio Integer .

Specifica del tipo di dati


Utilizzare l' istruzione Dim per dichiarare una variabile di un tipo specifico. È possibile specificare
contemporaneamente il relativo livello di accesso tramite la parola chiave public, protected, Friendo private ,
come nell'esempio seguente.

Private x As Double
Protected s As String

Conversione di caratteri
Le AscW ChrW funzioni e operano in Unicode. È consigliabile usarli in modo preferenziale per Asc e Chr , che
devono essere convertiti all'interno e all'esterno di Unicode.

Vedi anche
Asc
AscW
Chr
ChrW
Tipi di dati
Tipi di dati numerici
Dichiarazione di variabile
Utilizzo di IntelliSense
Risoluzione dei problemi relativi ai tipi di dati (Visual
Basic)
05/03/2021 • 14 minutes to read • Edit Online

In questa pagina sono elencati alcuni problemi comuni che possono verificarsi quando si eseguono operazioni
sui tipi di dati intrinseci.

Le espressioni Floating-Point non vengono confrontate come uguali


Quando si utilizzano numeri a virgola mobile (tipo didati singolo e tipo di dati Double), tenere presente che
vengono archiviati come frazioni binarie. Ciò significa che non è possibile mantenere una rappresentazione
esatta di qualsiasi quantità che non sia una frazione binaria (nel formato k/(2 ^ n), dove k e n sono numeri interi.
0,5 (= 1/2) e 0,3125 (= 5/16), ad esempio, possono essere mantenuti come valori precisi, mentre 0,2 (= 1/5) e
0,3 (= 3/10) possono essere solo approssimazioni.
A causa di questa imprecisione, non è possibile basarsi sui risultati esatti quando si opera sui valori a virgola
mobile. In particolare, due valori teoricamente uguali potrebbero presentare rappresentazioni leggermente
diverse.

P ER C O N F RO N TA RE L E Q UA N T ITÀ A VIRGO L A M O B IL E

1. calcolare il valore assoluto della differenza usando il Abs metodo della Math classe nello System spazio dei nomi.
2. determinare una differenza massima accettabile, in modo che sia possibile considerare le due quantità come uguali per scopi
pratici se la differenza non è maggiore.
3. confrontare il valore assoluto della differenza con la differenza accettabile.

Nell'esempio seguente viene illustrato il confronto errato e corretto di due Double valori.

Dim oneThird As Double = 1.0 / 3.0


Dim pointThrees As Double = 0.333333333333333

' The following comparison does not indicate equality.


Dim exactlyEqual As Boolean = (oneThird = pointThrees)

' The following comparison indicates equality.


Dim closeEnough As Double = 0.000000000000001
Dim absoluteDifference As Double = Math.Abs(oneThird - pointThrees)
Dim practicallyEqual As Boolean = (absoluteDifference < closeEnough)

MsgBox("1.0 / 3.0 is represented as " & oneThird.ToString("G17") &


vbCrLf & "0.333333333333333 is represented as " &
pointThrees.ToString("G17") &
vbCrLf & "Exact comparison generates " & CStr(exactlyEqual) &
vbCrLf & "Acceptable difference comparison generates " &
CStr(practicallyEqual))

Nell'esempio precedente viene utilizzato il ToString metodo della Double struttura in modo che sia possibile
specificare una precisione maggiore rispetto a quella CStr utilizzata dalla parola chiave. Il valore predefinito è
15 cifre, ma il formato "G17" lo estende a 17 cifre.

L'operatore mod non restituisce risultati accurati


A causa dell'imprecisione dell'archiviazione a virgola mobile, l' operatore mod può restituire un risultato
imprevisto quando almeno uno degli operandi è a virgola mobile.
Il tipo di dati Decimal non utilizza la rappresentazione a virgola mobile. Molti numeri non esatti in Single e
Double sono esatti in Decimal (ad esempio, 0,2 e 0,3). Sebbene l'aritmetica risulti più lenta in Decimal rispetto
a virgola mobile, potrebbe valere la riduzione delle prestazioni per ottenere una maggiore precisione.

P ER T RO VA RE IL RESTO IN T EGER DEL L E Q UA N T ITÀ A VIRGO L A M O B IL E

1. dichiarare le variabili come Decimal .


2. utilizzare il carattere di tipo letterale D per forzare i valori letterali in Decimal , nel caso in cui i valori siano troppo grandi
per il Long tipo di dati.

Nell'esempio seguente viene illustrata la potenziale imprecisione degli operandi a virgola mobile.

Dim two As Double = 2.0


Dim zeroPointTwo As Double = 0.2
Dim quotient As Double = two / zeroPointTwo
Dim doubleRemainder As Double = two Mod zeroPointTwo

MsgBox("2.0 is represented as " & two.ToString("G17") &


vbCrLf & "0.2 is represented as " & zeroPointTwo.ToString("G17") &
vbCrLf & "2.0 / 0.2 generates " & quotient.ToString("G17") &
vbCrLf & "2.0 Mod 0.2 generates " &
doubleRemainder.ToString("G17"))

Dim decimalRemainder As Decimal = 2D Mod 0.2D


MsgBox("2.0D Mod 0.2D generates " & CStr(decimalRemainder))

Nell'esempio precedente viene utilizzato il ToString metodo della Double struttura in modo che sia possibile
specificare una precisione maggiore rispetto a quella CStr utilizzata dalla parola chiave. Il valore predefinito è
15 cifre, ma il formato "G17" lo estende a 17 cifre.
Poiché zeroPointTwo è Double , il relativo valore per 0,2 è una frazione binaria ripetuta in modo infinito con un
valore archiviato di 0.20000000000000001. La divisione di 2,0 per questa quantità restituisce
9.9999999999999995 con un resto di 0.19999999999999991.
Nell'espressione per decimalRemainder , il carattere di tipo letterale D impone entrambi gli operandi a Decimal
e 0,2 presenta una rappresentazione precisa. Pertanto Mod , l'operatore restituisce il resto previsto di 0,0.
Si noti che non è sufficiente dichiarare decimalRemainder come Decimal . È inoltre necessario forzare i valori
letterali a Decimal oppure utilizzarli per Double impostazione predefinita e decimalRemainder ricevere lo stesso
valore non accurato di doubleRemainder .

Il tipo booleano non converte in modo accurato il tipo numerico


I valori dei tipi di dati booleani non vengono archiviati come numeri e i valori archiviati non sono destinati a
essere equivalenti ai numeri. Per la compatibilità con le versioni precedenti, Visual Basic fornisce parole chiave di
conversione (funzione CType,, CBool CInt e così via) per la conversione tra i Boolean tipi numerici e. Tuttavia,
altri linguaggi a volte eseguono queste conversioni in modo diverso, come i metodi .NET Framework.
Non scrivere mai codice che si basa su valori numerici equivalenti per True e False . Laddove possibile, è
consigliabile limitare l'utilizzo delle Boolean variabili ai valori logici per i quali sono stati progettati. Se è
necessario combinare Boolean e valori numerici, assicurarsi di conoscere il metodo di conversione selezionato.
Conversione in Visual Basic
Quando si usano le CType CBool parole chiave di conversione o per convertire i tipi di dati numerici in
Boolean , 0 diventa False e tutti gli altri valori diventano True . Quando si convertono Boolean i valori in tipi
numerici usando le parole chiave di conversione, False diventa 0 e True diventa-1.
Conversione nel Framework
Il ToInt32 metodo della Convert classe nello System spazio dei nomi converte True in + 1.
Se è necessario convertire un Boolean valore in un tipo di dati numerico, prestare attenzione al metodo di
conversione utilizzato.

Il valore letterale carattere genera un errore del compilatore


In assenza di caratteri di tipo, Visual Basic presuppone i tipi di dati predefiniti per i valori letterali. Il tipo
predefinito per un valore letterale carattere, racchiuso tra virgolette ( " " ), è String .
Il String tipo di dati non viene ampliato al tipo di dati char. Ciò significa che se si desidera assegnare un valore
letterale a una Char variabile, è necessario eseguire una conversione verso un tipo di testo più piccolo o forzare
il valore letterale nel Char tipo.

P ER C REA RE UN VA LO RE L ET T ERA L E C H A R DA A SSEGN A RE A UN A VA RIA B IL E O A UN A C O STA N T E

1. dichiarare la variabile o la costante come Char .


2. racchiudere il valore del carattere tra virgolette ( " " ).
3. seguire le virgolette doppie di chiusura con il carattere di tipo letterale C per forzare il valore letterale in Char . Questa
operazione è necessaria se l'opzione di controllo del tipo (istruzione Option Strict) è On ed è auspicabile in ogni caso.

Nell'esempio seguente vengono illustrate le assegnazioni non riuscite e corrette di un valore letterale a una
Char variabile.

Dim charVar As Char


' The following statement attempts to convert a String literal to Char.
' Because Option Strict is On, it generates a compiler error.
charVar = "Z"
' The following statement succeeds because it specifies a Char literal.
charVar = "Z"c
' The following statement succeeds because it converts String to Char.
charVar = CChar("Z")

Esiste sempre un rischio nell'utilizzo di conversioni verso un tipo di caratteri più piccolo, perché possono avere
esito negativo in fase di esecuzione. Ad esempio, una conversione da String a Char può avere esito negativo
se il String valore contiene più di un carattere. Pertanto, è preferibile programmare di utilizzare il C carattere
tipo.

Conversione di stringa non riuscita in fase di esecuzione


Il tipo di dati String partecipa a pochissime conversioni verso un tipo di dati più grande. String viene ampliato
solo a se stesso e e Object solo Char e Char() ( Char matrice) si ampliano a String . Questo perché String
variabili e costanti possono contenere valori che altri tipi di dati non possono contenere.
Quando l'opzione di controllo del tipo (Option Strict Statement) è On , il compilatore non consente tutte le
conversioni implicite verso un tipo di caratteri più piccolo. Sono inclusi quelli che coinvolgono String . Il codice
può comunque usare parole chiave di conversione CStr , ad esempio e la funzione CType, che indirizzano l'.NET
Framework per tentare la conversione.
NOTE
L'errore di conversione verso un tipo di ristringimento viene eliminato per le conversioni dagli elementi di una
For Each…Next raccolta alla variabile di controllo del ciclo. Per ulteriori informazioni ed esempi, vedere la sezione relativa
alle conversioni verso un tipo di dati più piccolo in per ciascuna... Istruzione successiva.

Riduzione della protezione della conversione


Lo svantaggio delle conversioni verso un tipo di restringimento è che possono avere esito negativo in fase di
esecuzione. Ad esempio, se una String variabile contiene un valore diverso da "true" o "false", non può essere
convertito in Boolean . Se contiene caratteri di punteggiatura, la conversione in qualsiasi tipo numerico ha esito
negativo. Se non si è certi che la String variabile contenga sempre valori che possono essere accettati dal tipo
di destinazione, non provare a eseguire una conversione.
Se è necessario eseguire la conversione da String a un altro tipo di dati, la procedura più sicura consiste nel
racchiudere la tentata conversione nell'oggetto try... Rileva... Istruzione finally. In questo modo è possibile gestire
un errore in fase di esecuzione.
Matrici di caratteri
Una singola Char e una matrice di Char elementi si ampliano a String . Tuttavia, non String si amplia a
Char() . Per convertire un String valore in una Char matrice, è possibile usare il ToCharArray metodo della
System.String classe.
Valori non significativi
In generale, String i valori non sono significativi in altri tipi di dati e la conversione è altamente artificiale e
pericolosa. Laddove possibile, è consigliabile limitare l'utilizzo delle String variabili alle sequenze di caratteri
per le quali sono progettate. Non scrivere mai codice che si basa su valori equivalenti di altri tipi.

Vedi anche
Tipi di dati
Caratteri tipo
Tipi di valore e tipi di riferimento
Conversioni di tipi in Visual Basic
Tipi di dati
CString
Utilizzo efficiente dei tipi di dati
Elementi dichiarati in Visual Basic
05/03/2021 • 2 minutes to read • Edit Online

Un elemento dichiarato è un elemento di programmazione definito in un'istruzione di dichiarazione. Gli


elementi dichiarati includono variabili, costanti, enumerazioni, classi, strutture, moduli, interfacce, procedure,
parametri di procedura, risultati di funzioni, riferimenti a routine esterne, operatori, proprietà, eventi e delegati.
Le istruzioni di dichiarazione includono quanto segue:
Istruzione Dim
Istruzione Const
Istruzione Enum
Istruzione Class
Istruzione Structure
Istruzione Module
Istruzione Interface
Istruzione Function
Istruzione Sub
Declare Statement
Operator Statement
Property Statement
Istruzione Event
Istruzione Delegate

Contenuto della sezione


Declared Element Names
Viene descritto come denominare gli elementi e usare le maiuscole.
Caratteristiche di elementi dichiarati
Vengono descritte le caratteristiche, ad esempio l'ambito, proprie degli elementi dichiarati.
References to Declared Elements
Viene descritto il modo in cui il compilatore fa corrispondere un riferimento a una dichiarazione e come si
qualifica un nome.

Sezioni correlate
Struttura del programma e convenzioni del codice
Indicazioni per rendere il codice più facile da leggere, comprendere e gestire.
Istruzioni
Vengono descritte le istruzioni che consentono di denominare e definire procedure, variabili, matrici e costanti.
Contesti delle dichiarazioni e livelli di accesso predefiniti
Sono indicati i tipi di elementi dichiarati, ognuno con la relativa istruzione di dichiarazione, il contesto in cui si
può effettuare la dichiarazione e il livello di accesso predefinito.
Delegati (Visual Basic)
05/03/2021 • 9 minutes to read • Edit Online

I delegati sono oggetti che fanno riferimento ai metodi. Vengono a volte descritti come puntatori a funzione
indipendenti dai tipi poiché sono simili ai puntatori a funzione usati in altri linguaggi di programmazione.
Tuttavia, a differenza dei puntatori a funzione, i delegati Visual Basic sono un tipo di riferimento basato sulla
classe System.Delegate . I delegati possono fare riferimento sia a metodi condivisi, ovvero metodi che è
possibile chiamare senza una specifica istanza di una classe, sia a metodi di istanza.

Delegati ed eventi
I delegati sono utili nelle situazioni in cui è necessario un intermediario tra una routine chiamante e la routine
chiamata. Ad esempio, può essere necessario che un oggetto generatore di eventi sia in grado di chiamare
gestori di eventi differenti in circostanze diverse. Purtroppo, l'oggetto che genera gli eventi non può sapere in
anticipo quale gestore eventi gestirà uno specifico evento. Visual Basic consente di associare dinamicamente i
gestori eventi agli eventi creando un delegato quando si usa l' AddHandler istruzione. In fase di esecuzione, il
delegato inoltrerà le chiamate al gestore eventi appropriato.
Sebbene sia possibile creare delegati personalizzati, nella maggior parte dei casi Visual Basic crea il delegato e si
occupa dei dettagli. Un'istruzione Event , ad esempio, consente di definire implicitamente una classe delegata
denominata <EventName>EventHandler come classe nidificata della classe contenente l'istruzione Event e con la
stessa firma dell'evento. L'istruzione AddressOf crea in modo implicito un'istanza di un delegato che fa
riferimento a una routine specifica. Le due righe di codice seguenti sono equivalenti. Nella prima riga è possibile
osservare la creazione esplicita di un'istanza di EventHandler , con un riferimento al metodo Button1_Click
inviato come argomento. La seconda riga rappresenta un modo più pratico di eseguire la stessa operazione.

AddHandler Button1.Click, New EventHandler(AddressOf Button1_Click)


' The following line of code is shorthand for the previous line.
AddHandler Button1.Click, AddressOf Me.Button1_Click

È possibile usare la sintassi abbreviata per creare delegati ogni volta che il compilatore è in grado di
determinare il tipo del delegato in base al contesto.

Dichiarazione di eventi che usano un tipo delegato esistente


In alcune situazioni, è consigliabile dichiarare un evento che usa un tipo delegato esistente come delegato
sottostante. La sintassi seguente illustra come eseguire tale operazione:

Delegate Sub DelegateType()


Event AnEvent As DelegateType

Questa operazione si rivela utile quando si vogliono inviare più eventi allo stesso gestore.

Variabili e parametri dei delegati


È possibile usare i delegati per altre attività non relative a eventi, ad esempio il modello di threading Free,
oppure con routine che richiedono la chiamata di diverse versioni delle funzioni in fase di compilazione.
Si supponga, ad esempio, di avere un'applicazione di annunci pubblicitari che include una casella di riepilogo
contenente nomi di automobili. Gli annunci sono ordinati per titolo, in genere corrispondente al modello
dell'auto. Se per alcune auto il modello è preceduto dall'anno di produzione, può verificarsi un problema. Il
problema consiste nel fatto che la funzionalità di ordinamento integrata della casella di riepilogo esegue
l'ordinamento solo in base ai codici dei caratteri, elencando prima tutti gli annunci che iniziano con una data e
quindi tutti quelli che iniziano con il modello.
Per risolvere il problema, è possibile creare una routine di ordinamento in una classe che usa l'ordinamento
alfabetico standard per la maggior parte delle caselle di riepilogo, ma che è in grado di passare, in fase di
esecuzione, alla routine di ordinamento personalizzata per gli annunci relativi alle automobili. A questo scopo, è
necessario passare la routine di ordinamento personalizzata alla classe di ordinamento in fase di esecuzione
usando i delegati.

Espressioni AddressOf e Lambda


Ogni classe delegata definisce un costruttore a cui viene passata la specifica di un metodo dell'oggetto. Un
argomento di un costruttore di delegati deve essere un riferimento a un metodo o a un'espressione lambda.
Per specificare un riferimento a un metodo, usare la sintassi seguente:
AddressOf [ expression .] methodName
Il tipo in fase di compilazione dell'elemento expression deve essere il nome di una classe o un'interfaccia
contenente un metodo con il nome specificato la cui firma corrisponde a quella della classe delegata. Il metodo
methodName può essere o un metodo condiviso o un metodo di istanza. methodName non è un elemento
facoltativo, anche se si crea un delegato per il metodo predefinito della classe.
Per specificare un'espressione lambda, usare la sintassi seguente:
Function ([ parm As type , parm2 As type2 , ...]) expression

Nell'esempio seguente sono illustrate sia l'espressione AddressOf che l'espressione lambda usate per
specificare il riferimento per un delegato.
Module Module1

Sub Main()
' Create an instance of InOrderClass and assign values to the properties.
' InOrderClass method ShowInOrder displays the numbers in ascending
' or descending order, depending on the comparison method you specify.
Dim inOrder As New InOrderClass
inOrder.Num1 = 5
inOrder.Num2 = 4

' Use AddressOf to send a reference to the comparison function you want
' to use.
inOrder.ShowInOrder(AddressOf GreaterThan)
inOrder.ShowInOrder(AddressOf LessThan)

' Use lambda expressions to do the same thing.


inOrder.ShowInOrder(Function(m, n) m > n)
inOrder.ShowInOrder(Function(m, n) m < n)
End Sub

Function GreaterThan(ByVal num1 As Integer, ByVal num2 As Integer) As Boolean


Return num1 > num2
End Function

Function LessThan(ByVal num1 As Integer, ByVal num2 As Integer) As Boolean


Return num1 < num2
End Function

Class InOrderClass
' Define the delegate function for the comparisons.
Delegate Function CompareNumbers(ByVal num1 As Integer, ByVal num2 As Integer) As Boolean
' Display properties in ascending or descending order.
Sub ShowInOrder(ByVal compare As CompareNumbers)
If compare(_num1, _num2) Then
Console.WriteLine(_num1 & " " & _num2)
Else
Console.WriteLine(_num2 & " " & _num1)
End If
End Sub

Private _num1 As Integer


Property Num1() As Integer
Get
Return _num1
End Get
Set(ByVal value As Integer)
_num1 = value
End Set
End Property

Private _num2 As Integer


Property Num2() As Integer
Get
Return _num2
End Get
Set(ByVal value As Integer)
_num2 = value
End Set
End Property
End Class
End Module

La firma della funzione deve corrispondere a quella del tipo delegato. Per ulteriori informazioni sulle espressioni
lambda, vedere espressioni lambda. Per altri esempi di espressioni lambda e assegnazioni di AddressOf a
delegati, vedere Conversione di tipo relaxed del delegato.
Argomenti correlati
T ITO LO DESC RIZ IO N E

Procedura: richiamare un metodo delegato Viene offerto un esempio che mostra come associare un
metodo a un delegato e quindi richiamare tale metodo
tramite il delegato.

Procedura: passare una routine a un'altra routine in Visual Viene illustrato come usare i delegati per passare una
Basic routine a un'altra routine.

Conversione di tipo relaxed del delegato Viene descritto come assegnare subroutine e funzioni a
delegati o gestori anche quando le relative firme non sono
identiche.

Eventi Viene offerta una panoramica degli eventi in Visual Basic.


Associazione anticipata e tardiva (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Il compilatore Visual Basic esegue un processo chiamato binding quando un oggetto viene assegnato a una
variabile oggetto. Un oggetto è ad associazione anticipata quando viene assegnato a una variabile di un tipo
object specifico. Gli oggetti ad associazione anticipata consentono al compilatore di allocare memoria ed
effettuare altre ottimizzazioni prima dell'esecuzione di un'applicazione. Il frammento di codice seguente, ad
esempio, dichiara una variabile di tipo FileStream:

' Create a variable to hold a new object.


Dim FS As System.IO.FileStream
' Assign a new object to the variable.
FS = New System.IO.FileStream("C:\tmp.txt",
System.IO.FileMode.Open)

Poiché FileStream è un tipo object specifico, l'istanza assegnata a FS è ad associazione anticipata.


Al contrario, un oggetto è ad associazione tardiva quando viene assegnato a una variabile dichiarata di tipo
Object . Gli oggetti di questo tipo possono contenere riferimenti a qualsiasi oggetto, ma non presentano molti
dei vantaggi offerti dagli oggetti ad associazione anticipata. Il frammento di codice seguente, ad esempio,
dichiara una variabile oggetto contenente un oggetto restituito dalla funzione CreateObject :

' To use this example, you must have Microsoft Excel installed on your computer.
' Compile with Option Strict Off to allow late binding.
Sub TestLateBinding()
Dim xlApp As Object
Dim xlBook As Object
Dim xlSheet As Object
xlApp = CreateObject("Excel.Application")
' Late bind an instance of an Excel workbook.
xlBook = xlApp.Workbooks.Add
' Late bind an instance of an Excel worksheet.
xlSheet = xlBook.Worksheets(1)
xlSheet.Activate()
' Show the application.
xlSheet.Application.Visible = True
' Place some text in the second row of the sheet.
xlSheet.Cells(2, 2) = "This is column B row 2"
End Sub

Vantaggi offerti dall'associazione anticipata


Quando possibile, è consigliabile usare oggetti ad associazione anticipata. Tali oggetti consentono infatti al
compilatore di eseguire ottimizzazioni significative che aumentano l'efficienza delle applicazioni. Gli oggetti ad
associazione anticipata sono notevolmente più veloci di quelli ad associazione tardiva e facilitano la lettura e la
gestione del codice dichiarando esattamente il tipo degli oggetti usati. Un altro vantaggio dell'associazione
anticipata consiste nel fatto che consente funzionalità utili, come il completamento automatico del codice e la
Guida dinamica, perché Visual Studio Integrated Development Environment (IDE) è in grado di determinare
esattamente il tipo di oggetto che si sta utilizzando durante la modifica del codice. L'associazione anticipata
riduce il numero e la gravità degli errori di run-time poiché consente al compilatore di segnalare gli errori al
momento della compilazione di un programma.
NOTE
L'associazione tardiva può essere usata soltanto per accedere ai membri di tipi che vengono dichiarati come Public .
L'accesso a membri dichiarati come Friend o Protected Friend determina un errore di run-time.

Vedi anche
CreateObject
Durata degli oggetti: come creare e distruggere oggetti
Object Data Type
Tipi di errore (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

In Visual Basic gli errori rientrano in una delle tre categorie seguenti: errori di sintassi, errori di run-time ed
errori logici.

Errori di sintassi
Gli errori di sintassi sono quelli visualizzati durante la scrittura del codice. Se si usa Visual Studio, Visual Basic
controlla il codice durante la digitazione nella finestra dell' Editor del codice e avvisa l'utente se si commette
un errore, ad esempio l'ortografia di una parola o l'uso errato di un elemento di linguaggio. Se si esegue la
compilazione dalla riga di comando, Visual Basic Visualizza un errore del compilatore con informazioni
sull'errore di sintassi. Gli errori di sintassi sono il tipo più comune di errori. È possibile correggerli facilmente
nell'ambiente di codifica non appena si verificano.

NOTE
L' Option Explicit istruzione è un modo per evitare errori di sintassi. Impone di dichiarare in anticipo tutte le variabili
da usare nell'applicazione. Pertanto, quando tali variabili vengono utilizzate nel codice, eventuali errori tipografici vengono
rilevati immediatamente e possono essere corretti.

Errori Run-Time
Gli errori di run-time sono quelli visualizzati solo dopo la compilazione e l'esecuzione del codice. Queste
implicano il codice che potrebbe sembrare corretto in quanto non presenta errori di sintassi, ma che non verrà
eseguito. Ad esempio, è possibile scrivere correttamente una riga di codice per aprire un file. Tuttavia, se il file
non esiste, l'applicazione non è in grado di aprire il file e viene generata un'eccezione. È possibile correggere la
maggior parte degli errori di run-time riscrivendo il codice difettoso o utilizzando la gestione delle eccezioni,
quindi ricompilando e rieseguendo il codice.

Errori di logica
Gli errori logici sono quelli che vengono visualizzati una volta che l'applicazione è in uso. Spesso si tratta di
presupposti difettosi creati dallo sviluppatore o risultati indesiderati o imprevisti in risposta alle azioni
dell'utente. Una chiave tipizzata in modo errato, ad esempio, può fornire informazioni non corrette a un metodo
oppure si presuppone che un valore valido venga sempre fornito a un metodo in caso contrario. Anche se gli
errori logici possono essere gestiti tramite la gestione delle eccezioni (ad esempio, verificando se un argomento
è Nothing e generando un ArgumentNullException ), in genere devono essere risolti correggendo l'errore nella
logica e ricompilando l'applicazione.

Vedi anche
Istruzione Try...Catch...Finally
Nozioni di base sul debugger
Eventi (Visual Basic)
05/03/2021 • 12 minutes to read • Edit Online

Sebbene sia possibile visualizzare un progetto di Visual Studio come una serie di procedure eseguite in una
sequenza, in realtà, la maggior parte dei programmi è basata sugli eventi, ovvero il flusso di esecuzione è
determinato da occorrenze esterne denominate eventi.
Un evento è un segnale che informa un'applicazione che si è verificato qualcosa di importante. Ad esempio,
quando un utente fa clic su un controllo in un form, il form può generare un evento Click e chiamare una
routine che gestisce l'evento. Gli eventi consentono anche le comunicazioni tra attività separate. Si supponga, ad
esempio, che un'applicazione esegua un'attività di ordinamento separatamente dall'applicazione principale. Se
un utente annulla l'ordinamento, l'applicazione può inviare un evento di annullamento per segnalare la
necessità di interrompere il processo di ordinamento.

Termini e concetti relativi agli eventi


In questa sezione vengono descritti i termini e i concetti utilizzati con gli eventi in Visual Basic.
Dichiarazione di eventi
Gli eventi vengono dichiarati all'interno di classi, strutture, moduli e interfacce tramite la parola chiave Event ,
come nell'esempio seguente:

Event AnEvent(ByVal EventNumber As Integer)

Generazione di eventi
Un evento può essere paragonato a un messaggio che annuncia che si è verificato qualcosa di importante. L'atto
di trasmettere il messaggio viene definito generazione dell'evento. In Visual Basic si generano eventi con l'
RaiseEvent istruzione, come nell'esempio seguente:

RaiseEvent AnEvent(EventNumber)

Gli eventi devono essere generati nell'ambito della classe, del modulo o della struttura in cui sono dichiarati. Ad
esempio, una classe derivata non può generare eventi ereditati da una classe di base.
Mittenti di eventi
Qualsiasi oggetto in grado di generare un evento è un mittente di eventi, noto anche come origine di eventi. I
form, i controlli e gli oggetti definiti dall'utente sono alcuni esempi di mittenti di eventi.
Gestori di eventi
I gestori eventi sono le routine chiamate quando si verifica un evento corrispondente. È possibile usare qualsiasi
subroutine valida con una firma corrispondente come gestore eventi. Non è possibile usare una funzione come
gestore eventi, tuttavia, perché non può restituire un valore all'origine di eventi.
Visual Basic utilizza una convenzione di denominazione standard per i gestori eventi che combina il nome del
mittente dell'evento, un carattere di sottolineatura e il nome dell'evento. Ad esempio, il nome dell'evento Click
per un pulsante denominato button1 sarebbe Sub button1_Click .
NOTE
È consigliabile usare questa convenzione di denominazione durante la definizione dei gestori per gli eventi personalizzati,
ma non è obbligatorio. Si può usare qualsiasi nome di subroutine valido.

Associazione di eventi a gestori eventi


Un gestore eventi diventa utilizzabile solo dopo averlo associato a un evento mediante l'istruzione Handles o
AddHandler .

WithEvents e clausola Handles


L'istruzione WithEvents e la clausola Handles offrono una modalità dichiarativa per specificare i gestori eventi.
Un evento generato da un oggetto dichiarato con la parola chiave WithEvents può essere gestito da qualsiasi
routine con un'istruzione Handles per tale evento, come illustrato nell'esempio seguente:

' Declare a WithEvents variable.


Dim WithEvents EClass As New EventClass

' Call the method that raises the object's events.


Sub TestEvents()
EClass.RaiseEvents()
End Sub

' Declare an event handler that handles multiple events.


Sub EClass_EventHandler() Handles EClass.XEvent, EClass.YEvent
MsgBox("Received Event.")
End Sub

Class EventClass
Public Event XEvent()
Public Event YEvent()
' RaiseEvents raises both events.
Sub RaiseEvents()
RaiseEvent XEvent()
RaiseEvent YEvent()
End Sub
End Class

L'istruzione WithEvents e la clausola Handles rappresentano spesso la scelta migliore per i gestori eventi,
perché la sintassi dichiarativa che usano semplifica la scrittura del codice, la lettura e il debug per la gestione
degli eventi. Tenere presenti, tuttavia, le limitazioni seguenti per l'uso delle variabili WithEvents :
Non è possibile usare una variabile WithEvents come variabile oggetto, ovvero non è possibile
dichiararla come Object , ma è necessario specificare il nome della classe quando si dichiara la variabile.
Poiché gli eventi condivisi non sono associati a istanze di classe, non è possibile usare WithEvents per
gestire gli eventi condivisi in modo dichiarativo. In modo analogo, non è possibile usare WithEvents o
Handles per gestire gli eventi da Structure . In entrambi i casi, è possibile usare l'istruzione AddHandler
per gestire tali eventi.
Non è possibile creare matrici di variabili WithEvents .

Le variabili WithEvents consentono a un unico gestore eventi di gestire uno o più tipi di evento oppure a uno o
più gestori eventi di gestire lo stesso tipo di evento.
Anche se la clausola Handles rappresenta la modalità standard per associare un evento a un gestore eventi, è
limitata all'associazione di eventi a gestori eventi in fase di compilazione.
In alcuni casi, ad esempio con gli eventi associati a form o controlli, Visual Basic estrae automaticamente un
gestore eventi vuoto e lo associa a un evento. Ad esempio, quando si fa doppio clic su un pulsante di comando
in un form in modalità progettazione, Visual Basic crea un gestore eventi vuoto e una WithEvents variabile per il
pulsante di comando, come nel codice seguente:

Friend WithEvents Button1 As System.Windows.Forms.Button


Protected Sub Button1_Click() Handles Button1.Click
End Sub

AddHandler e RemoveHandler
L'istruzione AddHandler è simile alla clausola Handles , perché entrambe consentono di specificare un gestore
eventi. Tuttavia, l'uso di AddHandler con RemoveHandler offre una maggiore flessibilità rispetto alla clausola
Handles , perché consente di aggiungere, rimuovere e modificare dinamicamente il gestore eventi associato a
un evento. Per gestire eventi condivisi o eventi da una struttura, è necessario usare AddHandler .
AddHandler accetta due argomenti: il nome di un evento da un mittente di eventi, ad esempio un controllo e
un'espressione che restituisce un delegato. Non è necessario specificare in modo esplicito la classe delegata
quando si usa AddHandler , perché l'istruzione AddressOf restituisce sempre un riferimento al delegato.
L'esempio seguente associa un gestore eventi a un evento generato da un oggetto:

AddHandler Obj.XEvent, AddressOf Me.XEventHandler

RemoveHandler , che disconnette un evento da un gestore eventi, usa la stessa sintassi di AddHandler . Ad
esempio:

RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler

Nell'esempio seguente un gestore eventi viene associato a un evento e l'evento viene generato. Il gestore eventi
intercetta l'evento e visualizza un messaggio.
Il primo gestore eventi viene quindi rimosso e all'evento viene associato un diverso gestore eventi. Quando
l'evento viene generato di nuovo, viene visualizzato un messaggio diverso.
Infine, il secondo gestore eventi viene rimosso e viene generato l'evento per una terza volta. Dato che all'evento
non è più associato un gestore eventi, non viene eseguita alcuna azione.
Module Module1

Sub Main()
Dim c1 As New Class1
' Associate an event handler with an event.
AddHandler c1.AnEvent, AddressOf EventHandler1
' Call a method to raise the event.
c1.CauseTheEvent()
' Stop handling the event.
RemoveHandler c1.AnEvent, AddressOf EventHandler1
' Now associate a different event handler with the event.
AddHandler c1.AnEvent, AddressOf EventHandler2
' Call a method to raise the event.
c1.CauseTheEvent()
' Stop handling the event.
RemoveHandler c1.AnEvent, AddressOf EventHandler2
' This event will not be handled.
c1.CauseTheEvent()
End Sub

Sub EventHandler1()
' Handle the event.
MsgBox("EventHandler1 caught event.")
End Sub

Sub EventHandler2()
' Handle the event.
MsgBox("EventHandler2 caught event.")
End Sub

Public Class Class1


' Declare an event.
Public Event AnEvent()
Sub CauseTheEvent()
' Raise an event.
RaiseEvent AnEvent()
End Sub
End Class

End Module

Gestione degli eventi ereditati da una classe di base


Le classi derivate, ovvero le classi che ereditano le caratteristiche da una classe di base, possono gestire gli
eventi generati dalla rispettiva classe di base usando l'istruzione Handles MyBase .
Per gestire gli eventi da una classe di base
Dichiarare un gestore eventi nella classe derivata aggiungendo un'istruzione Handles MyBase.
nomeevento alla riga della dichiarazione della routine del gestore eventi, dove nomeevento è il nome
dell'evento nella classe di base che si sta gestendo. Ad esempio:

Public Class BaseClass


Public Event BaseEvent(ByVal i As Integer)
' Place methods and properties here.
End Class

Public Class DerivedClass


Inherits BaseClass
Sub EventHandler(ByVal x As Integer) Handles MyBase.BaseEvent
' Place code to handle events from BaseClass here.
End Sub
End Class
Sezioni correlate
T ITO LO DESC RIZ IO N E

Procedura dettagliata: dichiarazione e generazione di eventi Descrizione dettagliata della procedura per dichiarare e
generare eventi per una classe.

Procedura dettagliata: gestione di eventi Illustra come scrivere una routine di gestore eventi.

Procedura: dichiarare eventi personalizzati per evitare il Illustra come definire un evento personalizzato che consente
blocco la chiamata asincrona dei gestori eventi.

Procedura: dichiarare eventi personalizzati per proteggere la Illustra come definire un evento personalizzato che usa la
memoria memoria solo quando viene gestito l'evento.

Risoluzione dei problemi relativi ai gestori eventi ereditati in Elenca i problemi comuni che si verificano con i gestori eventi
Visual Basic nei componenti ereditati.

Eventi Viene fornita una panoramica del modello di eventi usato in


.NET Framework.

Creazione di gestori eventi in Windows Form Descrive come usare gli eventi associati agli oggetti di
Windows Form.

Delegati Panoramica dei delegati in Visual Basic.


Interfacce (Visual Basic)
05/03/2021 • 9 minutes to read • Edit Online

Le interfacce definiscono le proprietà, i metodi e gli eventi che le classi possono implementare. Le interfacce
consentono di definire funzionalità come piccoli gruppi di proprietà, metodi ed eventi strettamente correlati fra
loro. In questo modo si riducono i problemi di compatibilità, grazie alla possibilità di sviluppare implementazioni
migliorate per le interfacce senza compromettere il codice esistente. È possibile aggiungere nuove funzionalità
in qualsiasi momento, sviluppando interfacce e implementazioni aggiuntive.
Le interfacce offrono anche altri vantaggi rispetto all'ereditarietà di classe:
Sono più adatte a situazioni in cui l'applicazione richiede molti tipi di oggetti anche non correlati per
fornire determinate funzionalità.
Sono più flessibili delle classi base perché consentono di definire un'unica implementazione in grado di
implementare più interfacce.
Sono più adatte nelle situazioni in cui non è necessario ereditare l'implementazione da una classe base.
Sono utili quando non è possibile usare l'ereditarietà di classe. Le strutture, ad esempio, non possono
ereditare dalle classi, ma possono implementare interfacce.

Dichiarazione di interfacce
Le definizioni di interfaccia sono racchiuse tra istruzioni Interface e End Interface . Subito dopo l'istruzione
Interface è possibile aggiungere un'istruzione Inherits facoltativa in cui sono elencate una o più interfacce
ereditate. Le istruzioni Inherits devono precedere qualsiasi altra istruzione della dichiarazione, ad eccezione
dei commenti. Le restanti istruzioni della definizione di interfaccia dovrebbero essere istruzioni Event , Sub ,
Function , Property , Interface , Class , Structure e Enum . Le interfacce non possono contenere codice di
implementazione o istruzioni ad esso associate, come End Sub o End Property .
Per impostazione predefinita, in uno spazio dei nomi le istruzioni di interfaccia sono Friend , ma possono anche
essere dichiarate in modo esplicito come Public o Friend . Per impostazione predefinita, le interfacce definite
all'interno di classi, moduli, interfacce e strutture sono Public , ma possono anche essere dichiarate in modo
esplicito come Public , Friend , Protected o Private .

NOTE
La parola chiave Shadows può essere applicata a tutti i membri dell'interfaccia. La parola chiave Overloads può essere
applicata alle istruzioni Sub , Function e Property dichiarate in una definizione di interfaccia. Inoltre, le istruzioni
Property possono includere il modificatore Default , ReadOnly o WriteOnly . Non sono consentiti altri modificatori,
come Public , Private , Friend , Protected , Shared , Overrides , MustOverride o Overridable . Per altre
informazioni, vedere Contesti delle dichiarazioni e livelli di accesso predefiniti.

Il codice riportato di seguito, ad esempio, consente di definire un'interfaccia con una funzione, una proprietà e
un evento.
Interface IAsset
Event ComittedChange(ByVal Success As Boolean)
Property Division() As String
Function GetID() As Integer
End Interface

Implementazione di interfacce
La parola riservata Visual Basic Implements viene usata in due modi. L'istruzione Implements indica che una
classe o una struttura implementa un'interfaccia. La parola chiave Implements indica che un membro di classe o
di struttura implementa un membro di interfaccia specifico.
Istruzione Implements
Se una classe o una struttura implementa una o più interfacce, deve includere l'istruzione Implements
immediatamente dopo l'istruzione Class o Structure . L'istruzione Implements richiede un elenco separato da
virgole di interfacce implementate da una classe. La classe o la struttura deve implementare tutti i membri di
interfaccia mediante la parola chiave Implements .
Parola chiave Implements
La parola chiave Implements richiede un elenco separato da virgole di membri di interfaccia da implementare. In
genere viene specificato un solo membro di interfaccia, anche se è possibile specificarne diversi. La specifica di
un membro di interfaccia è composta dal nome dell'interfaccia, che è necessario includere in un'istruzione
Implements all'interno della classe, seguito da un punto, quindi dal nome della funzione, della proprietà o
dell'evento da implementare. Il nome di un membro che implementa un membro di interfaccia può usare
qualsiasi identificatore valido e non è limitato alla InterfaceName_MethodName convenzione usata nelle versioni
precedenti di Visual Basic.
Il codice seguente, ad esempio, illustra come dichiarare una subroutine denominata Sub1 che implementa un
metodo di un'interfaccia:

Class Class1
Implements interfaceclass.interface2

Sub Sub1(ByVal i As Integer) Implements interfaceclass.interface2.Sub1


End Sub
End Class

È necessario che i tipi di parametro e i tipi restituiti del membro che esegue l'implementazione corrispondano
alla proprietà dell'interfaccia o alla dichiarazione del membro nell'interfaccia. Per implementare un elemento di
un'interfaccia in genere si usa un membro con lo stesso nome dell'interfaccia, come illustrato nell'esempio
precedente.
Per dichiarare l'implementazione di un metodo di interfaccia è possibile usare qualsiasi attributo valido per le
dichiarazioni dei metodi di istanza, tra cui Overloads , Overrides , Overridable , Public , Private , Protected ,
Friend , Protected Friend , MustOverride , Default e Static . L'attributo Shared non è valido in quanto
definisce una classe anziché un metodo di istanza.
Usando Implements è possibile scrivere un unico metodo che implementa più metodi definiti in un'interfaccia,
come nell'esempio seguente:
Class Class2
Implements I1, I2

Protected Sub M1() Implements I1.M1, I1.M2, I2.M3, I2.M4


End Sub
End Class

Per implementare un membro di interfaccia, è possibile usare un membro privato. Quando un membro privato
implementa un membro di un'interfaccia, diventa disponibile tramite l'interfaccia anche se non è disponibile
direttamente sulle variabili oggetto della classe.
Esempi di implementazione dell'interfaccia
È necessario che le classi che implementano un'interfaccia ne implementino tutte le proprietà, i metodi e gli
eventi.
L'esempio seguente definisce due interfacce. La seconda interfaccia, Interface2 , eredita Interface1 e definisce
una proprietà e un metodo aggiuntivi.

Interface Interface1
Sub sub1(ByVal i As Integer)
End Interface

' Demonstrates interface inheritance.


Interface Interface2
Inherits Interface1
Sub M1(ByVal y As Integer)
ReadOnly Property Num() As Integer
End Interface

L'esempio che segue implementa Interface1 , l'interfaccia definita nell'esempio precedente:

Public Class ImplementationClass1


Implements Interface1
Sub Sub1(ByVal i As Integer) Implements Interface1.sub1
' Insert code here to implement this method.
End Sub
End Class

L'ultimo esempio implementa Interface2 , incluso un metodo ereditato da Interface1 :

Public Class ImplementationClass2


Implements Interface2
Dim INum As Integer = 0
Sub sub1(ByVal i As Integer) Implements Interface2.sub1
' Insert code here that implements this method.
End Sub
Sub M1(ByVal x As Integer) Implements Interface2.M1
' Insert code here to implement this method.
End Sub

ReadOnly Property Num() As Integer Implements Interface2.Num


Get
Num = INum
End Get
End Property
End Class

È possibile implementare una proprietà ReadOnly usando una proprietà ReadWrite (in altri termini, non è
necessario dichiararla ReadOnly nella classe di implementazione). L'implementazione di un'interfaccia consente
di implementare almeno i membri dichiarati dall'interfaccia, ma è possibile offrire maggiori funzionalità, ad
esempio rendendo la proprietà accessibile in scrittura.

Argomenti correlati
T ITO LO DESC RIZ IO N E

Procedura dettagliata: Creazione e implementazione di Fornisce una procedura dettagliata che illustra il processo di
interfacce definizione e implementazione di interfacce personalizzate.

Varianza nelle interfacce generiche Illustra la covarianza e la controvarianza nelle interfacce


generiche e fornisce un elenco di interfacce generiche variant
in .NET Framework.
Procedura dettagliata: creazione e implementazione
di interfacce (Visual Basic)
05/03/2021 • 7 minutes to read • Edit Online

Le interfacce descrivono le caratteristiche di proprietà, metodi ed eventi, ma lasciano i dettagli di


implementazione fino a strutture o classi.
In questa procedura dettagliata viene illustrato come dichiarare e implementare un'interfaccia.

NOTE
Questa procedura dettagliata non fornisce informazioni su come creare un'interfaccia utente.

NOTE
Nomi o percorsi visualizzati per alcuni elementi dell'interfaccia utente di Visual Studio nelle istruzioni seguenti potrebbero
essere diversi nel computer in uso. La versione di Visual Studio in uso e le impostazioni configurate determinano questi
elementi. Per altre informazioni, vedere Personalizzazione dell'IDE.

Per definire un'interfaccia


1. Aprire un nuovo progetto Applicazione Windows in Visual Basic.
2. Per aggiungere un nuovo modulo al progetto, fare clic su Aggiungi modulo nel menu progetto .
3. Assegnare un nome al nuovo modulo Module1.vb e fare clic su Aggiungi . Viene visualizzato il codice per
il nuovo modulo.
4. Definire un'interfaccia denominata TestInterface all'interno Module1 di digitando
Interface TestInterface tra le Module End Module istruzioni e e quindi premendo INVIO. Nell' editor di
codice viene rientrato il valore della Interface parola chiave e viene aggiunta un' End Interface
istruzione per formare un blocco di codice.
5. Definire una proprietà, un metodo e un evento per l'interfaccia inserendo il codice seguente tra le
Interface End Interface istruzioni e:

Property Prop1() As Integer


Sub Method1(ByVal X As Integer)
Event Event1()

Implementazione
È possibile notare che la sintassi utilizzata per dichiarare i membri di interfaccia è diversa dalla sintassi utilizzata
per dichiarare i membri della classe. Questa differenza riflette il fatto che le interfacce non possono contenere
codice di implementazione.
Per implementare l'interfaccia
1. Aggiungere una classe denominata aggiungendo ImplementationClass l'istruzione seguente a Module1 ,
dopo l' End Interface istruzione, ma prima dell' End Module istruzione, quindi premendo INVIO:
Class ImplementationClass

Se si lavora all'interno dell'Integrated Development Environment, l' editor di codice fornisce un'
End Class istruzione corrispondente quando si preme INVIO.

2. Aggiungere l' Implements istruzione seguente a ImplementationClass , che denomina l'interfaccia


implementata dalla classe:

Implements TestInterface

Se elencato separatamente da altri elementi all'inizio di una classe o di una struttura, l' Implements
istruzione indica che la classe o la struttura implementa un'interfaccia.
Se si lavora all'interno dell'Integrated Development Environment, l' editor di codice implementa i
membri della classe richiesti da TestInterface quando si preme INVIO ed è possibile ignorare il
passaggio successivo.
3. Se non si lavora all'interno del Integrated Development Environment, è necessario implementare tutti i
membri dell'interfaccia MyInterface . Aggiungere il codice seguente a ImplementationClass per
implementare Event1 , Method1 e Prop1 :

Event Event1() Implements TestInterface.Event1

Public Sub Method1(ByVal X As Integer) Implements TestInterface.Method1


End Sub

Public Property Prop1() As Integer Implements TestInterface.Prop1


Get
End Get
Set(ByVal value As Integer)
End Set
End Property

L' Implements istruzione denomina l'interfaccia e il membro di interfaccia in fase di implementazione.


4. Completare la definizione di aggiungendo Prop1 un campo privato alla classe in cui è archiviato il valore
della proprietà:

' Holds the value of the property.


Private pval As Integer

Restituisce il valore di pval dalla funzione di accesso get della proprietà.

Return pval

Impostare il valore di pval nella funzione di accesso set di proprietà.

pval = value

5. Completare la definizione di Method1 aggiungendo il codice seguente.


MsgBox("The X parameter for Method1 is " & X)
RaiseEvent Event1()

Per testare l'implementazione dell'interfaccia


1. Fare clic con il pulsante destro del mouse sul modulo di avvio del progetto nella Esplora soluzioni ,
quindi scegliere Visualizza codice . Nell'editor viene visualizzata la classe per il form di avvio. Per
impostazione predefinita, viene chiamato il form di avvio Form1 .
2. Aggiungere il testInstance campo seguente alla Form1 classe:

Dim WithEvents testInstance As TestInterface

Dichiarando testInstance come WithEvents , la Form1 classe è in grado di gestire gli eventi.
3. Aggiungere il gestore eventi seguente alla Form1 classe per gestire gli eventi generati da testInstance :

Sub EventHandler() Handles testInstance.Event1


MsgBox("The event handler caught the event.")
End Sub

4. Aggiungere una subroutine denominata Test alla Form1 classe per testare la classe di implementazione:

Sub Test()
' Create an instance of the class.
Dim T As New ImplementationClass
' Assign the class instance to the interface.
' Calls to the interface members are
' executed through the class instance.
testInstance = T
' Set a property.
testInstance.Prop1 = 9
' Read the property.
MsgBox("Prop1 was set to " & testInstance.Prop1)
' Test the method and raise an event.
testInstance.Method1(5)
End Sub

La Test stored procedure crea un'istanza della classe che implementa MyInterface , assegna tale istanza
al testInstance campo, imposta una proprietà ed esegue un metodo tramite l'interfaccia.
5. Aggiungere il codice per chiamare la Test procedura dalla Form1 Load procedura del form di avvio:

Private Sub Form1_Load(ByVal sender As System.Object,


ByVal e As System.EventArgs) Handles MyBase.Load
Test() ' Test the class.
End Sub

6. Eseguire la Test procedura premendo F5. Viene visualizzato il messaggio "Prop1 è stato impostato su
9". Dopo aver fatto clic su OK, viene visualizzato il messaggio "il parametro X per Method1 è 5". Fare clic
su OK e viene visualizzato il messaggio "il gestore eventi ha rilevato l'evento".

Vedi anche
Istruzione Implements
Interfacce
Istruzione Interface
Istruzione Event
LINQ in Visual Basic
05/03/2021 • 3 minutes to read • Edit Online

In questa sezione vengono fornite panoramiche, esempi e informazioni complementari che consentono di
comprendere e utilizzare Visual Basic e Language-Integrated query (LINQ).

Contenuto della sezione


Introduzione a LINQ in Visual Basic
Viene fornita un'introduzione a provider, operatori, struttura di query e funzionalità del linguaggio LINQ.
Procedura: Eseguire query in un database
Viene fornito un esempio che illustra come connettersi a un database SQL Server ed eseguire una query usando
LINQ.
Procedura: Chiamare una stored procedure
Viene fornito un esempio che illustra come connettersi a un database SQL Server e chiamare una stored
procedure usando LINQ.
Procedura: Modificare dati in un database
Viene fornito un esempio che illustra come connettersi a un database SQL Server e recuperare e modificare i
dati usando LINQ.
Procedura: Combinare dati utilizzando join
Vengono forniti esempi di come associare i dati in un modo simile ai join di database usando LINQ.
Procedura: Ordinare i risultati di query
Viene fornito un esempio che illustra come ordinare i risultati di una query usando LINQ.
Procedura: Filtrare i risultati di una query
Viene fornito un esempio che illustra come includere criteri di ricerca in una query usando LINQ.
Procedura: Conteggio, somma o media di dati
Vengono forniti esempi che illustrano come includere funzioni di aggregazione nei dati di Conteggio, Somma o
Media restituiti da una query usando LINQ.
Procedura: Trovare il valore minimo o massimo in un risultato di query
Vengono forniti esempi che illustrano come includere funzioni di aggregazione per determinare i valori minimo
e massimo dei dati restituiti da una query usando LINQ.
Procedura: restituire un risultato di query LINQ come tipo specifico
Viene fornito un esempio di come restituire i risultati di una query LINQ come tipo specifico anziché come tipo
anonimo.

Vedi anche
LINQ (Language-Integrated Query)
Cenni preliminari su LINQ to XML in Visual Basic
Cenni preliminari su LINQ to DataSet
LINQ to SQL
Oggetti e classi in Visual Basic
05/03/2021 • 24 minutes to read • Edit Online

Un oggetto è una combinazione di codice e dati che è possibile considerare come singola unità. Un oggetto può
essere una parte di un'applicazione, ad esempio un controllo o un form. Anche un'intera applicazione può essere
un oggetto.
Quando si crea un'applicazione in Visual Basic, si utilizzano costantemente gli oggetti. È possibile utilizzare gli
oggetti forniti da Visual Basic, ad esempio controlli, form e oggetti di accesso ai dati. È anche possibile usare
oggetti di altre applicazioni all'interno dell'applicazione Visual Basic. È inoltre possibile creare oggetti
personalizzati e definire per essi proprietà e metodi aggiuntivi. Per i programmi, gli oggetti svolgono la stessa
funzione dei blocchi predefiniti. Consentono infatti di scrivere un pezzo di codice una sola volta e di riutilizzarlo
quanto necessario.
Questo argomento fornisce informazioni dettagliate sugli oggetti.

Oggetti e classi
Ogni oggetto in Visual Basic è definito da una classe. che ne descrive le variabili, le proprietà, le routine e gli
eventi. Gli oggetti sono istanze di classi. Dopo aver definito una classe, sarà possibile creare tutti gli oggetti
necessari.
Per comprendere la relazione esistente tra un oggetto e la classe di appartenenza, si pensi alla relazione tra gli
stampi per biscotti e i biscotti. La classe è lo stampo che definisce le caratteristiche di ogni biscotto, ad esempio
le dimensioni e la forma. La classe viene usata per creare oggetti. Gli oggetti sono i biscotti.
È necessario creare un oggetto prima di poter accedere ai relativi membri, ad eccezione dei Shared membri a
cui è possibile accedere senza un oggetto della classe.
Creare un oggetto da una classe
1. Determinare da quale classe si desidera creare un oggetto o definire una classe personalizzata. Ad
esempio:

Public Class Customer


Public Property AccountNumber As Integer
End Class

2. Scrivere un'istruzione Dim per creare una variabile a cui assegnare un'istanza di una classe. La variabile
dovrebbe essere del tipo della classe desiderata.

Dim nextCustomer As Customer

3. Aggiungere la parola chiave New per inizializzare la variabile su una nuova istanza della classe.

Dim nextCustomer As New Customer

4. È ora possibile accedere ai membri della classe mediante la variabile oggetto.

nextCustomer.AccountNumber = lastAccountNumber + 1
NOTE
Quando possibile, è necessario dichiarare che la variabile appartiene al tipo classe a cui si vuole assegnarla. Questa
operazione è definita associazione anticipata. Se il tipo di classe non è noto in fase di compilazione, è possibile richiamare
l'associazione tardiva dichiarando che la variabile è del tipo di dati Object. Questo tipo di associazione, tuttavia, può
determinare un rallentamento delle prestazioni e limitare l'accesso ai membri dell'oggetto in fase di esecuzione. Per altre
informazioni, vedere Object Variable Declaration (Dichiarazione di variabili oggetto).

Istanze multiple
Gli oggetti creati da una classe sono spesso identici. Una volta definiti come singoli oggetti, è comunque
possibile modificarne le variabili e le proprietà indipendentemente dalle altre istanze. Se, ad esempio, si
aggiungono tre caselle di controllo a un form, ogni oggetto casella di controllo è un'istanza della classe
CheckBox. I singoli oggetti CheckBox condividono un set di caratteristiche e funzionalità, ad esempio proprietà,
variabili, routine ed eventi, definito dalla classe. Ognuno di essi, tuttavia, ha un proprio nome, può essere
abilitato e disabilitato separatamente e può essere posizionato in un punto diverso del form.

Membri di oggetti
Un oggetto è un elemento di un'applicazione che rappresenta un'istanza di una classe. I campi, le proprietà, i
metodi e gli eventi sono i blocchi predefiniti degli oggetti e ne costituiscono i membri.
Accesso ai membri
Per accedere a un membro di un oggetto, è necessario specificare il nome della variabile oggetto, un punto ( . )
e il nome del membro, nell'ordine indicato. Nell'esempio seguente viene impostata la proprietà Text di un
oggetto Label.

warningLabel.Text = "Data not saved"

Elenco di membri IntelliSense


Quando si richiama l'opzione Elenca membri relativa a una classe, ad esempio quando si digita un punto ( . )
come operatore di accesso ai membri, IntelliSense elenca i membri di tale classe. Se si digita il punto dopo il
nome di una variabile dichiarata come istanza della classe, vengono elencati tutti i membri di istanza ma
nessuno dei membri condivisi. Se si digita il punto dopo il nome della classe, vengono elencati tutti i membri
condivisi ma nessuno dei membri di istanza. Per altre informazioni, vedere Using IntelliSense (Uso di
IntelliSense).
Campi e proprietà
I campi e le proprietà rappresentano le informazioni contenute in un oggetto. È possibile recuperare e impostare
i valori dei campi e delle proprietà usando le istruzioni di assegnazione, nello stesso modo in cui si recuperano e
impostano le variabili locali di una routine. Nell'esempio seguente viene recuperata la proprietà Width e
impostata la proprietà ForeColor di un oggetto Label.

Dim warningWidth As Integer = warningLabel.Width


warningLabel.ForeColor = System.Drawing.Color.Red

Si noti che un campo viene chiamato anche variabile membro.


Usare le routine delle proprietà nei casi seguenti:
È necessario controllare come e quando un valore viene impostato o recuperato.
La proprietà presenta un insieme di valori ben definito che è necessario convalidare.
L'impostazione di un valore determina modifiche percettibili nello stato dell'oggetto, ad esempio una
proprietà IsVisible .
L'impostazione della proprietà determina modifiche ad altre variabili interne o ai valori di altre proprietà.
Per poter impostare o recuperare la proprietà, è necessario eseguire prima una serie di passaggi.
Usare i campi nei casi seguenti:
Il valore è di tipo auto-convalidante. Ad esempio, se a una variabile Boolean viene assegnato un valore
diverso da True o False , si verifica un errore o una conversione automatica di dati.
Tutti i valori compresi nell'intervallo supportato dal tipo dati sono validi. Questa affermazione è vera per
diverse proprietà di tipo Single o Double .
La proprietà è un tipo dati String . Non è presente alcun vincolo riguardo alle dimensioni o al valore
della stringa.
Per altre informazioni, vedere Routine Property.

TIP
Mantieni sempre i campi non costanti privati. Quando si desidera renderla pubblica, utilizzare invece una proprietà.

Metodi
Un metodo è un'azione che può essere eseguita da un oggetto. Ad esempio, Add è un metodo dell'oggetto
ComboBox che aggiunge una nuova voce in una casella combinata.
Nell'esempio seguente viene illustrato il metodo Start di un oggetto Timer.

Dim safetyTimer As New System.Windows.Forms.Timer


safetyTimer.Start()

Si noti che un metodo è semplicemente una routine esposta da un oggetto.


Per altre informazioni, vedere Routine.
Eventi
Un evento è un'azione che viene riconosciuta da un oggetto, ad esempio il clic del mouse o la pressione di un
tasto, e alla quale è possibile rispondere mediante un codice scritto appositamente. Gli eventi possono verificarsi
come conseguenza di un'azione utente o un codice programma oppure possono essere generati dal sistema. Il
codice che segnala un evento è detto codice che genera l'evento, mentre il codice che risponde all'evento è detto
codice che gestisce l'evento.
È inoltre possibile sviluppare eventi personalizzati generati dai propri oggetti e gestiti da altri oggetti. Per altre
informazioni, vedere Eventi.
Membri di istanza e membri condivisi
Quando si crea un oggetto da una classe, il risultato è un'istanza di tale classe. I membri non dichiarati con la
parola chiave Shared sono membri di istanza e appartengono soltanto a tale istanza. Un membro di istanza
appartenente a una determinata istanza è indipendente dallo stesso membro appartenente a un'altra istanza
della stessa classe. Una variabile membro di istanza, ad esempio, può avere valori differenti in istanze differenti.
I membri dichiarati con la parola chiave Shared sono membri condivisi. Questo significa che appartengono
all'intera classe e non a una particolare istanza. Un membro condiviso viene definito una sola volta,
indipendentemente dal numero di istanze della relativa classe che vengono create. Questo è vero anche se non
viene creata alcuna istanza. Una variabile membro condiviso, ad esempio, può avere un unico valore, che può
essere usato da tutto il codice che ha accesso alla classe.
Accesso a membri non condivisi
1. Verificare che l'oggetto sia stato creato a partire dalla relativa classe e che sia stato assegnato a una
variabile oggetto.

Dim secondForm As New System.Windows.Forms.Form

2. Nell'istruzione che accede al membro, seguire il nome della variabile oggetto con l' operatore di accesso
ai membri ( . ) e quindi il nome del membro.

secondForm.Show()

Accesso a membri condivisi


Seguire il nome della classe con l' operatore di accesso ai membri ( . ) e quindi il nome del membro. È
necessario accedere sempre a un membro Shared dell'oggetto tramite il nome della classe.

Console.WriteLine("This computer is called " & Environment.MachineName)

In alternativa, se è già stato creato un oggetto a partire dalla classe, è possibile accedere a un membro
Shared tramite la variabile dell'oggetto.

Differenze tra classi e moduli


La differenza principale tra le classi e i moduli consiste nel fatto che è possibile creare istanze delle classi come
oggetti, ma tale operazione non è possibile per i moduli standard. Poiché è presente una sola copia di dati di un
modulo standard, quando una parte del programma modifica una variabile pubblica in un modulo standard, a
una successiva lettura della variabile qualsiasi altra parte del programma ottiene lo stesso valore. I dati oggetto,
invece, sono separati per ciascun oggetto di cui è stata creata un'istanza. A differenza dei moduli standard,
inoltre, le classi possono implementare interfacce. Se una classe è contrassegnata con il modificatore
MustInherit , non è possibile crearne un'istanza direttamente. Tuttavia, è ancora diverso da un modulo perché
può essere ereditato mentre i moduli non possono essere ereditati.

NOTE
Quando si applica un modificatore Shared a un membro di una classe, il modificatore viene associato alla classe stessa
anziché a una particolare istanza di quest'ultima. L'accesso al membro avviene direttamente tramite il nome della classe,
nello stesso modo in cui si accede ai membri del modulo.

Le classi e i moduli usano inoltre ambiti diversi per i relativi membri. I membri definiti di una classe vengono
dichiarati nell'ambito di una specifica istanza di tale classe ed esistono solo per la durata dell'oggetto. Per
accedere ai membri di una classe dall'esterno di quest'ultima, è necessario usare nomi completi nel formato
Oggetto.Membro.
D'altra parte, i membri dichiarati all'interno di un modulo sono accessibili pubblicamente per impostazione
predefinita e ad essi può accedere qualsiasi codice che abbia accesso al modulo. Questo significa che le variabili
presenti in un modulo standard sono effettivamente variabili globali poiché sono visibili da qualsiasi punto del
progetto ed esistono per la durata del programma.

Riutilizzo di classi e oggetti


Grazie agli oggetti, è possibile dichiarare variabili e routine una sola volta e quindi riutilizzarle quando
necessario. Se, ad esempio, si desidera aggiungere un correttore ortografico a un'applicazione, è possibile
definire tutte le variabili e le funzioni di supporto per fornire la funzionalità di correttore ortografico. Se il
controllo ortografico viene creato come classe, sarà possibile riutilizzarlo in altre applicazioni aggiungendo un
riferimento all'assembly compilato. Soluzione ancora migliore, sarà possibile risparmiare lavoro usando una
classe correttore ortografico già sviluppata da altri programmatori.
.NET fornisce molti esempi di componenti disponibili per l'utilizzo. Nell'esempio seguente viene usata la classe
TimeZone nello spazio dei nomi System. La classe TimeZone specifica i membri che consentono di recuperare le
informazioni sul fuso orario del computer corrente.

Public Sub ExamineTimeZone()


Dim tz As System.TimeZone = System.TimeZone.CurrentTimeZone
Dim s As String = "Current time zone is "
s &= CStr(tz.GetUtcOffset(Now).Hours) & " hours and "
s &= CStr(tz.GetUtcOffset(Now).Minutes) & " minutes "
s &= "different from UTC (coordinated universal time)"
s &= vbCrLf & "and is currently "
If tz.IsDaylightSavingTime(Now) = False Then s &= "not "
s &= "on ""summer time""."
Console.WriteLine(s)
End Sub

Nell'esempio precedente, la prima istruzione Dim dichiara una variabile oggetto di tipo TimeZone e assegna alla
variabile un oggetto TimeZone restituito dalla proprietà CurrentTimeZone.

Relazioni tra oggetti


Gli oggetti possono essere posti in relazione tra loro in diversi modi. Esistono due tipi principali di relazione,
ovvero gerarchica e di contenimento.
Relazione gerarchica
Se sono presenti classi di maggiore importanza e classi da esse derivate, tra le prime e le seconde esiste una
relazione gerarchica. Le gerarchie di classi sono utili per descrivere gli elementi che sono un sottotipo di una
classe più generale.
Nell'esempio seguente, si supponga di voler definire un tipo speciale di classe Button che si comporti come una
classe Button normale ma che allo stesso tempo esponga un metodo per invertire i colori di sfondo e di primo
piano.
Definire una classe derivata da una classe già esistente
1. Usare un'istruzione Class per definire una classe dalla quale creare l'oggetto necessario.

Public Class ReversibleButton

Verificare che l'ultima riga di codice della classe sia seguita da un'istruzione End Class . Per impostazione
predefinita, quando si immette un'istruzione Class l'ambiente di sviluppo integrato (IDE) genera
automaticamente un'istruzione End Class .
2. Aggiungere un'istruzione Inherits subito dopo l'istruzione Class . Specificare la classe dalla quale deriva
la nuova classe.

Inherits System.Windows.Forms.Button

La nuova classe eredita tutti i membri definiti dalla classe di base.


3. Aggiungere il codice per i membri aggiuntivi esposti dalla classe derivata. Ad esempio, è possibile
aggiungere un metodo ReverseColors . La classe derivata sarà simile alla seguente:

Public Class ReversibleButton


Inherits System.Windows.Forms.Button
Public Sub ReverseColors()
Dim saveColor As System.Drawing.Color = Me.BackColor
Me.BackColor = Me.ForeColor
Me.ForeColor = saveColor
End Sub
End Class

Se si crea un oggetto dalla ReversibleButton classe, può accedere a tutti i membri della Button classe,
nonché al ReverseColors metodo e a qualsiasi altro nuovo membro definito in ReversibleButton .

Le classi derivate ereditano i membri della classe su cui sono basate, consentendo di raggiungere una maggiore
complessità mano a mano che si avanza nella gerarchia. Per altre informazioni, vedere Nozioni fondamentali
sull'ereditarietà.
Compilare il codice
Verificare che il compilatore possa accedere alla classe da cui si vuole derivare la nuova classe. A tale scopo è
possibile fornire il nome completo della classe, come nell'esempio precedente, oppure specificare il relativo
spazio dei nomi in un'istruzione Imports (tipo e spazio dei nomi .NET). Se la classe si trova in un progetto
differente, può essere necessario aggiungere un riferimento a tale progetto. Per ulteriori informazioni, vedere
gestione dei riferimenti in un progetto.
Relazione di contenuto
Un altro tipo di relazione tra oggetti è la relazione di contenimento. Gli oggetti contenitore incapsulano
logicamente altri oggetti. Ad esempio, l'oggetto OperatingSystem contiene logicamente un oggetto Version,
restituito tramite la proprietà Version. Tenere presente che l'oggetto contenitore non contiene fisicamente altri
oggetti.
Raccolte
Un tipo particolare di contenimento degli oggetti è rappresentato dalle raccolte. Le raccolte sono gruppi di
oggetti simili che possono essere enumerati. Visual Basic supporta una sintassi specifica in for each... Istruzione
successiva che consente di scorrere gli elementi di una raccolta. Inoltre, le raccolte consentono spesso di usare
un Item[] per recuperare gli elementi in base al relativo indice o tramite l'associazione a una stringa univoca. Le
raccolte possono risultare di uso più semplice rispetto alle matrici, in quanto consentono di aggiungere o
rimuovere elementi senza ricorrere agli indici. Grazie alla loro facilità d'uso, vengono spesso usate per
l'archiviazione di form e controlli.

Argomenti correlati
Procedura dettagliata: definizione delle classi
Viene fornita una descrizione dettagliata della creazione di una classe.
Metodi e proprietà di overload
Metodi e proprietà di overload
Nozioni fondamentali sull'ereditarietà
Vengono illustrati modificatori di ereditarietà, override di metodi e proprietà, MyClass e MyBase.
Durata degli oggetti: come creare ed eliminare definitivamente oggetti
Vengono illustrate la creazione e l'eliminazione delle istanze di classe.
Tipi anonimi
Viene descritto come creare e usare i tipi anonimi, che consentono di creare oggetti senza scrivere una
definizione della classe per il tipo dati.
Inizializzatori di oggetto: tipi denominati e anonimi
Vengono discussi gli inizializzatori di oggetto, usati per creare istanze di tipi denominati e anonimi mediante
un'unica espressione.
Procedura: dedurre tipi e nomi di proprietà nelle dichiarazioni di tipo anonimo
Viene descritto come dedurre nomi e tipi di proprietà nelle dichiarazioni di tipo anonimo. Vengono forniti
esempi di inferenze riuscite e non riuscite.
Operatori ed espressioni in Visual Basic
05/03/2021 • 3 minutes to read • Edit Online

Un operatore è un elemento di codice che esegue un'operazione su uno o più elementi di codice che
contengono valori. Gli elementi di valore includono variabili, costanti, valori letterali, proprietà, espressioni e
valori restituiti da procedure Function e Operator .
Un'espressione è una serie di elementi di valore combinati con operatori che restituisce un nuovo valore. Gli
operatori agiscono sugli elementi di valore mediante l'esecuzione di calcoli, confronti o altre operazioni.

Tipi di operatori
Visual Basic fornisce i tipi di operatori seguenti:
Gli operatori aritmetici eseguono calcoli comuni su valori numerici, inclusa l'inversione degli schemi di
bit.
Gli operatori di confronto confrontano due espressioni e restituiscono un valore Boolean che
rappresenta il risultato del confronto.
Gli operatori di concatenamento uniscono più stringhe in un'unica stringa.
Gli operatori logici e bit per bit in Visual Basic combinano valori Boolean o numerici e restituiscono un
risultato con lo stesso tipo di dati dei valori.
Gli elementi di valore che vengono combinati con un operatore sono detti operandi di tale operatore. Gli
operatori combinati con elementi di valore formano espressioni, ad eccezione dell'operatore di assegnazione
che forma un'istruzione. Per altre informazioni, vedere Istruzioni.

Valutazione delle espressioni


Il risultato finale di un'espressione rappresenta un valore, in genere espresso con un tipo di dati comune quale
Boolean , String o un tipo numerico.

Di seguito sono riportati esempi di espressioni.


5 + 4

' The preceding expression evaluates to 9.

15 * System.Math.Sqrt(9) + x

' The preceding expression evaluates to 45 plus the value of x.

"Concat" & "ena" & "tion"

' The preceding expression evaluates to "Concatenation".

763 < 23

' The preceding expression evaluates to False.

Più operatori possono eseguire azioni in un'unica operazione o istruzione, come illustrato nel seguente esempio.
x = 45 + y * z ^ 2

Nell'esempio precedente Visual Basic esegue le operazioni nell'espressione sul lato destro dell'operatore di
assegnazione ( = ), quindi assegna il valore risultante alla variabile a x sinistra. Non esistono limiti al numero
di operatori combinabili in un'espressione, ma per ottenere i risultati previsti è importante tenere presenti le
regole di Precedenza tra gli operatori in Visual Basic.

Vedi anche
Operatori
Combinazione efficace di operatori
Istruzioni
Routine in Visual Basic
05/03/2021 • 7 minutes to read • Edit Online

Una routine è un blocco di istruzioni Visual Basic racchiuso tra un'istruzione di dichiarazione ( Function ,, Sub
Operator , Get , Set ) e una End dichiarazione corrispondente. Tutte le istruzioni eseguibili in Visual Basic
devono essere incluse in alcune procedure.

Chiamata di una routine


Una routine viene richiamata da altre parti del codice. Questa operazione è nota come chiamata di routine. Al
termine dell'esecuzione della routine, il controllo viene restituito al codice che ha richiamato la routine, noto
come codice chiamante. Il codice chiamante è un'istruzione o un'espressione all'interno di un'istruzione, che
specifica la routine tramite nome e le trasferisce il controllo.

Termine di una routine


Una routine restituisce il controllo al codice chiamante al termine della sua esecuzione. A tale scopo, può
utilizzare un'istruzione return, l'istruzione Exit appropriata per la routine o l'istruzione End dell'istruzione della
stored <keyword> procedure. Il controllo passa quindi al codice chiamante che segue il punto della chiamata di
routine.
Con un'istruzione Return , il controllo ritorna immediatamente al codice chiamante. Le istruzioni che
seguono l'istruzione Return non vengono eseguite. Una routine può includere più di un'istruzione
Return .

Con un'istruzione Exit Sub o Exit Function , il controllo ritorna immediatamente al codice chiamante.
Le istruzioni che seguono l'istruzione Exit non vengono eseguite. Una routine può includere più di
un'istruzione Exit ed è possibile combinare istruzioni Return e Exit nella stessa routine.
Se una routine non contiene istruzioni Return o Exit , termina con un'istruzione End Sub o
End Function , End Get o End Set che segue l'ultima istruzione del corpo della routine. L'istruzione End
restituisce il controllo immediatamente al codice chiamante. Una routine può contenere solo
un'istruzione End .

Parametri e argomenti
Nella maggior parte dei casi, una routine deve usare dati diversi ogni volta che viene chiamata. È possibile
passare queste informazioni alla routine come parte della chiamata di routine. La routine definisce zero o più
parametri, ognuno dei quali rappresenta un valore necessario da passare alla routine. A ogni parametro della
definizione della routine corrisponde un argomento nella chiamata di routine. Un argomento rappresenta il
valore passato al parametro corrispondente in una chiamata di routine specifica.

Tipi di routine
Visual Basic usa diversi tipi di procedure:
Le routine Sub eseguono operazioni ma non restituiscono un valore al codice chiamante.
Le routine di gestione degli eventi sono routine Sub eseguite in risposta a un evento generato da
un'azione utente o da un'occorrenza in un programma.
Le routine Function restituiscono un valore al codice chiamante. Possono eseguire altre azioni prima della
restituzione del valore.
Alcune funzioni scritte in C# restituiscono un valore di riferimento restituito. I chiamanti delle routine
Function possono modificare il valore restituito e questa modifica si riflette nello stato dell'oggetto
chiamato. A partire da Visual Basic 2017, il codice di Visual Basic può usare valori di riferimento restituiti,
anche se non può restituire un valore in base al riferimento. Per altre informazioni, vedere Valori di
riferimento restituiti.
Le routine Property restituiscono e assegnano valori di proprietà su oggetti o moduli.
Le routine Operator definiscono il comportamento di un operatore standard quando uno o entrambi gli
operandi sono una struttura o classe appena definita.
Le routine generiche in Visual Basic definiscono uno o più parametri di tipo oltre i relativi parametri
normali, per cui il codice chiamante può passare tipi di dati specifici ogni volta che esegue una chiamata.

Routine e codice strutturato


Ogni riga di codice eseguibile nell'applicazione deve essere incluso all'interno di una routine, ad esempio Main ,
calculate o Button1_Click . Se si suddividono le routine di grandi dimensioni in piccole routine, l'applicazione
risulta più leggibile.
Le routine sono utili per eseguire attività ripetute o condivise, ad esempio calcoli usati frequentemente, modifica
di testo e di controllo e operazioni su database. È possibile chiamare una routine da diversi punti del codice, per
cui è possibile usare routine come blocchi predefiniti per l'applicazione.
La strutturazione del codice con routine offre i vantaggi seguenti:
Le routine consentono di dividere i programmi in unità logiche distinte. È possibile eseguire più
facilmente il debug di unità separate, piuttosto che eseguire il debug di un intero programma senza
routine.
Dopo aver sviluppato le routine da usare in un programma, è possibile usarle in altri programmi, spesso
senza modificarle o apportando modifiche minime. Questo consente di evitare la duplicazione del codice.

Vedi anche
Procedura: Creare una routine
Routine Sub
Routine Function
Routine Property
Routine di operatore
Parametri e argomenti delle routine
Routine ricorsive
Overload della routine
Generic Procedures in Visual Basic
Oggetti e classi
Istruzioni in Visual Basic
05/03/2021 • 22 minutes to read • Edit Online

Un'istruzione in Visual Basic è un'istruzione completa. Può contenere parole chiave, operatori, variabili, costanti
ed espressioni. Ogni istruzione appartiene a una delle categorie seguenti:
Le istruzioni di dichiarazione , che denominano una variabile, una costante o una routine, possono
anche specificare un tipo di dati.
Istruzioni eseguibili , che avviano le azioni. Queste istruzioni possono chiamare un metodo o una
funzione e possono eseguire il ciclo o il branching tramite blocchi di codice. Le istruzioni eseguibili
includono istruzioni di assegnazione che assegnano un valore o un'espressione a una variabile o a
una costante.
In questo argomento viene descritta ogni categoria. Inoltre, in questo argomento viene descritto come
combinare più istruzioni su una sola riga e come continuare un'istruzione su più righe.

Istruzioni di dichiarazione
Usare le istruzioni di dichiarazione per assegnare un nome e una definizione a procedure, variabili, proprietà,
matrici e costanti. Quando si dichiara un elemento di programmazione, è anche possibile definire il tipo di dati, il
livello di accesso e l'ambito. Per altre informazioni, vedere caratteristiche degli elementi dichiarati.
Nell'esempio seguente sono contenute tre dichiarazioni.

Public Sub ApplyFormat()


Const limit As Integer = 33
Dim thisWidget As New widget
' Insert code to implement the procedure.
End Sub

La prima dichiarazione è l' Sub istruzione. Insieme alla relativa End Sub istruzione corrispondente, viene
dichiarata una stored procedure denominata applyFormat . Specifica anche che applyFormat è Public , il che
significa che qualsiasi codice che può farvi riferimento può chiamarlo.
La seconda dichiarazione è l' Const istruzione, che dichiara la costante limit , specificando il Integer tipo di
dati e un valore di 33.
La terza dichiarazione è l' Dim istruzione, che dichiara la variabile thisWidget . Il tipo di dati è un oggetto
specifico, ovvero un oggetto creato dalla Widget classe. È possibile dichiarare una variabile come qualsiasi tipo
di dati elementare o qualsiasi tipo di oggetto esposto nell'applicazione in uso.
Valori iniziali
Quando viene eseguito il codice contenente un'istruzione di dichiarazione, Visual Basic riserva la memoria
necessaria per l'elemento dichiarato. Se l'elemento include un valore, Visual Basic lo inizializza sul valore
predefinito per il tipo di dati. Per ulteriori informazioni, vedere "comportamento" nell' istruzione Dim.
È possibile assegnare un valore iniziale a una variabile come parte della relativa dichiarazione, come illustrato
nell'esempio seguente.
Dim m As Integer = 45
' The preceding declaration creates m and assigns the value 45 to it.

Se una variabile è una variabile oggetto, è possibile creare in modo esplicito un'istanza della relativa classe
quando viene dichiarata tramite la parola chiave new operator , come illustrato nell'esempio seguente.

Dim f As New System.Windows.Forms.Form()

Si noti che il valore iniziale specificato in un'istruzione di dichiarazione non viene assegnato a una variabile
finché l'esecuzione non raggiunge la relativa istruzione di dichiarazione. Fino a quel momento, la variabile
contiene il valore predefinito per il tipo di dati.

Istruzioni eseguibili
Un'istruzione eseguibile esegue un'azione. Può chiamare una routine, creare un ramo in un'altra posizione nel
codice, eseguire il ciclo di diverse istruzioni o valutare un'espressione. Un'istruzione di assegnazione è un caso
speciale di un'istruzione eseguibile.
Nell'esempio seguente viene utilizzata una If...Then...Else struttura di controllo per eseguire blocchi di
codice diversi in base al valore di una variabile. All'interno di ogni blocco di codice, un For...Next ciclo viene
eseguito un numero specificato di volte.

Public Sub StartWidget(ByVal aWidget As widget,


ByVal clockwise As Boolean, ByVal revolutions As Integer)
Dim counter As Integer
If clockwise = True Then
For counter = 1 To revolutions
aWidget.SpinClockwise()
Next counter
Else
For counter = 1 To revolutions
aWidget.SpinCounterClockwise()
Next counter
End If
End Sub

L' If istruzione nell'esempio precedente verifica il valore del parametro clockwise . Se il valore è True , viene
chiamato il spinClockwise metodo di aWidget . Se il valore è False , viene chiamato il spinCounterClockwise
metodo di aWidget . La If...Then...Else struttura del controllo termina con End If .
Il For...Next ciclo all'interno di ogni blocco chiama il metodo appropriato un numero di volte uguale al valore
del revolutions parametro.

Istruzioni di assegnazione
Le istruzioni di assegnazione eseguono operazioni di assegnazione, che sono costituite dall'acquisizione del
valore sul lato destro dell'operatore di assegnazione ( = ) e dall'archiviazione nell'elemento a sinistra, come
nell'esempio seguente.

v = 42

Nell'esempio precedente, l'istruzione di assegnazione archivia il valore letterale 42 nella variabile v .


Elementi di programmazione idonei
L'elemento di programmazione sul lato sinistro dell'operatore di assegnazione deve essere in grado di accettare
e archiviare un valore. Questo significa che deve essere una variabile o una proprietà che non è ReadOnlyo deve
essere un elemento di matrice. Nel contesto di un'istruzione di assegnazione, tale elemento viene talvolta
denominato lvalue, per "valore a sinistra".
Il valore a destra dell'operatore di assegnazione viene generato da un'espressione, che può essere costituita da
qualsiasi combinazione di valori letterali, costanti, variabili, proprietà, elementi di matrice, altre espressioni o
chiamate di funzione. Questa condizione è illustrata nell'esempio seguente.

x = y + z + FindResult(3)

Nell'esempio precedente il valore contenuto nella variabile viene aggiunto y al valore contenuto nella variabile
z , quindi viene aggiunto il valore restituito dalla chiamata al funzione findResult . Il valore totale di questa
espressione viene quindi archiviato nella variabile x .
Tipi di dati nelle istruzioni di assegnazione
Oltre ai valori numerici, l'operatore di assegnazione può anche assegnare String valori, come illustrato
nell'esempio seguente.

Dim a, b As String
a = "String variable assignment"
b = "Con" & "cat" & "enation"
' The preceding statement assigns the value "Concatenation" to b.

È anche possibile assegnare Boolean valori, usando un Boolean valore letterale o un' Boolean espressione,
come illustrato nell'esempio seguente.

Dim r, s, t As Boolean
r = True
s = 45 > 1003
t = 45 > 1003 Or 45 > 17
' The preceding statements assign False to s and True to t.

Analogamente, è possibile assegnare valori appropriati agli elementi di programmazione Char del Date tipo di
Object dati, o. È inoltre possibile assegnare un'istanza di oggetto a un elemento dichiarato come della classe da
cui viene creata l'istanza.
Istruzioni di assegnazione composta
Le istruzioni di assegnazione composta eseguono innanzitutto un'operazione su un'espressione prima di
assegnarla a un elemento di programmazione. Nell'esempio seguente viene illustrato uno di questi operatori,
+= , che incrementa il valore della variabile sul lato sinistro dell'operatore in base al valore dell'espressione a
destra.

n += 1

Nell'esempio precedente viene aggiunto 1 al valore di n , quindi il nuovo valore viene archiviato in n . Si tratta
di un equivalente a sintassi abbreviata dell'istruzione seguente:

n = n + 1

È possibile eseguire un'ampia gamma di operazioni di assegnazione composta utilizzando operatori di questo
tipo. Per un elenco di questi operatori e altre informazioni su di essi, vedere operatori di assegnazione.
L'operatore di assegnazione di concatenazione ( &= ) è utile per aggiungere una stringa alla fine di stringhe già
esistenti, come illustrato nell'esempio seguente.

Dim q As String = "Sample "


q &= "String"
' q now contains "Sample String".

Conversioni di tipi nelle istruzioni di assegnazione


Il valore assegnato a una variabile, una proprietà o un elemento di matrice deve essere di un tipo di dati
appropriato a tale elemento di destinazione. In generale, è consigliabile provare a generare un valore dello
stesso tipo di dati dell'elemento di destinazione. Tuttavia, alcuni tipi possono essere convertiti in altri tipi durante
l'assegnazione.
Per informazioni sulla conversione tra tipi di dati, vedere conversioni di tipi in Visual Basic. In breve, Visual Basic
converte automaticamente un valore di un determinato tipo in un altro tipo a cui viene ampliato. Una
conversione verso un tipo di dati più ampio è una conversione in che ha sempre esito positivo in fase di
esecuzione e non perde i dati. Ad esempio, Visual Basic converte un Integer valore in Double quando
appropriato, perché viene Integer ampliato a Double . Per altre informazioni, vedere Widening and Narrowing
Conversions.
Le conversioni verso un tipo di dati più piccolo, ovvero quelle che non si ampliano, presentano un rischio di
errore in fase di esecuzione o di perdita di dati. È possibile eseguire una conversione verso un tipo di
conversione più piccolo in modo esplicito tramite una funzione di conversione dei tipi oppure è possibile
indirizzare il compilatore in modo implicito per eseguire tutte le conversioni Option Strict Off . Per ulteriori
informazioni, vedere conversioni implicite ed esplicite.

Inserimento di più istruzioni su una sola riga


È possibile avere più istruzioni su una sola riga separate dal carattere due punti ( : ). Questa condizione è
illustrata nell'esempio seguente.

Dim sampleString As String = "Hello World" : MsgBox(sampleString)

Sebbene occasionalmente pratico, questo tipo di sintassi rende il codice difficile da leggere e gestire. È quindi
consigliabile usare una sola istruzione per una riga.

Continuazione di un'istruzione su più righe


Un'istruzione si trova in genere in una sola riga, ma quando è troppo lunga, è possibile continuare nella riga
successiva utilizzando una sequenza di continuazione di riga, costituita da uno spazio seguito da un carattere di
sottolineatura ( _ ) seguito da un ritorno a capo. Nell'esempio seguente l' MsgBox istruzione Executable viene
continuata su due righe.

Public Sub DemoBox()


Dim nameVar As String
nameVar = "John"
MsgBox("Hello " & nameVar _
& ". How are you?")
End Sub

Continuazione di riga implicita


In molti casi, è possibile continuare un'istruzione sulla riga consecutiva successiva senza usare il carattere di
sottolineatura ( _ ). Gli elementi di sintassi seguenti continuano in modo implicito l'istruzione alla riga di codice
successiva.
Dopo una virgola ( , ). Ad esempio:

Public Function GetUsername(ByVal username As String,


ByVal delimiter As Char,
ByVal position As Integer) As String

Return username.Split(delimiter)(position)
End Function

Dopo una parentesi aperta ( ( ) o prima di una parentesi di chiusura ( ) ). Ad esempio:

Dim username = GetUsername(


Security.Principal.WindowsIdentity.GetCurrent().Name,
CChar("\"),
1
)

Dopo una parentesi graffa aperta ( { ) o prima di una parentesi graffa chiusa ( } ). Ad esempio:

Dim customer = New Customer With {


.Name = "Terry Adams",
.Company = "Adventure Works",
.Email = "[email protected]"
}

Per altre informazioni, vedere inizializzatori di oggetto: tipi denominati e anonimi o inizializzatori di
insieme.
Dopo un'espressione incorporata aperta ( <%= ) o prima della chiusura di un'espressione incorporata (
%> ) all'interno di un valore letterale XML. Ad esempio:

Dim customerXml = <Customer>


<Name>
<%=
customer.Name
%>
</Name>
<Email>
<%=
customer.Email
%>
</Email>
</Customer>

Per ulteriori informazioni, vedere espressioni incorporate in XML.


Dopo l'operatore di concatenazione ( & ). Ad esempio:

cmd.CommandText =
"SELECT * FROM Titles JOIN Publishers " &
"ON Publishers.PubId = Titles.PubID " &
"WHERE Publishers.State = 'CA'"

Per ulteriori informazioni, vedere operatori elencati per funzionalità.


Dopo gli operatori di assegnazione ( = , &= , := , += , -= , *= , /= , \= , ^= , <<= , >>= ). Ad
esempio:

Dim fileStream =
My.Computer.FileSystem.
OpenTextFileReader(filePath)

Per ulteriori informazioni, vedere operatori elencati per funzionalità.


Dopo gli operatori binari ( + ,, - / , * , Mod , <> , < , > , <= , >= , ^ , >> , << , And , AndAlso
, Or , OrElse , Like , Xor ) in un'espressione. Ad esempio:

Dim memoryInUse =
My.Computer.Info.TotalPhysicalMemory +
My.Computer.Info.TotalVirtualMemory -
My.Computer.Info.AvailablePhysicalMemory -
My.Computer.Info.AvailableVirtualMemory

Per ulteriori informazioni, vedere operatori elencati per funzionalità.


Dopo gli Is IsNot operatori e. Ad esempio:

If TypeOf inStream Is
IO.FileStream AndAlso
inStream IsNot
Nothing Then

ReadFile(inStream)

End If

Per ulteriori informazioni, vedere operatori elencati per funzionalità.


Dopo un carattere qualificatore del membro ( . ) e prima del nome del membro. Ad esempio:

Dim fileStream =
My.Computer.FileSystem.
OpenTextFileReader(filePath)

Tuttavia, è necessario includere un carattere di continuazione di riga ( _ ) dopo un carattere qualificatore


membro quando si utilizza l' With istruzione o specificare valori nell'elenco di inizializzazione per un
tipo. Provare a suddividere la riga dopo l'operatore di assegnazione (ad esempio, = ) quando si
utilizzano With istruzioni o elenchi di inizializzazione di oggetti. Ad esempio:
' Not allowed:
' Dim aType = New With { .
' PropertyName = "Value"

' Allowed:
Dim aType = New With {.PropertyName =
"Value"}

Dim log As New EventLog()

' Not allowed:


' With log
' .
' Source = "Application"
' End With

' Allowed:
With log
.Source =
"Application"
End With

Per ulteriori informazioni, vedere con... Termina con l'istruzione o gli inizializzatori di oggetto: tipi
denominati e anonimi.
Dopo un qualificatore di proprietà Axis XML ( . o .@ ... ). Tuttavia, quando si _ specifica un
qualificatore del membro quando si usa la parola chiave, è necessario includere un carattere di
continuazione di riga () With . Ad esempio:

Dim customerName = customerXml.


<Name>.Value

Dim customerEmail = customerXml...


<Email>.Value

Per ulteriori informazioni, vedere Proprietà Axis XML.


Dopo un segno di minore (<) o prima di un segno di maggiore di ( > ) quando si specifica un attributo.
Anche dopo un segno di maggiore di ( > ) quando si specifica un attributo. Tuttavia, _ quando si
specificano gli attributi a livello di assembly o di modulo, è necessario includere un carattere di
continuazione di riga (). Ad esempio:

<
Serializable()
>
Public Class Customer
Public Property Name As String
Public Property Company As String
Public Property Email As String
End Class

Per altre informazioni, vedere Cenni preliminari sugli attributi.


Operatori di query before e After ( Aggregate ,, Distinct From , Group By , Group Join , Join , Let ,
Order By , Select , Skip , Skip While , Take , Take While , Where , In , Into , On , Ascending e
Descending ). Non è possibile suddividere una linea tra le parole chiave degli operatori di query che sono
costituite da più parole chiave ( Order By ,, Group Join Take While e Skip While ). Ad esempio:
Dim vsProcesses = From proc In
Process.GetProcesses
Where proc.MainWindowTitle.Contains("Visual Studio")
Select proc.ProcessName, proc.Id,
proc.MainWindowTitle

Per ulteriori informazioni, vedere query.


Dopo la In parola chiave in un' For Each istruzione. Ad esempio:

For Each p In
vsProcesses

Console.WriteLine("{0}" & vbTab & "{1}" & vbTab & "{2}",


p.ProcessName,
p.Id,
p.MainWindowTitle)
Next

Per ulteriori informazioni, vedere for each... Istruzione successiva.


Dopo la From parola chiave in un inizializzatore di raccolta. Ad esempio:

Dim days = New List(Of String) From


{
"Mo", "Tu", "We", "Th", "F", "Sa", "Su"
}

Per altre informazioni, vedere Inizializzatori di insieme.

Aggiunta di commenti
Il codice sorgente non è sempre di chiara comprensione, neanche al programmatore che lo ha scritto. Per
documentare il codice, la maggior parte dei programmatori fa uso di commenti incorporati. I commenti nel
codice possono spiegare una procedura o una particolare istruzione a chiunque legga o funzioni in un secondo
momento. Visual Basic ignora i commenti durante la compilazione e non influiscono sul codice compilato.
Le righe di commento iniziano con un apostrofo ( ' ) o REM seguito da uno spazio. Possono essere aggiunti
ovunque nel codice, tranne che all'interno di una stringa. Per aggiungere un commento a un'istruzione, inserire
un apostrofo o REM dopo l'istruzione, seguito dal commento. I commenti possono anche essere inseriti in una
riga separata. Nell'esempio seguente vengono illustrate queste possibilità.

' This is a comment on a separate code line.


REM This is another comment on a separate code line.
x += a(i) * b(i) ' Add this amount to total.
MsgBox(statusMessage) REM Inform operator of status.

Verifica degli errori di compilazione


Se, dopo aver digitato una riga di codice, la riga viene visualizzata con una sottolineatura blu ondulata (potrebbe
essere visualizzato anche un messaggio di errore), nell'istruzione si verifica un errore di sintassi. È necessario
individuare il problema con l'istruzione (esaminando l'elenco attività oppure passando il puntatore del mouse
sull'errore con il puntatore del mouse e leggendo il messaggio di errore) e correggerlo. Fino a quando non sono
stati corretti tutti gli errori di sintassi nel codice, il programma non verrà compilato correttamente.
Sezioni correlate
T ERM IN E DEF IN IZ IO N E

Operatori di assegnazione Fornisce collegamenti a pagine di riferimento per il


linguaggio che coprono gli operatori di assegnazione, ad
esempio = , *= e &= .

Operatori ed espressioni Viene illustrato come combinare elementi con operatori per
restituire nuovi valori.

Procedura: Interrompere e combinare istruzioni nel codice Viene illustrato come suddividere una singola istruzione in
più righe e come inserire più istruzioni nella stessa riga.

Procedura: Etichettare le istruzioni Viene illustrato come etichettare una riga di codice.
Stringhe in Visual Basic
05/03/2021 • 2 minutes to read • Edit Online

In questa sezione vengono descritti i concetti di base relativi all'utilizzo di stringhe in Visual Basic.

Contenuto della sezione


Introduzione alle stringhe in Visual Basic
Vengono elencati gli argomenti in cui vengono descritti i concetti di base relativi all'utilizzo di stringhe in Visual
Basic.
Procedura: creare stringhe utilizzando StringBuilder in Visual Basic
Illustra come creare in modo efficiente una stringa lunga da molte stringhe più piccole.
Procedura: cercare all'interno di una stringa
Illustra come determinare l'indice della prima occorrenza di una sottostringa.
Conversione tra stringhe e altri tipi di dati in Visual Basic
Elenca argomenti che illustrano come convertire le stringhe in altri tipi di dati.
Convalida delle stringhe in Visual Basic
Elenca argomenti che descrivono come convalidare le stringhe.
Procedura dettagliata: crittografia e decrittografia di stringhe in Visual Basic
Illustra come crittografare e decrittografare le stringhe usando la versione del provider del servizio di
crittografia dell'algoritmo Triple Data Encryption Standard.

Vedi anche
Funzionalità del linguaggio Visual Basic
Variabili in Visual Basic
05/03/2021 • 3 minutes to read • Edit Online

Spesso è necessario archiviare i valori quando si eseguono calcoli con Visual Basic. È possibile ad esempio che si
vogliano calcolare valori diversi, confrontarli ed eseguire operazioni su di essi a seconda del risultato del
confronto. Per poter confrontare i valori è necessario archiviarli.

Utilizzo
Visual Basic, analogamente alla maggior parte dei linguaggi di programmazione, USA le variabili per archiviare i
valori. Ogni variabile ha un nome, ovvero la parola usata per fare riferimento al valore contenuto nella variabile.
Ogni variabile ha anche un tipo di dati che determina il genere di dati che la variabile può archiviare. Una
variabile può rappresentare una matrice se deve archiviare un insieme indicizzato di elementi di dati
strettamente correlati.
L'inferenza del tipo di variabile locale consente di dichiarare le variabili senza specificare esplicitamente un tipo
di dati. In questo caso, il compilatore deduce il tipo della variabile in base al tipo dell'espressione di
inizializzazione. Per altre informazioni, vedere Local Type Inference (Inferenza del tipo di variabile locale) e
Option Infer Statement (Istruzione Option Infer).

Assegnazione di valori
Le istruzioni di assegnazione consentono di eseguire i calcoli e assegnare il risultato a una variabile, come
illustra l'esempio seguente.

' The following statement assigns the value 10 to the variable.


applesSold = 10
' The following statement increments the variable.
applesSold = applesSold + 1
' The variable now holds the value 11.

NOTE
Il segno di uguale ( = ) in questo esempio è un operatore di assegnazione, non un operatore di uguaglianza. Il valore
viene assegnato alla variabile applesSold .

Per altre informazioni, vedere Procedura: Spostare i dati all'interno e all'esterno di una variabile.

Variabili e proprietà
Analogamente a una variabile, una proprietà rappresenta un valore al quale è possibile accedere. Le proprietà
sono tuttavia più complesse delle variabili. Le proprietà usano blocchi di codice che controllano come impostare
e recuperare il valore della proprietà. Per altre informazioni, vedere Differenze tra proprietà e variabili in Visual
Basic.

Vedi anche
Dichiarazione di variabile
Variabili oggetto
Risoluzione dei problemi relativi alle variabili
Procedura: spostare i dati all'interno e all'esterno di una variabile
Differenze tra proprietà e variabili in Visual Basic
Inferenza del tipo di variabile locale
XML in Visual Basic
02/11/2020 • 2 minutes to read • Edit Online

Visual Basic fornisce il supporto del linguaggio integrato che consente l'interazione con LINQ to XML .

Contenuto della sezione


Negli argomenti di questa sezione viene descritto l'uso di LINQ to XML con Visual Basic.

A RGO M EN TO DESC RIZ IO N E

Cenni preliminari su LINQ to XML in Visual Basic Viene descritto il supporto di Visual Basic LINQ to XML .

Creazione di XML in Visual Basic Descrive come creare oggetti valore letterale XML usando
LINQ to XML.

Modifica di XML in Visual Basic Descrive come caricare e analizzare codice XML usando
Visual Basic.

Accesso a XML in Visual Basic Descrive le proprietà Axis XML e i metodi LINQ to XML per
l'accesso a elementi e attributi XML.

Vedere anche
System.Xml.Linq
Valori letterali XML
Proprietà Axis XML
LINQ to XML
Interoperabilità COM (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Il modello COM (Component Object Model) consente a un oggetto di esporre la relativa funzionalità agli altri
componenti e alle applicazioni host. La maggior parte del software in uso oggi include oggetti COM. Anche se
gli assembly .NET sono la scelta migliore per le nuove applicazioni, in alcuni casi può essere necessario usare
oggetti COM. In questa sezione vengono illustrati alcuni dei problemi associati alla creazione e all'utilizzo di
oggetti COM con Visual Basic.

Contenuto della sezione


Introduzione all'interoperabilità COM
Offre una panoramica dell'interoperabilità COM.
Procedura: Fare riferimento a oggetti COM da Visual Basic
Spiega come aggiungere riferimenti agli oggetti COM con librerie dei tipi.
Procedura: Utilizzare i controlli ActiveX
Viene illustrato come utilizzare i controlli ActiveX esistenti per aggiungere funzionalità alla casella degli
strumenti di Visual Studio.
Procedura dettagliata: Chiamata delle API di Windows
Descrive i passaggi della procedura di chiamata delle API che fanno parte del sistema operativo Windows.
Procedura: Chiamare le API di Windows
Illustra come definire e chiamare la funzione MessageBox in User32.dll.
Procedura: Chiamare una funzione Windows che accetta tipi senza segno
Illustra come chiamare una funzione Windows che ha un parametro di tipo senza segno.
Procedura dettagliata: creazione di oggetti COM con Visual Basic
Illustra la procedura di creazione degli oggetti COM con e senza il modello di classe COM.
Risoluzione dei problemi relativi all'interoperabilità
Descrive alcuni dei problemi che possono verificarsi quando si usa COM.
Interoperabilità COM nelle applicazioni .NET Framework
Panoramica dell'uso degli oggetti COM e degli oggetti .NET Framework nella stessa applicazione.
Procedura dettagliata: Implementazione dell'ereditarietà con gli oggetti COM
Spiega come usare gli oggetti COM esistenti come base per i nuovi oggetti.

Sezioni correlate
Interoperabilità con codice non gestito
Descrive i servizi di interoperabilità forniti da Common Language Runtime.
Esposizione di componenti COM a .NET Framework
Descrive il processo di chiamata dei tipi COM usando l'interoperabilità COM.
Esposizione di componenti .NET Framework a COM
Descrive la preparazione e l'uso dei tipi gestiti da COM.
Applicazione di attributi di interoperabilità
Descrive gli attributi che è possibile usare quando si lavora con codice non gestito.
Introduzione all'interoperabilità COM (Visual Basic)
05/03/2021 • 6 minutes to read • Edit Online

Il Component Object Model (COM) consente a un oggetto di esporre la funzionalità ad altri componenti e di
ospitare le applicazioni. Sebbene gli oggetti COM siano stati fondamentali per la programmazione di Windows
per molti anni, le applicazioni progettate per il Common Language Runtime (CLR) offrono molti vantaggi.
.NET Framework le applicazioni sostituiranno quelle sviluppate con COM. Fino ad allora, potrebbe essere
necessario usare o creare oggetti COM usando Visual Studio. L'interoperabilità con COM o l' interoperabilità
COM consente di utilizzare gli oggetti COM esistenti durante la transizione al .NET Framework al ritmo
dell'utente.
Utilizzando la .NET Framework per creare componenti COM, è possibile utilizzare l'interoperabilità COM senza
registrazione. In questo modo è possibile controllare la versione della DLL abilitata quando più di una versione
viene installata in un computer e consente agli utenti finali di utilizzare XCOPY o FTP per copiare l'applicazione
in una directory appropriata nel computer in cui è possibile eseguirla. Per altre informazioni, vedere
interoperabilità COM senza registrazione.

Codice gestito e dati


Il codice sviluppato per la .NET Framework viene definito codice gestito e contiene i metadati utilizzati da CLR. I
dati utilizzati dalle applicazioni .NET Framework sono denominati dati gestiti perché il runtime gestisce le attività
relative ai dati, ad esempio l'allocazione e il reclamo della memoria e l'esecuzione del controllo del tipo. Per
impostazione predefinita, Visual Basic .NET usa codice gestito e dati, ma è possibile accedere al codice non
gestito e ai dati degli oggetti COM usando gli assembly di interoperabilità, descritti più avanti in questa pagina.

Assembly
Un assembly è il blocco predefinito principale di un'applicazione .NET Framework. Si tratta di una raccolta di
funzionalità compilata, con versione e distribuita come singola unità di implementazione contenente uno o più
file. Ogni assembly contiene un manifesto dell'assembly.

Librerie dei tipi e manifesti di assembly


Le librerie dei tipi descrivono le caratteristiche degli oggetti COM, ad esempio i nomi dei membri e i tipi di dati. I
manifesti dell'assembly eseguono la stessa funzione per .NET Framework applicazioni. Sono incluse
informazioni sugli elementi seguenti:
Identità assembly, versione, impostazioni cultura e firma digitale.
File che costituiscono l'implementazione dell'assembly.
Tipi e risorse che costituiscono l'assembly. Sono inclusi quelli che vengono esportati da esso.
Dipendenze in fase di compilazione da altri assembly.
Autorizzazioni necessarie per l'esecuzione corretta dell'assembly.
Per ulteriori informazioni sugli assembly e sui manifesti dell'assembly, vedere assembly in .NET.
Importazione ed esportazione di librerie di tipi
Visual Studio contiene un'utilità, Tlbimp, che consente di importare informazioni da una libreria dei tipi in
un'applicazione .NET Framework. È possibile generare librerie dei tipi dagli assembly tramite l'utilità Tlbexp.
Per informazioni su Tlbimp e Tlbexp, vedere Tlbimp.exe (utilità di importazione della libreria dei tipi) e Tlbexp.exe
(utilità di esportazione della libreria dei tipi).

Assembly di interoperabilità
Gli assembly di interoperabilità sono .NET Framework assembly che eseguono il Bridge tra codice gestito e non
gestito, eseguendo il mapping dei membri di oggetti COM a membri gestiti .NET Framework equivalenti. Gli
assembly di interoperabilità creati da Visual Basic .NET gestiscono molti dei dettagli relativi all'utilizzo di oggetti
COM, ad esempio il marshalling di interoperabilità.

Marshalling di interoperabilità
Tutte le applicazioni .NET Framework condividono un set di tipi comuni che consentono l'interoperabilità degli
oggetti, indipendentemente dal linguaggio di programmazione usato. I parametri e i valori restituiti degli oggetti
COM utilizzano talvolta tipi di dati diversi da quelli utilizzati nel codice gestito. Il marshalling di interoperabilità è
il processo di creazione di pacchetti di parametri e valori restituiti in tipi di dati equivalenti durante il passaggio
da e verso oggetti com. Per ulteriori informazioni, vedere marshalling di interoperabilità.

Vedi anche
Interoperabilità COM
Procedura dettagliata: Implementazione dell'ereditarietà con gli oggetti COM
Interoperabilità con codice non gestito
Risoluzione dei problemi relativi all'interoperabilità
Assembly in .NET
Tlbimp.exe (utilità di importazione della libreria dei tipi)
Tlbexp.exe (utilità di esportazione della libreria dei tipi)
Marshalling di interoperabilità
Interoperabilità COM senza registrazione
Procedura: fare riferimento a oggetti COM da
Visual Basic
05/03/2021 • 4 minutes to read • Edit Online

In Visual Basic l'aggiunta di riferimenti a oggetti COM con librerie dei tipi richiede la creazione di un assembly di
interoperabilità per la libreria COM. I riferimenti ai membri dell'oggetto COM vengono instradati all'assembly di
interoperabilità e quindi inoltrati all'oggetto COM effettivo. Le risposte dall'oggetto COM vengono instradate
all'assembly di interoperabilità e inoltrate all'applicazione .NET Framework.
È possibile fare riferimento a un oggetto COM senza utilizzare un assembly di interoperabilità incorporando le
informazioni sul tipo per l'oggetto COM in un assembly .NET. Per incorporare le informazioni sul tipo, impostare
la Embed Interop Types proprietà su True per il riferimento all'oggetto com. Se si esegue la compilazione
utilizzando il compilatore da riga di comando, utilizzare l' /link opzione per fare riferimento alla libreria com.
Per ulteriori informazioni, vedere -link (Visual Basic).
Visual Basic crea automaticamente assembly di interoperabilità quando si aggiunge un riferimento a una libreria
dei tipi dall'Integrated Development Environment (IDE). Quando si utilizza la riga di comando, è possibile
utilizzare l'utilità Tlbimp per creare manualmente assembly di interoperabilità.
Per aggiungere riferimenti a oggetti COM
1. Scegliere Aggiungi riferimento dal menu progetto , quindi fare clic sulla scheda com nella finestra di
dialogo.
2. Consente di selezionare il componente che si desidera utilizzare dall'elenco di oggetti COM.
3. Per semplificare l'accesso all'assembly di interoperabilità, aggiungere un' Imports istruzione all'inizio
della classe o del modulo in cui si utilizzerà l'oggetto com. Ad esempio, nell'esempio di codice seguente
viene importato lo spazio dei nomi INKEDLib per gli oggetti a cui si fa riferimento nella
Microsoft InkEdit Control 1.0 libreria.

Imports INKEDLib

Class Sample
Private s As IInkCursor

End Class

Per creare un assembly di interoperabilità tramite Tlbimp


1. Aggiungere il percorso di Tlbimp al percorso di ricerca, se non è già incluso nel percorso di ricerca e non
si è attualmente nella directory in cui si trova.
2. Chiamare Tlbimp da un prompt dei comandi, fornendo le informazioni seguenti:
Nome e percorso della DLL contenente la libreria dei tipi
Nome e percorso dello spazio dei nomi in cui devono essere inserite le informazioni
Nome e percorso dell'assembly di interoperabilità di destinazione
Nel codice seguente ne viene illustrato un esempio:
Tlbimp test3.dll /out:NameSpace1 /out:Interop1.dll

È possibile utilizzare Tlbimp per creare assembly di interoperabilità per le librerie dei tipi, anche per gli
oggetti COM non registrati. Tuttavia, gli oggetti COM a cui fanno riferimento gli assembly di
interoperabilità devono essere registrati correttamente nel computer in cui devono essere utilizzati. È
possibile registrare un oggetto COM utilizzando l'utilità Regsvr32 inclusa nel sistema operativo Windows.

Vedi anche
Interoperabilità COM
Tlbimp.exe (utilità di importazione della libreria dei tipi)
Tlbexp.exe (utilità di esportazione della libreria dei tipi)
Procedura dettagliata: Implementazione dell'ereditarietà con gli oggetti COM
Risoluzione dei problemi relativi all'interoperabilità
Istruzione Imports (tipo e spazio dei nomi .NET)
Procedura: utilizzare i controlli ActiveX (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

I controlli ActiveX sono componenti COM o oggetti che è possibile inserire in una pagina Web o in un'altra
applicazione per riutilizzare le funzionalità in pacchetto che un altro utente ha programmato. È possibile usare i
controlli ActiveX sviluppati per Visual Basic 6,0 e versioni precedenti per aggiungere funzionalità alla casella
degli strumenti di Visual Studio.
Per aggiungere controlli ActiveX alla casella degli strumenti
1. Scegliere Scegli elementi della Casella degli strumenti dal menu Strumenti .
Verrà visualizzata la finestra di dialogo Scegli casella degli strumenti .
2. Fare clic sulla scheda componenti com .
3. Selezionare la casella di controllo accanto al controllo ActiveX che si desidera utilizzare e quindi fare clic
su OK .
Il nuovo controllo viene visualizzato con gli altri strumenti della casella degli strumenti.

NOTE
È possibile usare l'utilità AxImp per creare manualmente un assembly di interoperabilità per i controlli ActiveX. Per
ulteriori informazioni, vedere Aximp.exe (Windows Form utilità di importazione di controlli ActiveX).

Vedi anche
Interoperabilità COM
Procedura: aggiungere i controlli ActiveX a Windows Form
Aximp.exe (Windows Form utilità di importazione del controllo ActiveX)
Considerazioni sull'inserimento di controlli ActiveX in Windows Form
Risoluzione dei problemi relativi all'interoperabilità
Procedura dettagliata: chiamata delle API di
Windows (Visual Basic)
05/03/2021 • 17 minutes to read • Edit Online

Le API di Windows sono librerie a collegamento dinamico (dll) che fanno parte del sistema operativo Windows.
Vengono usati per eseguire attività quando è difficile scrivere procedure equivalenti personalizzate. Windows, ad
esempio, fornisce una funzione denominata FlashWindowEx che consente di fare in modo che la barra del titolo
di un'applicazione venga alternata tra le tonalità chiaro e scuro.
Il vantaggio di usare le API di Windows nel codice è che consentono di risparmiare tempo di sviluppo perché
contengono dozzine di funzioni utili già scritte e in attesa di essere usate. Lo svantaggio è che le API di Windows
possono essere difficili da utilizzare e non perdonare quando si verificano problemi.
Le API di Windows rappresentano una categoria speciale di interoperabilità. Le API Windows non utilizzano
codice gestito, non dispongono di librerie dei tipi predefinite e utilizzano tipi di dati diversi da quelli utilizzati con
Visual Studio. A causa di queste differenze, e poiché le API di Windows non sono oggetti COM, l'interoperabilità
con le API Windows e la .NET Framework viene eseguita utilizzando platform invoke o PInvoke. Platform Invoke
è un servizio che consente al codice gestito di chiamare funzioni non gestite implementate in dll. Per ulteriori
informazioni, vedere utilizzo di funzioni dll non gestite. È possibile utilizzare PInvoke in Visual Basic utilizzando l'
Declare istruzione o applicando l' DllImport attributo a una routine vuota.

Le chiamate all'API di Windows rappresentano una parte importante della programmazione Visual Basic in
passato, ma sono raramente necessarie con Visual Basic .NET. Quando possibile, è consigliabile usare codice
gestito dal .NET Framework per eseguire attività, anziché chiamate API Windows. In questa procedura dettagliata
vengono fornite informazioni sulle situazioni in cui è necessario utilizzare le API di Windows.

NOTE
Nomi o percorsi visualizzati per alcuni elementi dell'interfaccia utente di Visual Studio nelle istruzioni seguenti potrebbero
essere diversi nel computer in uso. La versione di Visual Studio in uso e le impostazioni configurate determinano questi
elementi. Per altre informazioni, vedere Personalizzazione dell'IDE.

Chiamate API con DECLARE


Il modo più comune per chiamare le API Windows consiste nell'utilizzare l' Declare istruzione.
Per dichiarare una procedura DLL
1. Determinare il nome della funzione che si desidera chiamare, più gli argomenti, i tipi di argomento e il
valore restituito, nonché il nome e il percorso della DLL che lo contiene.

NOTE
Per informazioni complete sulle API Windows, vedere la documentazione di Win32 SDK nell'API Windows di
Platform SDK. Per ulteriori informazioni sulle costanti utilizzate dalle API di Windows, esaminare i file di intestazione
come Windows. h inclusi in Platform SDK.

2. Aprire un nuovo progetto di applicazione Windows scegliendo nuovo dal menu file , quindi fare clic su
progetto . Verrà visualizzata la finestra di dialogo Nuovo progetto .
3. Selezionare applicazione Windows dall'elenco dei modelli di progetto Visual Basic. Verrà visualizzato il
nuovo progetto.
4. Aggiungere la Declare funzione seguente alla classe o al modulo in cui si vuole usare la dll:

Declare Auto Function MBox Lib "user32.dll" Alias "MessageBox" (


ByVal hWnd As Integer,
ByVal txt As String,
ByVal caption As String,
ByVal Typ As Integer) As Integer

Parti dell'istruzione Declare


L' Declare istruzione include gli elementi seguenti.
Modificatore automatico
Il Auto modificatore indica al runtime di convertire la stringa in base al nome del metodo in base alle regole
Common Language Runtime (o al nome alias, se specificato).
Parole chiave lib e alias
Il nome che segue la Function parola chiave è il nome usato dal programma per accedere alla funzione
importata. Può corrispondere al nome reale della funzione che si sta chiamando oppure è possibile utilizzare
qualsiasi nome di routine valido e quindi utilizzare la Alias parola chiave per specificare il nome reale della
funzione che si sta chiamando.
Specificare la Lib parola chiave, seguita dal nome e dal percorso della dll che contiene la funzione che si sta
chiamando. Non è necessario specificare il percorso per i file presenti nelle directory di sistema di Windows.
Usare la Alias parola chiave se il nome della funzione che si sta chiamando non è un nome di stored
procedure Visual Basic valido o è in conflitto con il nome di altri elementi nell'applicazione. Alias indica il
nome true della funzione chiamata.
Dichiarazioni di argomenti e tipi di dati
Dichiarare gli argomenti e i relativi tipi di dati. Questa parte può essere complessa perché i tipi di dati usati da
Windows non corrispondono ai tipi di dati di Visual Studio. Visual Basic esegue una grande parte del lavoro
convertendo gli argomenti in tipi di dati compatibili, un processo denominato marshalling. È possibile
controllare in modo esplicito il modo in cui viene eseguito il marshalling degli argomenti utilizzando l'
MarshalAsAttribute attributo definito nello System.Runtime.InteropServices spazio dei nomi.

NOTE
Le versioni precedenti di Visual Basic consentivano di dichiarare parametri As Any , vale a dire che potevano essere
utilizzati dati di qualsiasi tipo di dati. Visual Basic richiede l'utilizzo di un tipo di dati specifico per tutte le Declare
istruzioni.

Costanti API Windows


Alcuni argomenti sono combinazioni di costanti. Ad esempio, l' MessageBox API mostrata in questa procedura
dettagliata accetta un argomento integer denominato Typ che controlla la modalità di visualizzazione della
finestra di messaggio. È possibile determinare il valore numerico di queste costanti esaminando le #define
istruzioni nel file WinUser. h. I valori numerici sono in genere visualizzati in formato esadecimale, quindi è
consigliabile usare un calcolatore per aggiungerli e convertirli in decimali. Se, ad esempio, si desidera combinare
le costanti per il punto esclamativo MB_ICONEXCLAMATION 0x00000030 e il 0x00000004 di stile Yes/No MB_YESNO ,
è possibile aggiungere i numeri e ottenere un risultato di 0x00000034 o 52 Decimal. Sebbene sia possibile
usare direttamente il risultato Decimal, è preferibile dichiarare questi valori come costanti nell'applicazione e
combinarli usando l' Or operatore.
P e r d i c h i a r a r e c o st a n t i p e r l e c h i a m a t e A P I W i n d o w s
1. Consultare la documentazione per la funzione di Windows che si sta chiamando. Determinare il nome
delle costanti utilizzate e il nome del file con estensione h che contiene i valori numerici per queste
costanti.
2. Utilizzare un editor di testo, ad esempio Blocco note, per visualizzare il contenuto del file di intestazione (.
h) e individuare i valori associati alle costanti utilizzate. Ad esempio, l' MessageBox API usa la costante
MB_ICONQUESTION per visualizzare un punto interrogativo nella finestra di messaggio. La definizione di
MB_ICONQUESTION si trova in winuser. h e viene visualizzata come segue:

#define MB_ICONQUESTION 0x00000020L

3. Aggiungere istruzioni equivalenti Const alla classe o al modulo per rendere queste costanti disponibili
per l'applicazione. Ad esempio:

Const MB_ICONQUESTION As Integer = &H20


Const MB_YESNO As Integer = &H4
Const IDYES As Integer = 6
Const IDNO As Integer = 7

P e r c h i a ma re l a p ro c e d u ra DL L

1. Aggiungere un pulsante denominato Button1 al modulo di avvio per il progetto, quindi fare doppio clic
su di esso per visualizzarne il codice. Viene visualizzato il gestore eventi per il pulsante.
2. Aggiungere il codice al Click gestore eventi per il pulsante aggiunto, per chiamare la procedura e
fornire gli argomenti appropriati:

Private Sub Button1_Click(ByVal sender As System.Object,


ByVal e As System.EventArgs) Handles Button1.Click

' Stores the return value.


Dim RetVal As Integer
RetVal = MBox(0, "Declare DLL Test", "Windows API MessageBox",
MB_ICONQUESTION Or MB_YESNO)

' Check the return value.


If RetVal = IDYES Then
MsgBox("You chose Yes")
Else
MsgBox("You chose No")
End If
End Sub

3. Eseguire il progetto premendo F5. La finestra di messaggio viene visualizzata con i pulsanti Sì e
Nessuna risposta. Fare clic su una delle due.
Marshalling dei dati
Visual Basic converte automaticamente i tipi di dati dei parametri e i valori restituiti per le chiamate API
Windows, ma è possibile usare l' MarshalAs attributo per specificare in modo esplicito i tipi di dati non gestiti
previsti da un'API. Per ulteriori informazioni sul marshalling di interoperabilità, vedere marshalling di
interoperabilità.
P e r u sa r e D E C L A R E e m a r sh a l l i n g i n u n a c h i a m a t a A P I

1. Determinare il nome della funzione che si desidera chiamare, più gli argomenti, i tipi di dati e il valore
restituito.
2. Per semplificare l'accesso all' MarshalAs attributo, aggiungere un' Imports istruzione all'inizio del codice
per la classe o il modulo, come nell'esempio seguente:
Imports System.Runtime.InteropServices

3. Aggiungere un prototipo di funzione per la funzione importata alla classe o al modulo in uso e applicare
l' MarshalAs attributo ai parametri o al valore restituito. Nell'esempio seguente viene effettuato il
marshalling di una chiamata API che prevede il tipo void* AsAny :

Declare Sub SetData Lib "..\LIB\UnmgdLib.dll" (


ByVal x As Short,
<MarshalAsAttribute(UnmanagedType.AsAny)>
ByVal o As Object)

Chiamate API con DllImport


L' DllImport attributo fornisce un secondo modo per chiamare le funzioni nelle DLL senza librerie dei tipi.
DllImport è approssimativamente equivalente all'uso di un' Declare istruzione, ma offre un maggiore
controllo sulla modalità di chiamata delle funzioni.
È possibile utilizzare DllImport con la maggior parte delle chiamate API Windows purché la chiamata faccia
riferimento a un metodo condiviso (talvolta chiamato statico). Non è possibile usare metodi che richiedono
un'istanza di una classe. Diversamente dalle Declare istruzioni, DllImport le chiamate non possono utilizzare l'
MarshalAs attributo.

Per chiamare un'API Windows utilizzando l'attributo DllImport


1. Aprire un nuovo progetto di applicazione Windows scegliendo nuovo dal menu file , quindi fare clic su
progetto . Verrà visualizzata la finestra di dialogo Nuovo progetto .
2. Selezionare applicazione Windows dall'elenco dei modelli di progetto Visual Basic. Verrà visualizzato il
nuovo progetto.
3. Aggiungere un pulsante denominato Button2 al modulo di avvio.
4. Fare doppio clic Button2 per aprire la visualizzazione codice per il form.
5. Per semplificare l'accesso a DllImport , aggiungere un' Imports istruzione all'inizio del codice per la
classe del form di avvio:

Imports System.Runtime.InteropServices

6. Dichiarare una funzione vuota che precede l' End Class istruzione per il form e assegnare un nome alla
funzione MoveFile .
7. Applicare i Public Shared modificatori e alla dichiarazione di funzione e impostare i parametri per
MoveFile in base agli argomenti utilizzati dalla funzione API di Windows:

Public Shared Function MoveFile(


ByVal src As String,
ByVal dst As String) As Boolean
' Leave the body of the function empty.
End Function

La funzione può avere qualsiasi nome di routine valido; l' DllImport attributo specifica il nome nella dll.
Gestisce anche il marshalling di interoperabilità per i parametri e i valori restituiti, quindi è possibile
scegliere i tipi di dati di Visual Studio simili ai tipi di dati usati dall'API.
8. Applicare l' DllImport attributo alla funzione vuota. Il primo parametro è il nome e il percorso della DLL
che contiene la funzione che si sta chiamando. Non è necessario specificare il percorso per i file presenti
nelle directory di sistema di Windows. Il secondo parametro è un argomento denominato che specifica il
nome della funzione nell'API Windows. In questo esempio, l' DllImport attributo impone che le chiamate
a MoveFile vengano trasmesse a MoveFileW in KERNEL32.DLL. Il MoveFileW metodo copia un file dal
percorso src al percorso dst .

<DllImport("KERNEL32.DLL", EntryPoint:="MoveFileW", SetLastError:=True,


CharSet:=CharSet.Unicode, ExactSpelling:=True,
CallingConvention:=CallingConvention.StdCall)>
Public Shared Function MoveFile(
ByVal src As String,
ByVal dst As String) As Boolean
' Leave the body of the function empty.
End Function

9. Aggiungere il codice al Button2_Click gestore eventi per chiamare la funzione:

Private Sub Button2_Click(ByVal sender As System.Object,


ByVal e As System.EventArgs) Handles Button2.Click

Dim RetVal As Boolean = MoveFile("c:\tmp\Test.txt", "c:\Test.txt")


If RetVal = True Then
MsgBox("The file was moved successfully.")
Else
MsgBox("The file could not be moved.")
End If
End Sub

10. Creare un file denominato Test.txt e inserirlo nella directory C:\Tmp sul disco rigido. Se necessario, creare
la directory tmp.
11. Premere F5 per avviare l’applicazione. Viene visualizzato il form principale.
12. Fare clic su Button2 . Il messaggio "il file è stato spostato correttamente" viene visualizzato se il file può
essere spostato.

Vedi anche
DllImportAttribute
MarshalAsAttribute
Declare Statement
Auto
Alias
Interoperabilità COM
Creazione di prototipi nel codice gestito
Marshalling di un delegato come metodo di callback
Procedura: chiamare API di Windows (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

In questo esempio viene definita e chiamata la MessageBox funzione in user32.dll, quindi viene passata una
stringa.

Esempio
' Defines the MessageBox function.
Public Class Win32
Declare Auto Function MessageBox Lib "user32.dll" (
ByVal hWnd As Integer, ByVal txt As String,
ByVal caption As String, ByVal Type As Integer
) As Integer
End Class

' Calls the MessageBox function.


Public Class DemoMessageBox
Public Shared Sub Main()
Win32.MessageBox(0, "Here's a MessageBox", "Platform Invoke Sample", 0)
End Sub
End Class

Compilare il codice
L'esempio presenta i requisiti seguenti:
Un riferimento allo spazio dei nomi System.

Programmazione efficiente
Le seguenti condizioni possono generare un'eccezione:
Il metodo non è statico, è astratto oppure è stato definito in precedenza. Il tipo padre è un'interfaccia
oppure la lunghezza del nome o dllname è zero. (ArgumentException)
Il nome o dllname è Nothing . (ArgumentNullException)
Il tipo contenitore è stato creato in precedenza con CreateType . (InvalidOperationException)

Vedi anche
Informazioni dettagliate su platform invoke
Esempi di platform invoke
Utilizzo di funzioni di DLL non gestite
Definizione di un metodo tramite reflection emit
Procedura dettagliata: Chiamata delle API di Windows
Interoperabilità COM
Procedura: chiamare una funzione Windows che
accetta tipi senza segno (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Se si utilizza una classe, un modulo o una struttura con membri di tipi di Unsigned Integer, è possibile accedere a
questi membri con Visual Basic.

Per chiamare una funzione Windows che accetta un tipo senza segno
1. Utilizzare un' istruzione Declare per indicare Visual Basic quale libreria include la funzione, il nome della
libreria, il tipo di sequenza chiamante e come convertire le stringhe quando viene chiamato.
2. Nell' Declare istruzione usare,, UInteger ULong UShort o Byte come appropriato per ogni parametro
con un tipo senza segno.
3. Consultare la documentazione per la funzione di Windows che si sta chiamando per trovare i nomi e i
valori delle costanti che usa. Molti di questi vengono definiti nel file WinUser. h.
4. Dichiarare le costanti necessarie nel codice. Molte costanti di Windows sono valori senza segno a 32 bit
ed è necessario dichiararle As UInteger .
5. Chiamare la funzione in modo normale. Nell'esempio seguente viene chiamata la funzione di Windows
MessageBox , che accetta un argomento Unsigned Integer.

Public Class windowsMessage


Private Declare Auto Function mb Lib "user32.dll" Alias "MessageBox" (
ByVal hWnd As Integer,
ByVal lpText As String,
ByVal lpCaption As String,
ByVal uType As UInteger) As Integer
Private Const MB_OK As UInteger = 0
Private Const MB_ICONEXCLAMATION As UInteger = &H30
Private Const IDOK As UInteger = 1
Private Const IDCLOSE As UInteger = 8
Private Const c As UInteger = MB_OK Or MB_ICONEXCLAMATION
Public Function messageThroughWindows() As String
Dim r As Integer = mb(0, "Click OK if you see this!",
"Windows API call", c)
Dim s As String = "Windows API MessageBox returned " &
CStr(r)& vbCrLf & "(IDOK = " & CStr(IDOK) &
", IDCLOSE = " & CStr(IDCLOSE) & ")"
Return s
End Function
End Class

È possibile testare la funzione messageThroughWindows con il codice seguente.

Public Sub consumeWindowsMessage()


Dim w As New windowsMessage
w.messageThroughWindows()
End Sub

Cau t i on

I UInteger ULong UShort SByte tipi di dati,, e non fanno parte dell' indipendenza del linguaggio e di
Language-Independent Components (CLS), pertanto il codice conforme a CLS non può utilizzare un
componente che li utilizza.

IMPORTANT
Effettuando una chiamata a codice non gestito, ad esempio Windows Application Programming Interface (API), il
codice viene esposto a potenziali rischi per la sicurezza.

IMPORTANT
Per chiamare l'API Windows è necessaria l'autorizzazione per il codice non gestito, che può influire sulla sua
esecuzione in situazioni di attendibilità parziale. Per ulteriori informazioni, vedere SecurityPermission e
autorizzazioni di accesso al codice.

Vedi anche
Tipi di dati
Tipo di dati Integer
Tipo di dati UInteger
Declare Statement
Procedura dettagliata: Chiamata delle API di Windows
Procedura dettagliata: creazione di oggetti COM
con Visual Basic
05/03/2021 • 7 minutes to read • Edit Online

Quando si creano nuovi componenti o applicazioni, è consigliabile creare .NET Framework assembly. Tuttavia,
Visual Basic facilita anche l'esposizione di un componente .NET Framework a COM. In questo modo è possibile
fornire nuovi componenti per i gruppi di applicazioni precedenti che richiedono componenti COM. In questa
procedura dettagliata viene illustrato come utilizzare Visual Basic per esporre .NET Framework oggetti come
oggetti COM, sia con sia senza il modello di classe COM.
Il modo più semplice per esporre oggetti COM consiste nell'usare il modello di classe COM. Questo modello
crea una nuova classe, quindi configura il progetto per generare la classe con un livello di interoperabilità come
oggetto COM e la registra con il sistema operativo.

NOTE
Sebbene sia anche possibile esporre una classe creata in Visual Basic come oggetto COM per il codice non gestito da
usare, non è un vero oggetto COM e non può essere usata da Visual Basic. Per ulteriori informazioni, vedere
interoperabilità com nelle applicazioni .NET Framework.

NOTE
Nomi o percorsi visualizzati per alcuni elementi dell'interfaccia utente di Visual Studio nelle istruzioni seguenti potrebbero
essere diversi nel computer in uso. La versione di Visual Studio in uso e le impostazioni configurate determinano questi
elementi. Per altre informazioni, vedere Personalizzazione dell'IDE.

Per creare un oggetto COM utilizzando il modello di classe COM


1. Aprire un nuovo progetto di applicazione Windows dal menu file facendo clic su nuovo progetto .
2. Nella finestra di dialogo nuovo progetto , sotto il campo Tipi progetto , verificare che sia selezionata
l'opzione Windows. Selezionare libreria di classi dall'elenco modelli , quindi fare clic su OK . Verrà
visualizzato il nuovo progetto.
3. Scegliere Aggiungi nuovo elemento dal menu progetto . La finestra di dialogo Aggiungi nuovo
elemento viene visualizzata.
4. Selezionare classe com dall'elenco modelli , quindi fare clic su Aggiungi . Visual Basic aggiunge una
nuova classe e configura il nuovo progetto per l'interoperabilità COM.
5. Aggiungere codice come proprietà, metodi ed eventi alla classe COM.
6. Scegliere Compila ClassLibrar y1 dal menu Compila . Visual Basic compila l'assembly e registra
l'oggetto COM con il sistema operativo.

Creazione di oggetti COM senza il modello di classe COM


È inoltre possibile creare manualmente una classe COM anziché utilizzare il modello di classe COM. Questa
procedura è utile quando si utilizza la riga di comando o quando si desidera un maggiore controllo sulla
modalità di definizione degli oggetti COM.
Per configurare il progetto per generare un oggetto COM
1. Aprire un nuovo progetto di applicazione Windows dal menu file facendo clic su NewProject .
2. Nella finestra di dialogo nuovo progetto , sotto il campo Tipi progetto , verificare che sia selezionata
l'opzione Windows. Selezionare libreria di classi dall'elenco modelli , quindi fare clic su OK . Verrà
visualizzato il nuovo progetto.
3. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e scegliere Proprietà . Verrà
visualizzato Progettazione progetti .
4. Fare clic sulla scheda Compila .
5. Selezionare la casella di controllo registra per interoperabilità COM .
Per configurare il codice nella classe per creare un oggetto COM
1. In Esplora soluzioni fare doppio clic su Class1. vb per visualizzarne il codice.
2. Rinominare la classe in ComClass1 .
3. Aggiungere le costanti seguenti a ComClass1 . Verranno archiviate le costanti identificatore univoco
globale (GUID) che devono essere presenti negli oggetti COM.

Public Const ClassId As String = ""


Public Const InterfaceId As String = ""
Public Const EventsId As String = ""

4. Scegliere Crea GUID dal menu Strumenti . Nella finestra di dialogo Crea GUID fare clic su Formato
del Registro di sistema e quindi fare clic su Copia . Fare clic su Esci .
5. Sostituire la stringa vuota per ClassId con il GUID, rimuovendo le parentesi graffe iniziali e finali. Se, ad
esempio, il GUID fornito da GUIDGEN è "{2C8B0AEE-02C9-486e-B809-C780A11530FE}" , il codice dovrebbe
essere simile al seguente.

Public Const ClassId As String = "2C8B0AEE-02C9-486e-B809-C780A11530FE"

6. Ripetere i passaggi precedenti per le InterfaceId EventsId costanti e, come nell'esempio seguente.

Public Const InterfaceId As String = "3D8B5BA4-FB8C-5ff8-8468-11BF6BD5CF91"


Public Const EventsId As String = "2B691787-6ED7-401e-90A4-B3B9C0360E31"

NOTE
Verificare che i GUID siano nuovi e univoci. in caso contrario, il componente COM potrebbe essere in conflitto con
altri componenti COM.

7. Aggiungere l' ComClass attributo a ComClass1 , specificando i GUID per l'ID di classe, l'ID di interfaccia e
l'ID degli eventi come nell'esempio seguente:

<ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)>


Public Class ComClass1

8. Le classi COM devono avere un Public Sub New() costruttore senza parametri o la classe non sarà
registrata correttamente. Aggiungere un costruttore senza parametri alla classe:
Public Sub New()
MyBase.New()
End Sub

9. Aggiungere proprietà, metodi ed eventi alla classe, terminando con un' End Class istruzione. Scegliere
Compila soluzione dal menu Compila . Visual Basic compila l'assembly e registra l'oggetto COM con il
sistema operativo.

NOTE
Gli oggetti COM generati con Visual Basic non possono essere utilizzati da altre applicazioni Visual Basic perché
non sono veri oggetti COM. I tentativi di aggiungere riferimenti a tali oggetti COM genereranno un errore. Per
informazioni dettagliate, vedere interoperabilità com nelle applicazioni .NET Framework.

Vedi anche
ComClassAttribute
Interoperabilità COM
Procedura dettagliata: Implementazione dell'ereditarietà con gli oggetti COM
#Region (direttiva)
Interoperabilità COM nelle applicazioni .NET Framework
Risoluzione dei problemi relativi all'interoperabilità
Risoluzione dei problemi relativi all'interoperabilità
(Visual Basic)
05/03/2021 • 18 minutes to read • Edit Online

Quando si interagisce tra COM e il codice gestito del .NET Framework, è possibile che si verifichino uno o più dei
seguenti problemi comuni.

Marshalling di interoperabilità
In alcuni casi, potrebbe essere necessario utilizzare tipi di dati che non fanno parte del .NET Framework. Gli
assembly di interoperabilità gestiscono la maggior parte del lavoro per gli oggetti COM, ma potrebbe essere
necessario controllare i tipi di dati utilizzati quando gli oggetti gestiti vengono esposti a COM. Ad esempio, le
strutture nelle librerie di classi devono specificare il BStr tipo non gestito sulle stringhe inviate a oggetti COM
creati da Visual Basic 6,0 e versioni precedenti. In questi casi, è possibile usare l'attributo per fare in modo che i
MarshalAsAttribute tipi gestiti vengano esposti come tipi non gestiti.

Esportazione di stringhe di Fixed-Length in codice non gestito


In Visual Basic 6,0 e versioni precedenti, le stringhe vengono esportate in oggetti COM come sequenze di byte
senza un carattere di terminazione null. Per la compatibilità con altri linguaggi, Visual Basic .NET include un
carattere di terminazione durante l'esportazione delle stringhe. Il modo migliore per risolvere questa
incompatibilità consiste nell'esportare stringhe che non dispongono del carattere di terminazione come matrici
di Byte o Char .

Esportazione di gerarchie di ereditarietà


Le gerarchie di classi gestite vengono appiattite quando vengono esposte come oggetti COM. Se, ad esempio, si
definisce una classe base con un membro e quindi si eredita la classe di base in una classe derivata esposta
come oggetto COM, i client che utilizzano la classe derivata nell'oggetto COM non saranno in grado di utilizzare
i membri ereditati. È possibile accedere ai membri della classe di base dagli oggetti COM solo come istanze di
una classe di base e quindi solo se la classe di base viene creata anche come oggetto COM.

Metodi di overload
Sebbene sia possibile creare metodi di overload con Visual Basic, non sono supportati da COM. Quando una
classe che contiene metodi di overload viene esposta come oggetto COM, vengono generati nuovi nomi di
metodo per i metodi di overload.
Si consideri, ad esempio, una classe che dispone di due overload del Synch metodo. Quando la classe viene
esposta come oggetto COM, i nuovi nomi di metodo generati potrebbero essere Synch e Synch_2 .
La ridenominazione può causare due problemi per i consumer dell'oggetto COM.
1. I client potrebbero non prevedere i nomi dei metodi generati.
2. I nomi dei metodi generati nella classe esposti come oggetto COM possono essere modificati quando
vengono aggiunti nuovi overload alla classe o alla relativa classe di base. Questo può causare problemi di
controllo delle versioni.
Per risolvere entrambi i problemi, assegnare a ogni metodo un nome univoco, anziché usare l'overload, quando
si sviluppano oggetti che verranno esposti come oggetti COM.

Utilizzo di oggetti COM tramite assembly di interoperabilità


Gli assembly di interoperabilità vengono usati quasi come se fossero sostituzioni di codice gestito per gli oggetti
COM che rappresentano. Tuttavia, poiché si tratta di wrapper e non di oggetti COM effettivi, esistono alcune
differenze tra l'utilizzo degli assembly di interoperabilità e degli assembly standard. Queste aree di differenza
includono l'esposizione delle classi e i tipi di dati per i parametri e i valori restituiti.

Classi esposte come interfacce e classi


A differenza delle classi negli assembly standard, le classi COM vengono esposte negli assembly di
interoperabilità sia come interfaccia sia come classe che rappresenta la classe COM. Il nome dell'interfaccia è
identico a quello della classe COM. Il nome della classe di interoperabilità è identico a quello della classe COM
originale, ma con la parola "class" accodata. Si supponga, ad esempio, di disporre di un progetto con un
riferimento a un assembly di interoperabilità per un oggetto COM. Se la classe COM è denominata MyComClass ,
IntelliSense e il Visualizzatore oggetti mostrano un'interfaccia denominata MyComClass e una classe denominata
MyComClassClass .

Creazione di istanze di una classe .NET Framework


In genere, si crea un'istanza di una classe .NET Framework usando l' New istruzione con un nome di classe. La
presenza di una classe COM rappresentata da un assembly di interoperabilità è un caso in cui è possibile
utilizzare l' New istruzione con un'interfaccia. A meno che non si usi la classe COM con un' Inherits istruzione,
è possibile usare l'interfaccia esattamente come si farebbe con una classe. Il codice seguente illustra come creare
un Command oggetto in un progetto che contiene un riferimento all'oggetto com della libreria Microsoft ActiveX
Data Objects 2,8:

Dim cmd As New ADODB.Command

Tuttavia, se si utilizza la classe COM come base per una classe derivata, è necessario utilizzare la classe di
interoperabilità che rappresenta la classe COM, come nel codice seguente:

Class DerivedCommand
Inherits ADODB.CommandClass
End Class

NOTE
Gli assembly di interoperabilità implementano in modo implicito interfacce che rappresentano classi COM. Non provare a
usare l' Implements istruzione per implementare queste interfacce o verrà generato un errore.

Tipi di dati per parametri e valori restituiti


A differenza dei membri degli assembly standard, i membri dell'assembly di interoperabilità possono avere tipi
di dati diversi da quelli usati nella dichiarazione dell'oggetto originale. Sebbene gli assembly di interoperabilità
convertano in modo implicito i tipi COM in tipi di Common Language Runtime compatibili, è necessario
prestare attenzione ai tipi di dati utilizzati da entrambi i lati per evitare errori di Runtime. Ad esempio, negli
oggetti COM creati in Visual Basic 6,0 e versioni precedenti, i valori di tipo Integer presuppongono il tipo
equivalente .NET Framework, Short . È consigliabile usare il Visualizzatore oggetti per esaminare le
caratteristiche dei membri importati prima di usarli.
Metodi COM a livello di modulo
La maggior parte degli oggetti COM viene utilizzata creando un'istanza di una classe COM utilizzando la New
parola chiave e chiamando quindi i metodi dell'oggetto. Un'eccezione a questa regola riguarda gli oggetti COM
che AppObj contengono GlobalMultiUse classi com o. Tali classi sono simili ai metodi a livello di modulo in
Visual Basic le classi .NET. Visual Basic 6,0 e versioni precedenti creano in modo implicito istanze di tali oggetti
per la prima volta che si chiama uno dei relativi metodi. Ad esempio, in Visual Basic 6,0 è possibile aggiungere
un riferimento alla libreria di oggetti Microsoft DAO 3,6 e chiamare il DBEngine metodo senza prima creare
un'istanza:

Dim db As DAO.Database
' Open the database.
Set db = DBEngine.OpenDatabase("C:\nwind.mdb")
' Use the database object.

Visual Basic .NET richiede di creare sempre istanze di oggetti COM prima di poter usare i relativi metodi. Per
usare questi metodi in Visual Basic, dichiarare una variabile della classe desiderata e usare la parola chiave New
per assegnare l'oggetto alla variabile oggetto. La Shared parola chiave può essere utilizzata quando si desidera
assicurarsi che venga creata una sola istanza della classe.

' Class level variable.


Shared DBEngine As New DAO.DBEngine

Sub DAOOpenRecordset()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim fld As DAO.Field
' Open the database.
db = DBEngine.OpenDatabase("C:\nwind.mdb")

' Open the Recordset.


rst = db.OpenRecordset(
"SELECT * FROM Customers WHERE Region = 'WA'",
DAO.RecordsetTypeEnum.dbOpenForwardOnly,
DAO.RecordsetOptionEnum.dbReadOnly)
' Print the values for the fields in the debug window.
For Each fld In rst.Fields
Debug.WriteLine(fld.Value.ToString & ";")
Next
Debug.WriteLine("")
' Close the Recordset.
rst.Close()
End Sub

Errori non gestiti nei gestori eventi


Un problema di interoperabilità comune implica errori nei gestori eventi che gestiscono gli eventi generati dagli
oggetti COM. Tali errori vengono ignorati a meno che non si verifichino errori specifici utilizzando le On Error
Try...Catch...Finally istruzioni o. Ad esempio, l'esempio seguente è riportato da un progetto Visual Basic .NET
che contiene un riferimento all'oggetto COM della libreria Microsoft ActiveX Data Objects 2,8.
' To use this example, add a reference to the
' Microsoft ActiveX Data Objects 2.8 Library
' from the COM tab of the project references page.
Dim WithEvents cn As New ADODB.Connection
Sub ADODBConnect()
cn.ConnectionString =
"Provider=Microsoft.Jet.OLEDB.4.0;" &
"Data Source=C:\NWIND.MDB"
cn.Open()
MsgBox(cn.ConnectionString)
End Sub

Private Sub Form1_Load(ByVal sender As System.Object,


ByVal e As System.EventArgs) Handles MyBase.Load

ADODBConnect()
End Sub

Private Sub cn_ConnectComplete(


ByVal pError As ADODB.Error,
ByRef adStatus As ADODB.EventStatusEnum,
ByVal pConnection As ADODB.Connection) Handles cn.ConnectComplete

' This is the event handler for the cn_ConnectComplete event raised
' by the ADODB.Connection object when a database is opened.
Dim x As Integer = 6
Dim y As Integer = 0
Try
x = CInt(x / y) ' Attempt to divide by zero.
' This procedure would fail silently without exception handling.
Catch ex As Exception
MsgBox("There was an error: " & ex.Message)
End Try
End Sub

Questo esempio genera un errore come previsto. Tuttavia, se si prova lo stesso esempio senza il
Try...Catch...Finally blocco, l'errore viene ignorato come se fosse stata usata l' OnError Resume Next
istruzione. Senza la gestione degli errori, la divisione per zero non riesce automaticamente. Poiché tali errori non
generano mai errori di eccezione non gestiti, è importante usare una forma di gestione delle eccezioni nei
gestori eventi che gestiscono gli eventi dagli oggetti COM.
Informazioni sugli errori di interoperabilità COM
Senza la gestione degli errori, le chiamate di interoperabilità generano spesso errori che forniscono scarse
informazioni. Quando possibile, usare la gestione degli errori strutturati per fornire altre informazioni sui
problemi che si verificano. Questo può essere particolarmente utile quando si esegue il debug delle applicazioni.
Ad esempio:

Try
' Place call to COM object here.
Catch ex As Exception
' Display information about the failed call.
End Try

È possibile trovare informazioni quali la descrizione dell'errore, HRESULT e l'origine di errori COM esaminando
il contenuto dell'oggetto eccezione.

Problemi di controllo ActiveX


La maggior parte dei controlli ActiveX che funzionano con Visual Basic 6,0 funzionano con Visual Basic .NET
senza problemi. Le eccezioni principali sono controlli contenitore o controlli che contengono visivamente altri
controlli. Di seguito sono riportati alcuni esempi di controlli precedenti che non funzionano correttamente con
Visual Studio:
Controllo frame Microsoft Forms 2,0
Up-Down controllo, noto anche come controllo di selezione
Controllo scheda Sheridan
Esistono solo alcune soluzioni alternative per i problemi di controllo ActiveX non supportati. È possibile eseguire
la migrazione di controlli esistenti a Visual Studio se si è proprietari del codice sorgente originale. In caso
contrario, è possibile verificare che i fornitori di software siano aggiornati. Versioni di controlli compatibili con
.NET per sostituire i controlli ActiveX non supportati.

Passaggio delle proprietà di sola lettura dei controlli ByRef


Visual Basic .NET a volte genera errori COM, ad esempio "Error 0x800A017F CTL_E_SETNOTSUPPORTED",
quando si passano ReadOnly le proprietà di alcuni controlli ActiveX meno recenti come ByRef parametri ad
altre procedure. Chiamate di procedura analoghe da Visual Basic 6,0 non generano un errore e i parametri
vengono considerati come se fossero stati passati per valore. Il messaggio di errore Visual Basic .NET indica che
si sta tentando di modificare una proprietà che non dispone di una routine della proprietà Set .
Se si ha accesso alla routine chiamata, è possibile evitare questo errore usando la ByVal parola chiave per
dichiarare i parametri che accettano le ReadOnly Proprietà. Ad esempio:

Sub ProcessParams(ByVal c As Object)


'Use the arguments here.
End Sub

Se non si ha accesso al codice sorgente per la routine chiamata, è possibile forzare il passaggio della proprietà in
base al valore aggiungendo un set aggiuntivo di parentesi quadre alla procedura chiamante. Ad esempio, in un
progetto che contiene un riferimento all'oggetto COM della libreria Microsoft ActiveX Data Objects 2,8, è
possibile usare:

Sub PassByVal(ByVal pError As ADODB.Error)


' The extra set of parentheses around the arguments
' forces them to be passed by value.
ProcessParams((pError.Description))
End Sub

Distribuzione degli assembly che espongono l'interoperabilità


La distribuzione di assembly che espongono interfacce COM presenta alcune esigenze specifiche. Ad esempio,
un potenziale problema si verifica quando applicazioni separate fanno riferimento allo stesso assembly COM.
Questa situazione è comune quando viene installata una nuova versione di un assembly e un'altra applicazione
usa ancora la versione precedente dell'assembly. Se si disinstalla un assembly che condivide una DLL, è possibile
renderlo involontariamente non disponibile agli altri assembly.
Per evitare questo problema, è necessario installare assembly condivisi nella global assembly cache (GAC) e
usare un MergeModule per il componente. Se non è possibile installare l'applicazione nella GAC, è necessario
installarla in CommonFilesFolder in una sottodirectory specifica della versione.
Gli assembly non condivisi devono trovarsi side-by-side nella directory con l'applicazione chiamante.

Vedi anche
MarshalAsAttribute
Interoperabilità COM
Tlbimp.exe (utilità di importazione della libreria dei tipi)
Tlbexp.exe (utilità di esportazione della libreria dei tipi)
Procedura dettagliata: Implementazione dell'ereditarietà con gli oggetti COM
Inherits Statement
Global Assembly Cache
Interoperabilità COM nelle applicazioni .NET
Framework (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Quando si desidera utilizzare oggetti COM e .NET Framework oggetti nella stessa applicazione, è necessario
risolvere le differenze nella modalità di esistenza degli oggetti in memoria. Un oggetto .NET Framework si trova
in managed memory, ovvero la memoria controllata dal Common Language Runtime, e può essere spostato dal
runtime in base alle esigenze. Un oggetto COM si trova nella memoria non gestita e non prevede lo
spostamento in un'altra posizione di memoria. Visual Studio e il .NET Framework forniscono strumenti per
controllare l'interazione di questi componenti gestiti e non gestiti. Per altre informazioni sul codice gestito,
vedere Common Language Runtime.
Oltre a usare gli oggetti COM nelle applicazioni .NET, è anche possibile usare Visual Basic per sviluppare oggetti
accessibili da codice non gestito tramite COM.
I collegamenti in questa pagina forniscono informazioni dettagliate sulle interazioni tra gli oggetti COM e .NET
Framework.

Sezioni correlate

Interoperabilità COM Vengono forniti collegamenti ad argomenti relativi


all'interoperabilità COM in Visual Basic, inclusi oggetti COM,
controlli ActiveX, dll Win32, oggetti gestiti ed ereditarietà di
oggetti COM.

Interoperabilità con codice non gestito Descrive brevemente alcuni problemi di interazione tra
codice gestito e non gestito e fornisce collegamenti per
ulteriori studi.

Wrapper COM Vengono illustrati i Runtime Callable Wrapper che


consentono al codice gestito di chiamare i metodi COM e
COM Callable Wrapper che consentono ai client COM di
chiamare i metodi dell'oggetto .NET.

Interoperabilità COM avanzata Vengono forniti collegamenti ad argomenti relativi


all'interoperabilità COM rispetto a wrapper, eccezioni,
ereditarietà, Threading, eventi, conversioni e marshalling.

Tlbimp.exe (utilità di importazione della libreria dei tipi) Viene illustrato lo strumento che è possibile utilizzare per
convertire le definizioni dei tipi presenti in una libreria dei tipi
COM in definizioni equivalenti in un assembly Common
Language Runtime.
Procedura dettagliata: implementazione
dell'ereditarietà con gli oggetti COM (Visual Basic)
05/03/2021 • 10 minutes to read • Edit Online

È possibile derivare Visual Basic classi da Public classi negli oggetti com, anche quelle create nelle versioni
precedenti di Visual Basic. Le proprietà e i metodi delle classi ereditate dagli oggetti COM possono essere
sottoposti a override o sottoposti a overload come le proprietà e i metodi di qualsiasi altra classe di base
possono essere sostituiti o sottoposti a overload. L'ereditarietà dagli oggetti COM è utile quando si dispone di
una libreria di classi esistente che non si desidera ricompilare.
Nella procedura seguente viene illustrato come utilizzare Visual Basic 6,0 per creare un oggetto COM
contenente una classe e quindi utilizzarlo come classe base.

NOTE
Nomi o percorsi visualizzati per alcuni elementi dell'interfaccia utente di Visual Studio nelle istruzioni seguenti potrebbero
essere diversi nel computer in uso. La versione di Visual Studio in uso e le impostazioni configurate determinano questi
elementi. Per altre informazioni, vedere Personalizzazione dell'IDE.

Per compilare l'oggetto COM utilizzato in questa procedura


dettagliata
1. In Visual Basic 6,0 aprire un nuovo progetto di DLL ActiveX. Viene creato un progetto denominato
Project1 . Dispone di una classe denominata Class1 .

2. In Esplora progetti fare clic con il pulsante destro del mouse su Project1 e quindi scegliere Proprietà
Project1 . Verrà visualizzata la finestra di dialogo Proprietà progetto .
3. Nella scheda generale della finestra di dialogo Proprietà progetto modificare il nome del progetto
digitando ComObject1 nel campo nome progetto .
4. In Esplora progetti fare clic con il pulsante destro del mouse su Class1 , quindi scegliere proprietà .
Viene visualizzata la finestra Proprietà per la classe.
5. Modificare la Name Proprietà in MathFunctions .
6. In Esplora progetti fare clic con il pulsante destro del mouse su MathFunctions , quindi scegliere
Visualizza codice . Viene visualizzato l' editor di codice .
7. Aggiungere una variabile locale per conservare il valore della proprietà:

' Local variable to hold property value


Private mvarProp1 As Integer

8. Aggiungere Let routine di proprietà e proprietà Get :


Public Property Let Prop1(ByVal vData As Integer)
'Used when assigning a value to the property.
mvarProp1 = vData
End Property
Public Property Get Prop1() As Integer
'Used when retrieving a property's value.
Prop1 = mvarProp1
End Property

9. Aggiungere una funzione:

Function AddNumbers(
ByVal SomeNumber As Integer,
ByVal AnotherNumber As Integer) As Integer

AddNumbers = SomeNumber + AnotherNumber


End Function

10. Creare e registrare l'oggetto COM scegliendo Make ComObject1.dll dal menu file .

NOTE
Sebbene sia anche possibile esporre una classe creata con Visual Basic come oggetto COM, non è un vero oggetto
COM e non può essere utilizzata in questa procedura dettagliata. Per informazioni dettagliate, vedere
interoperabilità com nelle applicazioni .NET Framework.

Assembly di interoperabilità
Nella procedura seguente verrà creato un assembly di interoperabilità, che funge da Bridge tra codice non
gestito (ad esempio un oggetto COM) e il codice gestito utilizzato da Visual Studio. L'assembly di
interoperabilità creato da Visual Basic gestisce molti dettagli sull'utilizzo di oggetti COM, ad esempio il
marshalling di interoperabilità, il processo di creazione del pacchetto di parametri e la restituzione di valori in
tipi di dati equivalenti durante il passaggio da e verso oggetti com. Il riferimento nell'applicazione Visual Basic
punta all'assembly di interoperabilità, non all'oggetto COM effettivo.
Per usare un oggetto COM con Visual Basic 2005 e versioni successive
1. Aprire un nuovo progetto Applicazione Windows in Visual Basic.
2. Scegliere Aggiungi riferimento dal menu Progetto .
Viene visualizzata la finestra di dialogo Aggiungi riferimento .
3. Nella scheda com fare doppio clic ComObject1 nell'elenco nome componente e fare clic su OK .
4. Dal menu Progetto fare clic su Aggiungi nuovo elemento .
La finestra di dialogo Aggiungi nuovo elemento viene visualizzata.
5. Nel riquadro modelli fare clic su classe .
Il nome file predefinito, Class1.vb , viene visualizzato nel campo nome . Modificare questo campo in
MathClass. vb e fare clic su Aggiungi . Viene creata una classe denominata MathClass e viene
visualizzato il relativo codice.
6. Aggiungere il codice seguente all'inizio di MathClass per ereditare dalla classe com.
' The inherited class is called MathFunctions in the base class,
' but the interop assembly appends the word Class to the name.
Inherits ComObject1.MathFunctionsClass

7. Eseguire l'overload del metodo pubblico della classe base aggiungendo il codice seguente a MathClass :

' This method overloads the method AddNumbers from the base class.
Overloads Function AddNumbers(
ByVal SomeNumber As Integer,
ByVal AnotherNumber As Integer) As Integer

Return SomeNumber + AnotherNumber


End Function

8. Estendere la classe ereditata aggiungendo il codice seguente a MathClass :

' The following function extends the inherited class.


Function SubtractNumbers(
ByVal SomeNumber As Integer,
ByVal AnotherNumber As Integer) As Integer

Return AnotherNumber - SomeNumber


End Function

La nuova classe eredita le proprietà della classe di base nell'oggetto COM, sovraccarica un metodo e definisce
un nuovo metodo per estendere la classe.
Per testare la classe ereditata
1. Aggiungere un pulsante al form di avvio e quindi fare doppio clic su di esso per visualizzarne il codice.
2. Nella procedura relativa al Click gestore eventi del pulsante aggiungere il codice seguente per creare
un'istanza di MathClass e chiamare i metodi di overload:

Dim Result1 As Short


Dim Result2 As Integer
Dim Result3 As Integer
Dim MathObject As New MathClass
Result1 = MathObject.AddNumbers(4S, 2S) ' Add two Shorts.
Result2 = MathObject.AddNumbers(4, 2) 'Add two Integers.
Result3 = MathObject.SubtractNumbers(2, 4) ' Subtract 2 from 4.
MathObject.Prop1 = 6 ' Set an inherited property.

MsgBox("Calling the AddNumbers method in the base class " &


"using Short type numbers 4 and 2 = " & Result1)
MsgBox("Calling the overloaded AddNumbers method using " &
"Integer type numbers 4 and 2 = " & Result2)
MsgBox("Calling the SubtractNumbers method " &
"subtracting 2 from 4 = " & Result3)
MsgBox("The value of the inherited property is " &
MathObject.Prop1)

3. Eseguire il progetto premendo F5.


Quando si fa clic sul pulsante nel form, il AddNumbers metodo viene chiamato prima con i Short numeri dei tipi
di dati e Visual Basic sceglie il metodo appropriato dalla classe di base. La seconda chiamata a AddNumbers viene
indirizzata al metodo di overload da MathClass . La terza chiamata chiama il SubtractNumbers metodo, che
estende la classe. Viene impostata la proprietà nella classe di base e viene visualizzato il valore.
Passaggi successivi
Si può notare che la AddNumbers funzione in overload sembra avere lo stesso tipo di dati del metodo ereditato
dalla classe di base dell'oggetto com. Ciò è dovuto al fatto che gli argomenti e i parametri del metodo della
classe base sono definiti come interi a 16 bit in Visual Basic 6,0, ma vengono esposti come interi a 16 bit di tipo
Short nelle versioni successive di Visual Basic. La nuova funzione accetta interi a 32 bit e sovraccarica la
funzione della classe di base.
Quando si utilizzano gli oggetti COM, assicurarsi di verificare le dimensioni e i tipi di dati dei parametri. Ad
esempio, quando si usa un oggetto COM che accetta un oggetto raccolta Visual Basic 6,0 come argomento, non
è possibile fornire una raccolta da una versione successiva di Visual Basic.
È possibile eseguire l'override delle proprietà e dei metodi ereditati dalle classi COM, vale a dire che è possibile
dichiarare una proprietà o un metodo locale che sostituisce una proprietà o un metodo ereditato da una classe
COM di base. Le regole per l'override delle proprietà COM ereditate sono simili a quelle per l'override di altre
proprietà e metodi con le eccezioni seguenti:
Se si esegue l'override di qualsiasi proprietà o metodo ereditato da una classe COM, è necessario
eseguire l'override di tutte le altre proprietà e metodi ereditati.
Non è possibile eseguire l'override delle proprietà che usano ByRef parametri.

Vedi anche
Interoperabilità COM nelle applicazioni .NET Framework
Inherits Statement
Tipo di dati Short
Riferimenti al linguaggio Visual Basic
05/03/2021 • 3 minutes to read • Edit Online

In questa sezione vengono fornite informazioni di riferimento per diversi aspetti del linguaggio Visual Basic.

Contenuto della sezione


Convenzioni tipografiche e di scrittura del codice
Riepiloga il modo in cui le parole chiave, i segnaposto e altri elementi del linguaggio vengono formattati nella
documentazione di Visual Basic.
Membri della libreria di runtime di Visual Basic
Elenca le classi e i moduli dello spazio dei nomi Microsoft.VisualBasic con collegamenti a funzioni dei membri,
metodi, proprietà, costanti ed enumerazioni.
Parole chiave
Elenca tutte le parole chiave di Visual Basic e include collegamenti ad altre informazioni.
Attributi (Visual Basic)
Documenta gli attributi disponibili in Visual Basic.
Costanti ed enumerazioni
Documenta le costanti e le enumerazioni disponibili in Visual Basic.
Tipi di dati
Documenta i tipi di dati disponibili in Visual Basic.
Direttive
Documenta le direttive del compilatore disponibili in Visual Basic.
Funzioni
Documenta le funzioni di runtime disponibili in Visual Basic.
Modificatori
Elenca i modificatori di run-time di Visual Basic e include collegamenti ad altre informazioni.
Moduli
Documenta i moduli disponibili in Visual Basic e i relativi membri.
Nothing
Illustra il valore predefinito di tutti i tipi di dati.
Oggetti
Documenta gli oggetti disponibili in Visual Basic e i relativi membri.
Operatori
Documenta gli operatori disponibili in Visual Basic.
Proprietà
Vengono documentate le proprietà disponibili in Visual Basic.
Query
Vengono fornite informazioni di riferimento sull'utilizzo di espressioni Language-Integrated query (LINQ) nel
codice.
Istruzioni
Documenta la dichiarazione e le istruzioni eseguibili disponibili in Visual Basic.
Tag di commento XML
Vengono descritti i commenti relativi alla documentazione per i quali viene fornito IntelliSense nell'editor di
codice Visual Basic.
Proprietà Axis XML
Include i collegamenti alle informazioni sull'uso delle proprietà asse XML per accedere a XML direttamente nel
codice.
Valori letterali XML
Include i collegamenti alle informazioni sull'uso dei valori letterali XML per incorporare XML direttamente nel
codice.
Messaggi di errore
Fornisce un elenco di Visual Basic i messaggi di errore del compilatore e della fase di esecuzione e la relativa
modalità di gestione.

Sezioni correlate
Compilatore della riga di comando di Visual Basic
Viene descritto come usare il compilatore da riga di comando come alternativa alla compilazione di programmi
dall'interno di Visual Studio Integrated Development Environment (IDE).
Selezionare la versione della lingua Visual Basic
05/03/2021 • 5 minutes to read • Edit Online

Per impostazione predefinita, il compilatore Visual Basic la versione principale più recente della lingua rilasciata.
È possibile scegliere di compilare tutti i progetti usando una nuova versione intermedia del linguaggio. La scelta
di una versione più recente del linguaggio consente al progetto di usare le nuove funzionalità del linguaggio. In
altri scenari può essere necessario verificare che un progetto viene compilato senza errori quando si usa una
versione precedente del linguaggio.
Questa funzionalità separa l'installazione delle nuove versioni dell'SDK e degli strumenti nell'ambiente di
sviluppo dalla decisione di incorporare nuove funzionalità del linguaggio in un progetto. È possibile installare
l'SDK e gli strumenti più recenti nel computer di compilazione. Ogni progetto può essere configurato per usare
una versione specifica del linguaggio in base alla relativa build.
Sono disponibili tre modi per impostare la versione della lingua:
Modificare manualmente il file con estensione vbproj
Impostare la versione della lingua per più progetti in una sottodirectory
Configurare l' -langversion opzione del compilatore

Modificare il file vbproj


È possibile impostare la versione del linguaggio nel file con estensione vbproj . Aggiungere l'elemento
seguente:

<PropertyGroup>
<LangVersion>latest</LangVersion>
</PropertyGroup>

Il valore latest utilizza la versione secondaria più recente della lingua Visual Basic. I valori validi sono:

VA LO RE SIGN IF IC ATO

default Il compilatore accetta tutte le sintassi di linguaggio valide


dalla versione principale più recente supportata.

9 Il compilatore accetta solo la sintassi inclusa in Visual Basic


9,0 o versioni precedenti.

10 Il compilatore accetta solo la sintassi inclusa in Visual Basic


10,0 o versioni precedenti.

11 Il compilatore accetta solo la sintassi inclusa in Visual Basic


11,0 o versioni precedenti.

12 Il compilatore accetta solo la sintassi inclusa in Visual Basic


12,0 o versioni precedenti.

14 Il compilatore accetta solo la sintassi inclusa in Visual Basic


14,0 o versioni precedenti.
VA LO RE SIGN IF IC ATO

15 Il compilatore accetta solo la sintassi inclusa in Visual Basic


15,0 o versioni precedenti.

15.3 Il compilatore accetta solo la sintassi inclusa in Visual Basic


15,3 o versioni precedenti.

15.5 Il compilatore accetta solo la sintassi inclusa in Visual Basic


15,5 o versioni precedenti.

16 Il compilatore accetta solo la sintassi inclusa in Visual Basic


16 o versioni precedenti.

16.9 Il compilatore accetta solo la sintassi inclusa in Visual Basic


16,9 o versioni precedenti.

più recenti Il compilatore accetta tutte le sintassi di linguaggio valide.

Le stringhe speciali default e latest si risolvono rispettivamente nelle versioni principale e secondaria più
recenti del linguaggio installate nel computer di compilazione.

Configurare più progetti


È possibile creare un file Director y.build.props che contiene l'elemento <LangVersion> per configurare più
directory. Questa operazione viene in genere eseguita nella directory della soluzione. Aggiungere quanto segue
a un file Director y.build.props nella directory della soluzione:

<Project>
<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>
</Project>

A questo punto, compila in ogni sottodirectory della directory che contiene il file utilizzerà Visual Basic sintassi
della versione 15,5. Per altre informazioni, vedere l'articolo Personalizzare la compilazione.

Impostare l'opzione del compilatore langversion


È possibile usare l'opzione della riga di comando -langversion . Per altre informazioni, vedere l'articolo relativo
all'opzione del compilatore -langversion. È possibile visualizzare un elenco dei valori validi digitando
vbc -langversion:? .
Convenzioni tipografiche e di scrittura del codice
(Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

Visual Basic documentazione utilizza le convenzioni tipografiche e di codice seguenti.

Convenzioni tipografiche
ESEM P IO DESC RIZ IO N E

Sub , If , ChDir , Print , True , Debug Le parole chiave specifiche del linguaggio e i membri di
runtime hanno lettere maiuscole iniziali e sono formattati
come illustrato in questo esempio.

SmallProject , buttoncollection Le parole e le frasi a cui viene richiesto il tipo sono


formattate come illustrato in questo esempio.

Istruzione Module I collegamenti che è possibile fare clic per passare a un'altra
pagina della guida sono formattati come illustrato in questo
esempio.

Object, variablename, argumentList I segnaposto per le informazioni fornite vengono formattati


come illustrato in questo esempio.

[Shadows], [ espressione ] Nella sintassi gli elementi facoltativi sono racchiusi tra
parentesi quadre.

{ Public | Friend | Private } Nella sintassi, quando è necessario effettuare una scelta tra
due o più elementi, gli elementi sono racchiusi tra parentesi
graffe e separati da barre verticali.

È necessario selezionarne uno, e solo uno, degli elementi.

[ Protected | Friend ] Nella sintassi, quando è possibile scegliere tra due o più
elementi, gli elementi sono racchiusi tra parentesi quadre e
separati da barre verticali.

È possibile selezionare qualsiasi combinazione degli elementi


o nessun elemento.

[{ ByVal | ByRef }] Nella sintassi, quando è possibile selezionare non più di un


elemento, ma è anche possibile omettere completamente gli
elementi, gli elementi sono racchiusi tra parentesi quadre
racchiusi tra parentesi graffe e separati da barre verticali.

memberName 1, memberName 2, memberName 3 Più istanze dello stesso segnaposto sono differenziate dagli
indici, come illustrato nell'esempio.
ESEM P IO DESC RIZ IO N E

Nomemembro1 Nella sintassi, i puntini di sospensione (...) vengono utilizzati


per indicare un numero indefinito di elementi del tipo
... immediatamente davanti ai puntini di sospensione.

memberNameN Nel codice i puntini di sospensione indicano il codice omesso


per motivi di chiarezza.

ESC, INVIO I nomi delle chiavi e le sequenze di chiavi sulla tastiera


vengono visualizzati in lettere maiuscole.

ALT+F1 Quando vengono visualizzati i segni più (+) tra i nomi delle
chiavi, è necessario mantenere premuto un tasto mentre si
preme l'altro. ALT + F1, ad esempio, consente di mantenere
premuto il tasto ALT mentre si preme il tasto F1.

Convenzioni del codice


ESEM P IO DESC RIZ IO N E

sampleString = "Hello, world!" Gli esempi di codice vengono visualizzati in un tipo di


carattere a passo fisso e sono formattati come illustrato in
questo esempio.

L'istruzione precedente imposta il valore di sampleString Gli elementi di codice nel testo esplicativo sono visualizzati in
su "Hello, World!" un tipo di carattere a passo fisso, come illustrato in questo
esempio.

' This is a comment. I commenti del codice sono introdotti da un apostrofo (') o
dalla parola chiave REM.
REM This is also a comment.

sampleVar = "This is an " _ Uno spazio seguito da un carattere di sottolineatura (_) alla
fine di una riga indica che l'istruzione continua nella riga
& "example" _ seguente.

& " of how to continue code."

Vedi anche
Riferimenti al linguaggio Visual Basic
Parole chiave
Membri della libreria di runtime di Visual Basic
Convenzioni di denominazione di Visual Basic
Procedura: Interrompere e combinare istruzioni nel codice
Commenti nel codice
Membri della libreria di runtime di Visual Basic
05/03/2021 • 2 minutes to read • Edit Online

Lo Microsoft.VisualBasic spazio dei nomi contiene classi, moduli, costanti ed enumerazioni che costituiscono la
libreria di runtime Visual Basic. Questi membri della libreria forniscono procedure, proprietà e valori costanti
che è possibile usare nel codice. Ogni modulo e classe rappresenta una particolare categoria di funzionalità.

Classe Microsoft. VisualBasic. Collection

Add Clear Contains Count

GetEnumerator Item[] Remove

Classe Microsoft. VisualBasic. ComClassAttribute

ClassID EventID InterfaceID InterfaceShadows

Classe Microsoft. VisualBasic. ControlChars

Back Cr CrLf FormFeed

Lf NewLine NullChar Quote

Tab VerticalTab

Classe Microsoft. VisualBasic. Constants

vbAbort vbAbortRetryIgnore vbApplicationModal vbArchive

vbArray vbBack vbBinaryCompare vbBoolean

vbByte vbCancel vbCr vbCritical

vbCrLf vbCurrency vbDate vbDecimal

vbDefaultButton1 vbDefaultButton2 vbDefaultButton3 vbDirectory

vbDouble vbEmpty vbExclamation vbFalse

vbFirstFourDays vbFirstFullWeek vbFirstJan1 vbFormFeed


vbFriday vbGeneralDate vbGet vbHidden

vbHide vbHiragana vbIgnore vbInformation

vbInteger vbKatakana vbLet vbLf

vbLinguisticCasing vbLong vbLongDate vbLongTime

vbLowerCase vbMaximizedFocus vbMethod vbMinimizedFocus

vbMinimizedNoFocus vbMonday vbMsgBoxHelp vbMsgBoxRight

vbMsgBoxRtlReading vbMsgBoxSetForeground vbNarrow vbNewLine

vbNo vbNormal vbNormalFocus vbNormalNoFocus

vbNull vbNullChar vbNullString vbObject

vbObjectError vbOK vbOKCancel vbOKOnly

vbProperCase vbQuestion vbReadOnly vbRetry

vbRetryCancel vbSaturday vbSet vbShortDate

vbShortTime vbSimplifiedChinese vbSingle vbString

vbSunday vbSystem vbSystemModal vbTab

vbTextCompare vbThursday vbTraditionalChinese vbTrue

vbTuesday vbUpperCase vbUseDefault vbUserDefinedType

vbUseSystem vbUseSystemDayOfWeek vbVariant vbVerticalTab

vbVolume vbWednesday vbWide vbYes

vbYesNo vbYesNoCancel

Modulo Microsoft. VisualBasic. Conversion

ErrorToString Fix Hex Int

Oct Str Val

Modulo Microsoft. VisualBasic. DateAndTime

DateAdd DateDiff DatePart DateSerial


DateString DateValue Day Hour

Minute Month MonthName Now

Second TimeOfDay Timer TimeSerial

TimeString TimeValue Today Weekday

WeekdayName Year

Classe Microsoft. VisualBasic. ErrObject

Clear Description Erl GetException

HelpContext HelpFile LastDllError Number

Raise Raise

Modulo Microsoft. VisualBasic. FileSystem

ChDir ChDrive CurDir Dir

EOF FileAttr FileClose FileCopy

FileDateTime FileGet FileGetObject FileLen

FileOpen FilePut FilePutObject FileWidth

FreeFile GetAttr Input InputString

Kill LineInput Loc Lock

LOF MkDir Print PrintLine

Rename Reset RmDir Seek

SetAttr SPC TAB Unlock

Write WriteLine

Modulo Microsoft. VisualBasic. Financial

DDB FV IPmt IRR

MIRR NPer NPV Pmt


PPmt PV Rate SLN

SYD

Modulo Microsoft. VisualBasic. Globals

ScriptEngine ScriptEngineBuildVersion ScriptEngineMajorVersion ScriptEngineMinorVersion

Classe Microsoft. VisualBasic. HideModuleNameAttribute

HideModuleNameAttribute

Modulo Microsoft. VisualBasic. Information

Erl Err IsArray IsDate

IsDBNull IsError IsNothing IsNumeric

IsReference LBound QBColor RGB

SystemTypeName TypeName UBound VarType

VbTypeName

Modulo Microsoft. VisualBasic. Interaction

AppActivate Beep CallByName Choose

Command CreateObject DeleteSetting Environ

GetAllSettings GetObject GetSetting IIf

InputBox MsgBox Partition SaveSetting

Shell Switch

Classe Microsoft. VisualBasic. MyGroupCollectionAttribute

CreateMethod DefaultInstanceAlias DisposeMethod MyGroupName


Modulo Microsoft. VisualBasic. Strings

Asc Asc Chr ChrW

Filter Format FormatCurrency FormatDateTime

FormatNumber FormatPercent GetChar InStr

InStrRev Join LCase Left

Len LSet LTrim Mid

Replace Right RSet RTrim

Space Split StrComp StrConv

StrDup StrReverse Trim UCase

Classe Microsoft. VisualBasic. VBFixedArrayAttribute

Bounds Length

Classe Microsoft. VisualBasic. VBFixedStringAttribute

Length

Modulo Microsoft. VisualBasic. VbMath

Randomize Rnd

Costanti ed enumerazioni Microsoft. VisualBasic


Lo Microsoft.VisualBasic spazio dei nomi fornisce costanti ed enumerazioni come parte della libreria di
runtime Visual Basic. È possibile usare questi valori costanti nel codice. Ogni enumerazione rappresenta una
particolare categoria di funzionalità. Per ulteriori informazioni, vedere costanti ed enumerazioni.

Vedi anche
Costanti ed enumerazioni
Parole chiave
Parole chiave (Visual Basic)
05/03/2021 • 6 minutes to read • Edit Online

Le tabelle seguenti elencano tutte le parole chiave del linguaggio Visual Basic.

Parole chiave riservate


Le parole chiave seguenti sono riservate, ovvero non possono essere usate come nomi di elementi di
programmazione, ad esempio variabili o procedure. È possibile ignorare questa restrizione racchiudendo il
nome tra parentesi quadre ( [] ). Per altre informazioni, vedere "Escaped Names" (Nomi con caratteri di escape)
in Declared Element Names (Nomi di elementi dichiarati).

NOTE
Si consiglia di non usare nomi con caratteri di escape poiché possono rendere il codice di difficile lettura e causare errori
difficili da rilevare.

AddHandler AddressOf Alias And

AndAlso As Boolean ByRef

Byte ByVal Call Case

Catch CBool CByte CChar

CDate CDbl CDec Char

CInt Class Vincolo Class Istruzione CLng

CObj Const Continue CSByte

CShort CSng CStr CType

CUInt CULng CUShort Date

Decimal Declare Default Delegate

Dim DirectCast Do Double

Each Else ElseIf End Istruzione

End <keyword> EndIf Enum Erase

Error Event Exit False

Finally For (in For…Next ) For Each…Next Friend


Function Get GetType GetXMLNamespace

Global GoSub GoTo Handles

If If() Implements Implements Istruzione

Imports (Tipo e spazio dei Imports (Spazio dei nomi In In (Modificatore generico)
nomi .NET) XML)

Inherits Integer Interface Is

IsNot Let Lib Like

Long Loop Me Mod

Module Module Istruzione MustInherit MustOverride

MyBase MyClass NameOf Namespace

Narrowing New Vincolo New Operatore Next

Next (in Resume ) Not Nothing NotInheritable

NotOverridable Object Of On

Operator Option Optional Or

OrElse Out (Modificatore Overloads Overridable


generico)

Overrides ParamArray Partial Private

Property Protected Public RaiseEvent

ReadOnly ReDim REM RemoveHandler

Resume Return SByte Select

Set Shadows Shared Short

Single Static Step Stop

String Structure Vincolo Structure Istruzione Sub

SyncLock Then Throw To

True Try TryCast TypeOf…Is

UInteger ULong UShort Using


Variant Wend When While

Widening With WithEvents WriteOnly

Xor #Const #Else #ElseIf

#End #If = &

&= * *= /

/= \ \= ^

^= + += -

-= >> Operatore >>= Operatore <<

<<=

NOTE
EndIf , GoSub , Variant e Wend vengono mantenuti come parole chiave riservate, anche se non vengono più
utilizzate in Visual Basic. Il significato della parola chiave Let è stato modificato. Let viene ora usata nelle query LINQ.
Per ulteriori informazioni, vedere clausola Let.

Parole chiave non riservate


Le parole chiave seguenti non sono riservate, ovvero possono essere usate come nomi degli elementi di
programmazione. Si consiglia tuttavia di non eseguire questa operazione poiché potrebbe rendere il codice di
difficile lettura e causare errori difficili da rilevare.

Aggregate Ansi Assembly Async

Auto Await Binary Compare

Custom Distinct Equals Explicit

From Group By Group Join Into

IsFalse IsTrue Iterator Join

Key Mid Off Order By

Preserve Skip Skip While Strict

Take Take While Text Unicode

Until Where Yield #ExternalSource


#Region

Argomenti correlati
T ITO LO DESC RIZ IO N E

Riepilogo delle matrici Elenca gli elementi di linguaggio che consentono di creare,
definire e usare le matrici.

Riepilogo dell'oggetto Collection Elenca gli elementi del linguaggio usati per le raccolte.

Riepilogo del flusso di controllo Elenca le istruzioni usate per eseguire il ciclo e controllare il
flusso di routine.

Riepilogo della conversione Elenca le funzioni usate per convertire numeri, date, ore e
stringhe.

Data Types Summary Elenca i tipi di dati. Elenca anche le funzioni usate per
convertire e verificare i tipi di dati.

Riepilogo di data e ora Elenca gli elementi del linguaggio usati per date e ore.

Riepilogo delle dichiarazioni e delle costanti Elenca le istruzioni usate per dichiarare variabili, costanti,
classi, moduli e altri elementi di programmazione. Elenca
anche gli elementi del linguaggio usati per ottenere
informazioni sugli oggetti, gestire gli eventi e implementare
l'ereditarietà.

Riepilogo di directory e file Elenca le funzioni usate per controllare il file system ed
elaborare i file.

Riepilogo degli errori Elenca gli elementi del linguaggio usati per rilevare e
restituire i valori degli errori di run-time.

Riepilogo degli elementi finanziari Elenca le funzioni usate per eseguire calcoli finanziari.

Riepilogo di input e output Elenca le funzioni che consentono di leggere e scrivere nei
file, gestire i file e stampare l'output.

Riepilogo delle informazioni e dell'interazione Elenca le funzioni usate per eseguire altri programmi,
ottenere argomenti della riga di comando, modificare gli
oggetti COM, recuperare le informazioni di colore e usare le
finestre di dialogo di controllo.

Riepilogo degli elementi matematici Elenca le funzioni usate per eseguire calcoli trigonometrici e
altri calcoli matematici.

Informazioni di riferimento su My Elenca gli oggetti contenuti in My , una funzionalità che


consente di accedere a metodi, proprietà ed eventi usati di
frequente del computer in cui l'applicazione è in esecuzione,
dell'applicazione corrente, delle risorse dell'applicazione, delle
impostazioni dell'applicazione e così via.
T ITO LO DESC RIZ IO N E

Riepilogo degli operatori Elenca le espressioni di confronto e assegnazione e altri


operatori.

Riepilogo del Registro di sistema Elenca le funzioni usate per leggere, salvare ed eliminare le
impostazioni del programma.

Riepilogo della modifica delle stringhe Elenca le funzioni usate per modificare le stringhe.

Vedi anche
Membri della libreria di runtime di Visual Basic
Riepilogo delle matrici (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Le parole chiave del linguaggio Visual Basic e i membri della libreria di runtime sono organizzati in base allo
scopo e usano.

A Z IO N E EL EM EN TO DI L IN GUA GGIO

Verificare una matrice. IsArray

Dichiarare e inizializzare una matrice. Dim, private, public, ReDim

Individuare i limiti di una matrice. LBound, UBound

Reinizializza una matrice Erase, ReDim

Vedi anche
Parole chiave
Membri della libreria di runtime di Visual Basic
Riepilogo dell'oggetto di Collection (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Le parole chiave del linguaggio Visual Basic e i membri della libreria di runtime sono organizzati in base allo
scopo e usano.

A Z IO N E EL EM EN TO DI L IN GUA GGIO

Creare un oggetto Collection . Collection

Aggiungere un elemento a una raccolta. Add

Rimuovere un oggetto da una raccolta. Remove

Fare riferimento a un elemento in una raccolta. Item[]

Restituisce un riferimento a un' IEnumerator interfaccia. IEnumerable.GetEnumerator

Vedi anche
Parole chiave
Membri della libreria di runtime di Visual Basic
Riepilogo del flusso di controllo (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Le parole chiave del linguaggio Visual Basic e i membri della libreria di runtime sono organizzati in base allo
scopo e usano.

A Z IO N E EL EM EN TO DI L IN GUA GGIO

Ramo. Goto, in errore

Uscire o sospendere il programma. Fine, uscita, arresto

Ciclo. Esegui... Ciclo, per... Quindi, per ogni... Avanti, mentre...


Termina mentre, con

Prendere decisioni. Choose, Se... Quindi... Altrimenti, selezionare


maiuscole/minuscole, Switch

Utilizzare le procedure. Chiamata, funzione, proprietà, Sub

Vedi anche
Parole chiave
Membri della libreria di runtime di Visual Basic
Riepilogo della conversione (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Le parole chiave del linguaggio Visual Basic e i membri della libreria di runtime sono organizzati in base allo
scopo e usano.

A Z IO N E EL EM EN TO DI L IN GUA GGIO

Converte il valore ANSI in stringa. Chr, ChrW

Converte una stringa in lettere minuscole o maiuscole. Format, LCase,UCase

Converte la data in un numero di serie. DateSerial, DateValue

Converte il numero decimale in altre basi. Hex, Oct

Converte un numero in una stringa. Format, Str

Converte un tipo di dati in un altro. CBool, CByte, CDate, CDbl, CDec, CInt, CLng, CSng, CShort,
CStr, CType, Fix , Int

Converte la data in giorno, mese, giorno della settimana o Day, Month, Weekday, Year
anno.

Converte l'ora in ora, minuto o secondo. Hour, Minute, Second

Converte una stringa in un valore ASCII. Asc, AscW

Converte una stringa in un numero. Val

Converte l'ora in un numero di serie. TimeSerial, TimeValue

Vedi anche
Parole chiave
Membri della libreria di runtime di Visual Basic
Riepilogo dei tipi di dati (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Le parole chiave del linguaggio Visual Basic e i membri della libreria di runtime sono organizzati in base allo
scopo e usano.

A Z IO N E EL EM EN TO DI L IN GUA GGIO

Eseguire la conversione tra tipi di dati CBool, CByte, CChar, CDate, CDbl, CDec, CInt, CLng, CObj,
CShort, CSng, CStr, Fix , Int

Imposta tipi di dati intrinseci Booleano, byte, char, date, Decimal, Double, Integer, Long,
Object, short, Single, String

Verificare i tipi di dati IsArray, IsDate, IsDBNull, IsError, IsNothing, IsNumeric,


IsReference

Vedi anche
Parole chiave
Membri della libreria di runtime di Visual Basic
Riepilogo di data e ora (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Le parole chiave del linguaggio Visual Basic e i membri della libreria di runtime sono organizzati in base allo
scopo e usano.

A Z IO N E EL EM EN TO DI L IN GUA GGIO

Ottenere la data o l'ora corrente. Now, Today, TimeOfDay

Esegue calcoli di data. DateAdd, DateDiff, DatePart

Restituisce una data. DateSerial, DateValue, MonthName, WeekdayName

Restituisce un valore time. TimeSerial, TimeValue

Impostare la data o l'ora. DateString, TimeOfDay, TimeString, Today

Ora di un processo. Timer

Vedi anche
Parole chiave
Membri della libreria di runtime di Visual Basic
Riepilogo delle dichiarazioni e delle costanti (Visual
Basic)
05/03/2021 • 2 minutes to read • Edit Online

Le parole chiave del linguaggio Visual Basic e i membri della libreria di runtime sono organizzati in base allo
scopo e usano.

A Z IO N E EL EM EN TO DI L IN GUA GGIO

Assegnare un valore. Get, Proprietà

Dichiarare variabili o costanti. Const, Dim, private, protected, public, Shadows, Shared,
static

Dichiarare una classe, un delegato, un'enumerazione, un Classe, delegato, enumerazione, modulo, spazio dei nomi,
modulo, uno spazio dei nomi o una struttura. struttura

Creare oggetti. CreateObject, GetObject , Nuovo

Ottenere informazioni su un oggetto. GetType, IsArray , IsDate , IsDBNull , IsError , IsNothing ,


IsNumeric , IsReference , SystemTypeName , TypeName ,
VarType , VbTypeName

Fare riferimento all'oggetto corrente. Mi

Richiedere dichiarazioni di variabili esplicite. Option Explicit, Option Strict

Gestisce gli eventi. AddHandler, Event, RaiseEvent, RemoveHandler

Implementare l'ereditarietà. Inherits, MustInherit, MustOverride, MyBase, MyClass, New,


NotInheritable, NotOverridable, Overloads, Overridable,
override

Vedi anche
Parole chiave
Membri della libreria di runtime di Visual Basic
Riepilogo di directory e file (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Le parole chiave del linguaggio Visual Basic e i membri della libreria di runtime sono organizzati in base allo
scopo e usano.
L'uso della My funzionalità garantisce una maggiore produttività e prestazioni nelle operazioni di I/O dei file
rispetto all'uso di questi membri. Per altre informazioni, vedere FileSystem.

A Z IO N E EL EM EN TO L A N GUA GE

Modificare una directory o una cartella. ChDir

Modificare l'unità. ChDrive

Consente di copiare un file. FileCopy

Creare una directory o una cartella. MkDir

Rimuovere una directory o una cartella. RmDir

Rinominare un file, una directory o una cartella. Rename

Restituisce il percorso corrente. CurDir

Restituisce l'indicatore di data e ora di un file. FileDateTime

Restituisce gli attributi del file, della directory o dell'etichetta. GetAttr

Restituisce la lunghezza di un file. FileLen

Restituisce il nome o l'etichetta del volume di un file. Dir

Impostare le informazioni sugli attributi per un file. SetAttr

Vedi anche
Parole chiave
Membri della libreria di runtime di Visual Basic
Lettura da file
Scrittura in file
Creazione, eliminazione e spostamento di file e directory
Analisi dei file di testo con l'oggetto TextFieldParser
Riepilogo degli errori (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Le parole chiave del linguaggio Visual Basic e i membri della libreria di runtime sono organizzati in base allo
scopo e usano.

A Z IO N E EL EM EN TO DI L IN GUA GGIO

Genera errori di run-time. Clear, Errore, Raise

Ottenere le eccezioni. GetException

Fornire informazioni sull'errore. Err

Intercettare gli errori in fase di esecuzione. In errore, riprendere, provare... Rileva... Infine

Specificare il numero di riga dell'errore. Erl

Specificare il codice di errore di sistema. LastDllError

Vedi anche
Parole chiave
Membri della libreria di runtime di Visual Basic
Riepilogo degli elementi finanziari (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Le parole chiave del linguaggio Visual Basic e i membri della libreria di runtime sono organizzati in base allo
scopo e usano.

A Z IO N E EL EM EN TO DI L IN GUA GGIO

Calcola l'ammortamento. DDB, SLN, SYD

Calcolare il valore futuro. FV

Calcolare il tasso di interesse. Rate

Calcola il tasso di restituzione interno. IRR, MIRR

Calcolare il numero di periodi. NPer

Calcola i pagamenti. IPmt, Pmt, PPmt

Calcolare il valore presente. NPV, PV

Vedi anche
Parole chiave
Membri della libreria di runtime di Visual Basic
Riepilogo delle informazioni e dell'interazione
(Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Le parole chiave del linguaggio Visual Basic e i membri della libreria di runtime sono organizzati in base allo
scopo e usano.

A Z IO N E EL EM EN TO DI L IN GUA GGIO

Eseguire altri programmi. AppActivate, Shell

Chiamare un metodo o una proprietà. CallByName

Emette un segnale acustico dal computer. Beep

Specificare una stringa della riga di comando. Command

Modificare gli oggetti COM. CreateObject, GetObject

Recuperare le informazioni sui colori. QBColor, RGB

Finestre di dialogo di controllo InputBox, MsgBox

Vedi anche
Parole chiave
Membri della libreria di runtime di Visual Basic
Riepilogo di input e output (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Le parole chiave del linguaggio Visual Basic e i membri della libreria di runtime sono organizzati in base allo
scopo e usano.

A Z IO N E EL EM EN TO DI L IN GUA GGIO

Accedere a un file o crearne uno. FileOpen

Chiudere i file. FileClose, Reset

Controllare l'aspetto dell'output. Format, Print, SPC, TAB, FileWidth

Consente di copiare un file. FileCopy

Ottenere informazioni su un file. EOF, FileAttr, FileDateTime, FileLen, FreeFile, GetAttr, Loc,
LOF, Seek

Consente di ottenere o fornire informazioni da e verso InputBox, MsgBox


l'utente tramite una finestra di dialogo di controllo.

Gestire i file. Dir, Kill, Lock, Unlock

Leggere da un file. FileGet, FileGetObject, Input, InputString, LineInput

Restituisce la lunghezza di un file. FileLen

Imposta o ottiene gli attributi del file. FileAttr, GetAttr, SetAttr

Imposta la posizione di lettura/scrittura in un file. Seek

Scrivere in un file. FilePut, FilePutObject, Print, Write, WriteLine

Vedi anche
Parole chiave
Membri della libreria di runtime di Visual Basic
Riepilogo degli elementi matematici (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Le parole chiave del linguaggio Visual Basic e i membri della libreria di runtime sono organizzati in base allo
scopo e usano.

A Z IO N E EL EM EN TO DI L IN GUA GGIO

Derivare le funzioni trigonometriche. Atan, Cos, Sin, Tan

Calcoli generali. Exp, Log, Sqrt

Genera numeri casuali. Randomize, Rnd

Ottiene il valore assoluto. Abs

Ottiene il segno di un'espressione. Sign

Eseguire conversioni numeriche. Fix, Int

Vedi anche
Funzioni matematiche derivate
Parole chiave
Membri della libreria di runtime di Visual Basic
Funzioni matematiche derivate (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Nella tabella seguente vengono illustrate le funzioni matematiche non intrinseche che possono essere derivate
dalle funzioni matematiche intrinseche dell' System.Math oggetto. È possibile accedere alle funzioni
matematiche intrinseche aggiungendo Imports System.Math al file o al progetto.

F UN Z IO N E EQ UIVA L EN T I DERIVAT I

Secante (sec (x)) 1/cos (x)

Cosecator (CSC (x)) 1/sin (x)

Cotangente (CTAN (x)) 1/tan (x)

Seno inverso (Asin (x)) Atan (x/sqrt (-x * x + 1))

Coseno inverso (ARCCOS (x)) Atan (-x/sqrt (-x * x + 1)) + 2 * Atan (1)

Secante inversa (ASEC (x)) 2 * Atan (1) – Atan (Sign (x)/sqrt (x * x-1))

Cosecante inverso (ACSC (x)) Atan (Sign (x)/sqrt (x * x-1))

Cotangente inversa (acot (x)) 2 * Atan (1)-Atan (x)

Seno iperbolico ((x)) (Exp (x) – exp (-x))/2

Coseno iperbolico (cosh (x)) (Exp (x) + exp (-x))/2

Tangente iperbolica (tanh (x)) (Exp (x) – exp (-x))/(exp (x) + exp (-x))

Secante iperbolica (sech (x)) 2/(exp (x) + exp (-x))

Cosecante iperbolica (csch (x)) 2/(exp (x) – exp (-x))

Cotangente iperbolica (coth (x)) (Exp (x) + exp (-x))/(exp (x) – exp (-x))

Seno iperbolico inverso (asinh (x)) Log (x + sqrt (x * x + 1))

Coseno iperbolico inverso (acosh (x)) Log (x + sqrt (x * x-1))

Tangente iperbolica inversa (atanh (x)) Log ((1 + x)/(1 – x))/2

Secante iperbolica inversa (AsecH (x)) Log ((sqrt (-x * x + 1) + 1)/x)

Cosecante iperbolica inversa (Acsch (x)) Log ((Sign (x) * sqrt (x * x + 1) + 1)/x)

Cotangente iperbolica inversa (Acoth (x)) Log ((x + 1)/(x-1))/2


Vedi anche
Funzioni matematiche
Riferimenti a oggetti My (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

La My funzionalità rende la programmazione più veloce e semplice grazie all'accesso intuitivo a metodi,
proprietà ed eventi usati comunemente. In questa tabella sono elencati gli oggetti contenuti in My e le azioni
che possono essere eseguite con ognuno di essi.

A Z IO N E O B JEC T

Accesso alle informazioni sull'applicazione e ai servizi. L'oggetto My.Application è costituito dalle classi seguenti:

ApplicationBase specifica i membri disponibili in tutti i


progetti.

WindowsFormsApplicationBase specifica i membri disponibili


nelle applicazioni Windows Form.

ConsoleApplicationBase specifica i membri disponibili nelle


applicazioni console.

Accesso al computer host e alle relative risorse, servizi e dati. My.Computer (Computer)

Accesso ai form nel progetto corrente. Oggetto My.Forms

Accesso al registro applicazioni. My.Application.Log (Log)

Accesso alla richiesta Web corrente. Oggetto My.Request

Accesso agli elementi di risorsa. Oggetto My.Resources

Accesso alla risposta Web corrente. Oggetto My.Response

Accesso alle impostazioni a livello di utente e di applicazione. Oggetto My.Settings

Accesso al contesto di sicurezza dell'utente corrente. My.User (User)

Accesso ai servizi Web XML a cui fa riferimento il progetto Oggetto My.WebServices


corrente.

Vedi anche
Cenni preliminari sul modello di applicazione Visual Basic
Sviluppo con My
Riepilogo degli operatori (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Le parole chiave del linguaggio Visual Basic e i membri della libreria di runtime sono organizzati in base allo
scopo e usano.

A Z IO N E EL EM EN TO DI L IN GUA GGIO

Aritmetico ^, –, * , / , \ , Mod, + , =

Assegnazione =, ^=, *=, /=, \=, +=, -=, &=

Confronto =, <> , <, > , <=, >= , Like, is

Concatenazione &, +

Operazioni logiche/bit per bit Not, and, or, Xor, AndAlso, OrElse

Operazioni varie AddressOf, await, GetType

Vedi anche
Parole chiave
Membri della libreria di runtime di Visual Basic
Riepilogo del Registro di sistema (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Le parole chiave del linguaggio di Visual Studio e i membri della libreria di runtime sono organizzati in base allo
scopo e usano.
L'uso della My funzionalità garantisce una maggiore produttività e prestazioni nelle operazioni del registro di
sistema rispetto a questi elementi. Per altre informazioni, vedere RegistryProxy.

A Z IO N E EL EM EN TO L A N GUA GE

Elimina le impostazioni del programma. DeleteSetting

Leggere le impostazioni del programma. GetSetting, GetAllSettings

Salvare le impostazioni del programma. SaveSetting

Vedi anche
Parole chiave
Membri della libreria di runtime di Visual Basic
Lettura e scrittura nel Registro di sistema
Riepilogo della modifica delle stringhe (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Le parole chiave del linguaggio Visual Basic e i membri della libreria di runtime sono organizzati in base allo
scopo e usano.

A Z IO N E EL EM EN TO DI L IN GUA GGIO

Confrontare due stringhe. StrComp

Converte le stringhe. StrConv

Invertire una stringa. InStrRev, StrReverse

Converte in lettere minuscole o maiuscole. Format, LCase, UCase

Creare una stringa di caratteri ripetuti. Space, StrDup

Trovare la lunghezza di una stringa. Len

Formattare una stringa. Format, FormatCurrency, FormatDateTime, FormatNumber,


FormatPercent

Modificare le stringhe. InStr, Left, LTrim, Mid, Right, RTrim, Trim

Impostare le regole di confronto delle stringhe. Option Compare

Usare i valori ASCII e ANSI. Asc, AscW, Chr, ChrW

Sostituisce una sottostringa specificata. Replace

Restituisce una matrice di stringhe basata su filtri. Filter

Restituisce un numero specificato di sottostringhe. Split, Join

Vedi anche
Parole chiave
Membri della libreria di runtime di Visual Basic
Attributi (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Visual Basic offre diversi attributi che consentono agli oggetti di interagire con codice non gestito e un attributo
che consente l'accesso ai membri del modulo senza il nome del modulo. Nella tabella seguente sono elencati gli
attributi utilizzati da Visual Basic.

ComClassAttribute Indica al compilatore di aggiungere metadati che


consentono di esporre una classe come oggetto COM.

HideModuleNameAttribute Consente l'accesso ai membri del modulo usando solo la


qualifica necessaria per il modulo.

VBFixedArrayAttribute Indica che una matrice in una struttura o una variabile non
locale deve essere considerata come una matrice a lunghezza
fissa.

VBFixedStringAttribute Indica che una stringa deve essere considerata come se


avesse una lunghezza fissa.

Vedi anche
Panoramica degli attributi
Costanti ed enumerazioni (Visual Basic)
05/03/2021 • 7 minutes to read • Edit Online

Visual Basic fornisce una serie di costanti ed enumerazioni predefinite per gli sviluppatori. Le costanti archiviano
i valori che rimangono costanti durante l'esecuzione di un'applicazione. Le enumerazioni offrono un modo
pratico per usare i set di costanti correlate e per associare i valori delle costanti ai nomi.

Costanti
Costanti di compilazione condizionale
Nella tabella seguente sono elencate le costanti predefinite disponibili per la compilazione condizionale.

C O N STA N T DESC RIZ IO N E

CONFIG Stringa che corrisponde all'impostazione corrente della


casella di configurazione della soluzione attiva nell'
Configuration Manager .

DEBUG Boolean Valore che può essere impostato nella finestra di


dialogo Proprietà progetto . Per impostazione predefinita,
la configurazione di debug per un progetto definisce DEBUG
. Quando DEBUG è definito, Debug i metodi della classe
generano l'output nella finestra di output . Quando non è
definito, Debug i metodi della classe non vengono compilati
e non viene generato alcun output di debug.

TARGET Stringa che rappresenta il tipo di output per il progetto o


l'impostazione dell'opzione della riga di comando. I valori
possibili di TARGET sono:

-"winexe" per un'applicazione Windows.


-"exe" per un'applicazione console.
-"Library" per una libreria di classi.
-"Module" per un modulo.
-L'opzione -target può essere impostata in Visual Studio
Integrated Development Environment. Per ulteriori
informazioni, vedere -target (Visual Basic).

TRACE Boolean Valore che può essere impostato nella finestra di


dialogo Proprietà progetto . Per impostazione predefinita,
tutte le configurazioni per un progetto definiscono TRACE .
Quando TRACE è definito, Trace i metodi della classe
generano l'output nella finestra di output . Quando non è
definito, Trace i metodi della classe non vengono compilati e
non Trace viene generato alcun output.

VBC_VER Numero che rappresenta la versione di Visual Basic, in Major.


formato secondario .

Costanti di stampa e visualizzazione


Quando si chiamano funzioni di stampa e visualizzazione, è possibile usare le costanti seguenti nel codice al
posto dei valori effettivi.
C O N STA N T DESC RIZ IO N E

vbCrLf Combinazione di caratteri ritorno a capo/avanzamento riga.

vbCr Carattere di ritorno a capo.

vbLf Carattere di avanzamento riga.

vbNewLine Carattere di nuova riga.

vbNullChar Carattere null.

vbNullString Non è uguale a una stringa di lunghezza zero (""); utilizzato


per la chiamata di stored procedure esterne.

vbObjectError Numero di errore. I numeri errore definiti dall'utente devono


essere maggiori di questo valore. Ad esempio:

Err.Raise(Number) = vbObjectError + 1000

vbTab Carattere di tabulazione.

vbBack Carattere backspace.

vbFormFeed Non utilizzato in Microsoft Windows.

vbVerticalTab Non è utile in Microsoft Windows.

Enumerazioni
Nella tabella seguente vengono elencate e descritte le enumerazioni fornite da Visual Basic.

EN UM ERA Z IO N E DESC RIZ IO N E

AppWinStyle Indica lo stile della finestra da utilizzare per il programma


richiamato quando viene chiamata la funzione Shell.

AudioPlayMode Indica come riprodurre i suoni quando vengono chiamati i


metodi audio.

BuiltInRole Indica il tipo di ruolo da controllare quando viene chiamato il


metodo IsInRole.

CallType Indica il tipo di routine da richiamare quando viene chiamata


la funzione CallByName.

CompareMethod Indica come confrontare le stringhe quando si chiamano


funzioni di confronto.

DateFormat Indica come visualizzare le date quando si chiama la funzione


FormatDateTime.
EN UM ERA Z IO N E DESC RIZ IO N E

DateInterval Indica come determinare e formattare gli intervalli di date


quando si chiamano funzioni relative alle date.

DeleteDirectoryOption Specifica le azioni da intraprendere quando si deve eliminare


una directory contenente file o directory.

DueDate Indica le scadenze dei pagamenti quando vengono chiamati i


metodi finanziari.

FieldType Indica se i campi di testo sono delimitati o a larghezza fissa.

FileAttribute Indica gli attributi file da utilizzare quando si chiamano


funzioni di accesso ai file.

FirstDayOfWeek Indica il primo giorno della settimana da utilizzare quando si


chiamano funzioni relative alla data.

FirstWeekOfYear Indica la prima settimana dell'anno da utilizzare quando si


chiamano funzioni relative alla data.

MsgBoxResult Indica il pulsante su cui è stato fatto clic in una finestra di


messaggio restituita dalla funzione MsgBox.

MsgBoxStyle Indica i pulsanti da visualizzare durante la chiamata alla


funzione MsgBox.

OpenAccess Indica la modalità di apertura del file quando si chiamano le


funzioni di accesso ai file.

OpenMode Indica la modalità di apertura del file quando si chiamano le


funzioni di accesso ai file.

OpenShare Indica la modalità di apertura del file quando si chiamano le


funzioni di accesso ai file.

RecycleOption Specifica se è necessario eliminare in modo permanente un


file o posizionarlo nel Cestino.

SearchOption Specifica se eseguire la ricerca in tutte le directory o solo in


quelle di primo livello.

TriState Indica un Boolean valore o se è necessario utilizzare


l'oggetto predefinito quando si chiamano le funzioni di
formattazione dei numeri.

UICancelOption Specifica le operazioni da eseguire se l'utente fa clic su


Annulla durante un'operazione.

UIOption Specifica se visualizzare o meno una finestra di dialogo di


stato durante la copia, l'eliminazione o lo sviluppo di file o
directory.

VariantType Indica il tipo di un oggetto Variant restituito dalla funzione


VarType.
EN UM ERA Z IO N E DESC RIZ IO N E

VbStrConv Indica il tipo di conversione da eseguire quando si chiama la


funzione StrConv.

Vedi anche
Riferimenti al linguaggio Visual Basic
Cenni preliminari sulle costanti
Cenni preliminari sulle enumerazioni
Riepilogo dei tipi di dati (Visual Basic)
05/03/2021 • 7 minutes to read • Edit Online

La tabella seguente illustra i tipi di dati Visual Basic, i tipi di Common Language Runtime di supporto,
l'allocazione nominale dello spazio di archiviazione e i relativi intervalli di valori.

ST RUT T URA DEL T IP O A L LO C A Z IO N E DI SPA Z IO DI


C O M M O N L A N GUA GE A RC H IVIA Z IO N E
T IP O DI VISUA L B A SIC RUN T IM E N O M IN A L E IN T ERVA L LO DI VA LO RI

Boolean Boolean Dipende dalla piattaforma True o False


di implementazione

Byte Byte 1 byte da 0 a 255 (senza segno)

Char (carattere singolo) Char 2 byte da 0 a 65535 (senza segno)

Data DateTime 8 byte 0:00:00 (mezzanotte) il 1 °


gennaio 0001-11:59:59 PM
il 31 dicembre 9999

Decimale Decimal 16 byte da 0 a +/-


79.228.162.514.264.337.59
3.543.950.335 (+/-7.9...E +
28) † senza virgola decimale;
da 0 a +/-
7.92281625142643375935
43950335 con 28 posizioni
a destra del separatore
decimale;

il numero più piccolo


diverso da zero è +/-
0,00000000000000000000
00000001 (+/-1E-28) †

Double (a virgola mobile a Double 8 byte -1.79769313486231570 e


precisione doppia) + 308 a-
4.94065645841246544 E-
324 † per i valori negativi;

4.94065645841246544 e-
324 tramite
1.79769313486231570 E +
308 † per i valori positivi

Integer Int32 4 byte da-2.147.483.648 a


2.147.483.647 (con segno)

Long (Long Integer) Int64 8 byte da-


9.223.372.036.854.775.808
a
9.223.372.036.854.775.807
(9.2... E + 18 †) (con segno)
ST RUT T URA DEL T IP O A L LO C A Z IO N E DI SPA Z IO DI
C O M M O N L A N GUA GE A RC H IVIA Z IO N E
T IP O DI VISUA L B A SIC RUN T IM E N O M IN A L E IN T ERVA L LO DI VA LO RI

Object Object classe 4 byte sulla piattaforma a Qualsiasi tipo può essere
32 bit archiviato in una variabile di
tipo Object
8 byte sulla piattaforma a
64 bit

SByte SByte 1 byte da-128 a 127 (con segno)

Short (valore short Integer) Int16 2 byte da-32.768 a 32.767 (con


segno)

Single (virgola mobile a Single 4 byte -3.4028235 e + 38-


precisione singola) 401298E E-45 † per i valori
negativi;

401298E e-45 tramite


3.4028235 E + 38 † per i
valori positivi

Stringa (a lunghezza String classe Dipende dalla piattaforma da 0 a circa 2 miliardi


variabile) di implementazione caratteri Unicode

UInteger UInt32 4 byte da 0 a 4.294.967.295


(senza segno)

ULong UInt64 8 byte da 0 a


18.446.744.073.709.551.61
5 (1.8... E + 19 †) (senza
segno)

Definito dall'utente (eredita da ValueType ) Dipende dalla piattaforma Ogni membro della
(struttura) di implementazione struttura ha un intervallo
determinato dal tipo di dati
e indipendente dagli
intervalli degli altri membri

UShort UInt16 2 byte da 0 a 65.535 (senza segno)

†Nella notazione scientifica"E" si riferisce a una potenza di 10. Quindi 3.56 E + 2 significa 3,56 x 102 o 356 e 3.56
e-2 indica 3,56/102 o 0,0356.

NOTE
Per le stringhe contenenti testo, usare la StrConv funzione per convertire un formato di testo in un altro.

Oltre a specificare un tipo di dati in un'istruzione di dichiarazione, è possibile forzare il tipo di dati di alcuni
elementi di programmazione usando un carattere di tipo. Vedere caratteri di tipo.

Consumo di memoria
Quando si dichiara un tipo di dati Elementary, non è sicuro supporre che il consumo di memoria corrisponda a
quello dell'allocazione nominale di archiviazione. Questo problema è dovuto alle considerazioni seguenti:
Assegnazione di archiviazione. Il Common Language Runtime può assegnare lo spazio di
archiviazione in base alle caratteristiche correnti della piattaforma in cui è in esecuzione l'applicazione. Se
la memoria è quasi piena, potrebbe comprimere gli elementi dichiarati nel più vicino possibile. In altri
casi, è possibile allineare gli indirizzi di memoria ai limiti hardware naturali per ottimizzare le prestazioni.
Larghezza della piattaforma. L'assegnazione di archiviazione in una piattaforma a 64 bit è diversa
dall'assegnazione in una piattaforma a 32 bit.
Tipi di dati compositi
Le stesse considerazioni si applicano a ogni membro di un tipo di dati composito, ad esempio una struttura o
una matrice. Non è possibile basarsi semplicemente sull'aggiunta delle allocazioni di archiviazione nominale dei
membri del tipo. Sono inoltre presenti altre considerazioni, ad esempio le seguenti:
Overhead. Alcuni tipi compositi hanno requisiti di memoria aggiuntivi. Una matrice, ad esempio, utilizza
memoria aggiuntiva per la matrice stessa, nonché per ogni dimensione. In una piattaforma a 32 bit,
questo overhead è attualmente di 12 byte più 8 byte per ogni dimensione. In una piattaforma a 64 bit
questo requisito è raddoppiato.
Layout di archiviazione. Non è possibile presupporre in modo sicuro che l'ordine di archiviazione in
memoria corrisponda a quello dell'ordine di dichiarazione. Non è inoltre possibile creare presupposti
sull'allineamento dei byte, ad esempio un limite di 2 o 4 byte. Se si definisce una classe o una struttura ed
è necessario controllare il layout di archiviazione dei relativi membri, è possibile applicare l'
StructLayoutAttribute attributo alla classe o alla struttura.
Overhead oggetto
Un Object riferimento a un tipo di dati elementare o composito utilizza 4 byte oltre ai dati contenuti nel tipo di
dati.

Vedi anche
StrConv
StructLayoutAttribute
CString
Riepilogo della conversione
Caratteri tipo
Utilizzo efficiente dei tipi di dati
Tipo di dati Boolean (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Include valori che possono essere solo True o False . Le parole chiave True e False corrispondono ai due
stati di Boolean variabili.

Commenti
Usare il tipo di dati booleano (Visual Basic) per contenere valori a due Stati, ad esempio true/false, Yes/No o
on/off.
Il valore predefinito di Boolean è False .
Boolean i valori non vengono archiviati come numeri e i valori archiviati non sono destinati a essere equivalenti
ai numeri. Non scrivere mai codice che si basa su valori numerici equivalenti per True e False . Laddove
possibile, è consigliabile limitare l'utilizzo delle Boolean variabili ai valori logici per i quali sono stati progettati.

Conversione di tipi
Quando Visual Basic converte i valori del tipo di dati numerico in Boolean , 0 diventa False e tutti gli altri
valori diventano True . Quando Visual Basic converte Boolean i valori in tipi numerici, False diventa 0 e True
diventa-1.
Quando si esegue la conversione tra Boolean valori e tipi di dati numerici, tenere presente che i metodi di
conversione .NET Framework non producono sempre gli stessi risultati delle parole chiave di conversione di
Visual Basic. Ciò è dovuto al fatto che la conversione Visual Basic mantiene il comportamento compatibile con le
versioni precedenti. Per ulteriori informazioni, vedere "il tipo booleano non viene convertito in un tipo numerico
con precisione" nella risoluzione dei problemirelativi ai tipi di dati.

Suggerimenti per la programmazione


Numeri negativi. Boolean non è un tipo numerico e non può rappresentare un valore negativo. In ogni
caso, è consigliabile non usare Boolean per mantenere i valori numerici.
Digitare i caratteri. Boolean non ha un carattere di tipo letterale o un carattere di tipo identificatore.
Tipo di framework . Il tipo corrispondente in .NET Framework è la struttura System.Boolean.

Esempio
Nell'esempio seguente runningVB è una Boolean variabile che archivia una semplice impostazione Yes/No.

Dim runningVB As Boolean


' Check to see if program is running on Visual Basic engine.
If scriptEngine = "VB" Then
runningVB = True
End If

Vedi anche
System.Boolean
Tipi di dati
CString
Riepilogo della conversione
Utilizzo efficiente dei tipi di dati
Risoluzione dei problemi relativi ai tipi di dati
CType Function
Tipo di dati byte (Visual Basic)
05/03/2021 • 5 minutes to read • Edit Online

Include interi senza segno a 8 bit (1 byte) che variano in valore compreso tra 0 e 255.

Commenti
Utilizzare il Byte tipo di dati per contenere dati binari.
Il valore predefinito di Byte è 0.

Assegnazioni di valori letterali


È possibile dichiarare e inizializzare una variabile assegnandogli un valore letterale Byte decimale, un valore
letterale esadecimale, un valore letterale ottale o (a partire da Visual Basic 2017) un valore letterale binario. Se il
valore letterale integrale non è compreso nell'intervallo di un oggetto, Byte ovvero se è minore di
Byte.MinValue o maggiore di Byte.MaxValue , si verifica un errore di compilazione.
Nell'esempio seguente, i numeri interi uguali a 201 rappresentati come valori letterali decimali, esadecimali e
binari vengono convertiti in modo implicito da Integer a byte valori.

Dim byteValue1 As Byte = 201


Console.WriteLine(byteValue1)

Dim byteValue2 As Byte = &H00C9


Console.WriteLine(byteValue2)

Dim byteValue3 As Byte = &B1100_1001


Console.WriteLine(byteValue3)
' The example displays the following output:
' 201
' 201
' 201

NOTE
Usare il prefisso &h o &H per indicare un valore letterale esadecimale, il prefisso &b o &B per indicare un valore
letterale binario e il prefisso &o o &O per indicare un valore letterale ottale. I valori letterali decimali non hanno prefissi.

A partire da Visual Basic 2017, è anche possibile usare il carattere di sottolineatura, _ , come separatore di cifre
per migliorare la leggibilità, come illustrato nell'esempio seguente.

Dim byteValue3 As Byte = &B1100_1001


Console.WriteLine(byteValue3)
' The example displays the following output:
' 201

A partire da Visual Basic 15,5, è anche possibile usare il carattere di sottolineatura ( _ ) come separatore iniziale
tra il prefisso e le cifre esadecimali, binarie o ottali. Ad esempio:
Dim number As Byte = &H_6A

Per usare il carattere di sottolineatura come separatore iniziale, è necessario aggiungere l'elemento seguente al
file di progetto (*.vbproj) di Visual Basic:

<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>

Per ulteriori informazioni, vedere Impostazione della versione del linguaggio Visual Basic.

Suggerimenti per la programmazione


Numeri negativi. Poiché Byte è un tipo senza segno, non può rappresentare un numero negativo. Se si
usa l'operatore unario meno ( - ) su un'espressione che restituisce il tipo Byte , Visual Basic converte
prima l'espressione in Short .
Conversioni di formato. Quando Visual Basic legge o scrive file oppure quando chiama dll, metodi e
proprietà, può eseguire automaticamente la conversione tra i formati di dati. I dati binari archiviati in
Byte variabili e matrici vengono conservati durante tali conversioni di formato. Non usare una String
variabile per i dati binari, perché il relativo contenuto può essere danneggiato durante la conversione tra i
formati ANSI e Unicode.
Conversioni. Il Byte tipo di dati viene ampliato in Short , UShort , Integer , UInteger , Long ,
ULong , Decimal , Single o Double . Ciò significa che è possibile Byte eseguire la conversione in uno
di questi tipi senza riscontrare un System.OverflowException errore.
Digitare i caratteri. Byte non ha un carattere di tipo letterale o un carattere di tipo identificatore.
Tipo di framework . Il tipo corrispondente in .NET Framework è la struttura System.Byte.

Esempio
Nell'esempio seguente b è una Byte variabile. Le istruzioni illustrano l'intervallo della variabile e
l'applicazione degli operatori di spostamento di bit.
' The valid range of a Byte variable is 0 through 255.
Dim b As Byte
b = 30
' The following statement causes an error because the value is too large.
'b = 256
' The following statement causes an error because the value is negative.
'b = -5
' The following statement sets b to 6.
b = CByte(5.7)

' The following statements apply bit-shift operators to b.


' The initial value of b is 6.
Console.WriteLine(b)
' Bit shift to the right divides the number in half. In this
' example, binary 110 becomes 11.
b >>= 1
' The following statement displays 3.
Console.WriteLine(b)
' Now shift back to the original position, and then one more bit
' to the left. Each shift to the left doubles the value. In this
' example, binary 11 becomes 1100.
b <<= 2
' The following statement displays 12.
Console.WriteLine(b)

Vedi anche
System.Byte
Tipi di dati
CString
Riepilogo della conversione
Utilizzo efficiente dei tipi di dati
Tipo di dati Char (Visual Basic)
05/03/2021 • 5 minutes to read • Edit Online

Include punti di codice senza segno a 16 bit (2 byte) compresi tra 0 e 65535. Ogni punto di codice, o codice
carattere, rappresenta un singolo carattere Unicode.

Commenti
Utilizzare il Char tipo di dati quando è necessario mantenere un solo carattere e non è necessario il
sovraccarico di String . In alcuni casi è possibile usare Char() , una matrice di Char elementi, per mantenere
più caratteri.
Il valore predefinito di Char è il carattere con un punto di codice 0.

Caratteri Unicode
I primi 128 punti di codice (0-127) di Unicode corrispondono a lettere e simboli in una tastiera standard degli
Stati Uniti. Questi primi 128 punti di codice corrispondono a quelli definiti dal set di caratteri ASCII. I due punti di
codice 128 (128-255) rappresentano caratteri speciali, ad esempio lettere di alfabeto latino, accenti, simboli di
valuta e frazioni. Unicode usa i punti di codice rimanenti (256-65535) per un'ampia gamma di simboli, inclusi i
caratteri testuali in tutto il mondo, i segni diacritici e i simboli matematici e tecnici.
È possibile utilizzare metodi quali IsDigit e IsPunctuation su una Char variabile per determinare la relativa
classificazione Unicode.

Conversione di tipi
Visual Basic non esegue la conversione direttamente tra Char e i tipi numerici. È possibile utilizzare la Asc AscW
funzione o per convertire un Char valore in un oggetto Integer che rappresenta il punto di codice. È possibile
usare la Chr ChrW funzione o per convertire un Integer valore in un oggetto con Char tale punto di codice.
Se l'opzione di controllo del tipo (l' istruzione Option Strict) è impostata su on, è necessario aggiungere il
carattere di tipo letterale a un valore letterale stringa a carattere singolo per identificarlo come Char tipo di dati.
Questa condizione è illustrata nell'esempio seguente. La prima assegnazione alla charVar variabile genera
l'errore del compilatore BC30512 perché Option Strict è on. Il secondo compila correttamente perché il c
carattere di tipo letterale identifica il valore letterale come Char valore.

Option Strict On

Module CharType
Public Sub Main()
Dim charVar As Char

' This statement generates compiler error BC30512 because Option Strict is On.
charVar = "Z"

' The following statement succeeds because it specifies a Char literal.


charVar = "Z"c
End Sub
End Module
Suggerimenti per la programmazione
Numeri negativi. Char è un tipo senza segno e non può rappresentare un valore negativo. In ogni
caso, è consigliabile non usare Char per mantenere i valori numerici.
Considerazioni sull'interoperabilità. Se si interfaccia con componenti non scritti per il .NET
Framework, ad esempio oggetti COM o di automazione, tenere presente che i tipi di carattere hanno una
larghezza dati diversa (8 bit) in altri ambienti. Se si passa un argomento a 8 bit a tale componente,
dichiararlo come Byte anziché Char nel nuovo codice Visual Basic.
Conversioni. Il Char tipo di dati viene ampliato a String . Ciò significa che è possibile convertire Char
in String e non si verificherà un oggetto System.OverflowException .
Digitare i caratteri. L'aggiunta del carattere di tipo letterale C a un valore letterale stringa a carattere
singolo lo impone al Char tipo di dati. Char non ha un carattere di tipo identificatore.
Tipo di framework . Il tipo corrispondente in .NET Framework è la struttura System.Char.

Vedi anche
System.Char
Asc
AscW
Chr
ChrW
Tipi di dati
Tipo di dati String
CString
Riepilogo della conversione
Procedura: Chiamare una funzione Windows che accetta tipi senza segno
Utilizzo efficiente dei tipi di dati
Tipo di dati Date (Visual Basic)
05/03/2021 • 6 minutes to read • Edit Online

Contiene valori a 64 bit (8 byte) conformi alle specifiche IEEE che rappresentano le date comprese tra l'1
gennaio dell'anno 0001 e il 31 dicembre dell'anno 9999 e le ore comprese tra le 00.00.00 (mezzanotte) e le
23.59.59.9999999. Ogni incremento rappresenta 100 nanosecondi di tempo trascorso dall'inizio del 1° gennaio
dell'anno 1 del calendario gregoriano. Il valore massimo rappresenta 100 nanosecondi prima dell'inizio del 1°
gennaio dell'anno 10000.

Commenti
Usare il tipo di dati Date per contenere valori di data, di ora o entrambi.
Il valore predefinito di Date è 00.00.00 (mezzanotte) del 1° gennaio 0001.
È possibile ottenere la data e l'ora corrente dalla classe DateAndTime.

Requisiti di formato
È necessario racchiudere un valore letterale Date tra simboli di cancelletto ( # # ). Il valore della data deve
essere specificato nel formato M/g/aaaa, ad esempio #5/31/1993# , oppure aaaa-MM-gg, ad esempio
#1993-5-31# . Quando si specifica prima l'anno, è possibile usare le barre. Questo requisito è indipendente dalle
impostazioni locali usate e dalle impostazioni relative al formato di data e ora del computer.
Il motivo di questa limitazione è che il significato del codice non deve mai cambiare a seconda delle
impostazioni locali con cui l'applicazione viene eseguita. Si supponga di impostare come hardcoded il valore
letterale Date``#3/4/1998# per rappresentare la data del 4 marzo 1998. Se nelle impostazioni locali è definito il
formato mm/gg/aaaa, la compilazione di 3/4/1998 viene eseguita nel modo desiderato. Si supponga, tuttavia, di
distribuire l'applicazione in molti paesi o aree geografiche. Se nelle impostazioni locali è definito il formato
gg/mm/aaaa, il valore letterale hardcoded verrà compilato come 3 aprile 1998. Se invece è definito il formato
aaaa/mm/gg, il valore letterale non sarà valido (1998 aprile 0003) e verrà generato un errore del compilatore.

Soluzioni alternative
Per convertire un valore letterale Date nel formato delle impostazioni locali in uso o in un formato
personalizzato, fornire il valore letterale alla funzione Format, specificando un formato di data predefinito o
definito dall'utente. L'esempio seguente illustra questa operazione.

MsgBox("The formatted date is " & Format(#5/31/1993#, "dddd, d MMM yyyy"))

In alternativa, si può usare uno dei costruttori di overload della struttura DateTime per assemblare un valore di
data e ora. L'esempio seguente crea un valore per rappresentare le ore 12.14 del 31 maggio 1993.

Dim dateInMay As New System.DateTime(1993, 5, 31, 12, 14, 0)

Formato dell'ora
È possibile specificare il valore dell'ora nel formato 12 o 24 ore, ad esempio #1:15:30 PM# o #13:15:30# .
Tuttavia, se non si specificano i minuti o i secondi, è necessario indicare AM o PM.
Valori predefiniti di data e ora
Se non si include una data in un valore letterale di data/ora, Visual Basic imposta la parte del valore relativa alla
data sul 1° gennaio 0001. Se non si include un'ora in un valore letterale di data/ora, Visual Basic imposta la
parte del valore relativa all'ora sull'inizio della giornata, ossia mezzanotte (00.00.00).

Conversione di tipi
Se un valore Date viene convertito nel tipo String , Visual Basic esegue il rendering della data e dell'ora
rispettivamente in base al formato breve e al formato 12 o 24 ore specificati nelle impostazioni locali di runtime.

Suggerimenti per la programmazione


Considerazioni sull'interoperabilità. Se si prevede l'interazione con componenti non scritti per .NET
Framework, ad esempio oggetti COM o di automazione, tenere presente che i tipi di data/ora in altri
ambienti non sono compatibili con il tipo Date di Visual Basic. Se si passa un argomento di data/ora a un
componente di questo tipo, nel nuovo codice Visual Basic è necessario dichiararlo come Double anziché
come Date e usare i metodi di conversione DateTime.FromOADate e DateTime.ToOADate.
Digitare i caratteri. Date non ha un carattere di tipo letterale o un carattere di tipo identificatore. Il
compilatore considera tuttavia i valori letterali racchiusi tra simboli del cancelletto ( # # ) come valori
Date .

Tipo di framework . Il tipo corrispondente in .NET Framework è la struttura System.DateTime.

Esempio
Una variabile o una costante del tipo di dati Date contiene sia la data che l'ora. Questa condizione è illustrata
nell'esempio seguente.

Dim someDateAndTime As Date = #8/13/2002 12:14 PM#

Vedi anche
System.DateTime
Tipi di dati
Stringhe di formato di data e ora standard
Stringhe di formato di data e ora personalizzato
CString
Riepilogo della conversione
Utilizzo efficiente dei tipi di dati
Tipo di dati Decimal (Visual Basic)
05/03/2021 • 5 minutes to read • Edit Online

Contiene valori Signed a 128 bit (16 byte) che rappresentano numeri di tipo Integer a 96 bit (12 byte) scalati in
base a una potenza variabile di 10. Il fattore di scala specifica il numero di cifre a destra del separatore decimale.
l'intervallo è compreso tra 0 e 28. Con una scala pari a 0 (senza posizioni decimali), il valore massimo possibile è
+/-79.228.162.514.264.337.593.543.950.335 (+/-7.9228162514264337593543950335E + 28). Con 28 cifre
decimali, il valore più grande è +/-7.9228162514264337593543950335 e il valore diverso da zero è +/-
0,0000000000000000000000000001 (+/-1E-28).

Commenti
Il Decimal tipo di dati fornisce il maggior numero di cifre significative per un numero. Supporta fino a 29 cifre
significative e può rappresentare valori superiori a 7,9228 x 10 ^ 28. È particolarmente adatto per i calcoli, ad
esempio Financial, che richiedono un numero elevato di cifre ma non tollerano errori di arrotondamento.
Il valore predefinito di Decimal è 0.

Suggerimenti per la programmazione


Precisione. Decimal non è un tipo di dati a virgola mobile. La Decimal struttura include un valore
intero binario, insieme a un bit di segno e a un fattore di scala integer che specifica quale parte del valore
è una frazione decimale. Per questo motivo, i Decimal numeri presentano una rappresentazione più
precisa in memoria rispetto ai tipi a virgola mobile ( Single e Double ).
Prestazioni. Il Decimal tipo di dati è il più lento di tutti i tipi numerici. Prima di scegliere un tipo di dati, è
necessario valutare l'importanza della precisione rispetto alle prestazioni.
Conversioni. Il Decimal tipo di dati viene convertito in Single o Double . Ciò significa che è possibile
Decimal eseguire la conversione in uno di questi tipi senza riscontrare un System.OverflowException
errore.
Zeri finali. Visual Basic non archivia gli zeri finali in un Decimal valore letterale. Una variabile, tuttavia,
Decimal conserva gli zeri finali acquisiti in modo computazionale. Questa condizione è illustrata
nell'esempio seguente.

Dim d1, d2, d3, d4 As Decimal


d1 = 2.375D
d2 = 1.625D
d3 = d1 + d2
d4 = 4.000D
MsgBox("d1 = " & CStr(d1) & ", d2 = " & CStr(d2) &
", d3 = " & CStr(d3) & ", d4 = " & CStr(d4))

L'output di MsgBox nell'esempio precedente è il seguente:

d1 = 2.375, d2 = 1.625, d3 = 4.000, d4 = 4

Digitare i caratteri. Aggiungendo il carattere di tipo letterale D a un valore letterale, se ne determina


la conversione nel tipo di dati Decimal . Aggiungendo il carattere identificatore di tipo @ a qualsiasi
identificatore, se ne determina la conversione al tipo di dati Decimal .
Tipo di framework . Il tipo corrispondente in .NET Framework è la struttura System.Decimal.

Range
Potrebbe essere necessario usare il D carattere tipo per assegnare un valore di grandi dimensioni a una
Decimal variabile o a una costante. Questo requisito è dovuto al fatto che il compilatore interpreta un valore
letterale come a Long meno che un carattere di tipo letterale non segua il valore letterale, come illustrato
nell'esempio seguente.

Dim bigDec1 As Decimal = 9223372036854775807 ' No overflow.


Dim bigDec2 As Decimal = 9223372036854775808 ' Overflow.
Dim bigDec3 As Decimal = 9223372036854775808D ' No overflow.

La dichiarazione per bigDec1 non produce un overflow perché il valore assegnato è compreso nell'intervallo
per Long . Il Long valore può essere assegnato alla Decimal variabile.
La dichiarazione per bigDec2 genera un errore di overflow perché il valore assegnato è troppo grande per
Long . Poiché il valore letterale numerico non può essere prima interpretato come Long , non può essere
assegnato alla Decimal variabile.
Per bigDec3 , il carattere di tipo letterale D risolve il problema forzando il compilatore a interpretare il valore
letterale come Decimal anziché come Long .

Vedi anche
System.Decimal
Decimal
Math.Round
Tipi di dati
Tipo di dati Single
Tipo di dati Double
CString
Riepilogo della conversione
Utilizzo efficiente dei tipi di dati
Tipo di dati Double (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Include numeri a virgola mobile a precisione doppia IEEE a 64 bit (8 byte) che variano in base al valore da-
1.79769313486231570 E + 308 a-4.94065645841246544 E-324 per i valori negativi e da
4.94065645841246544 E-324 a 1.79769313486231570 E + 308 per i valori positivi. I numeri a precisione
doppia archiviano un'approssimazione di un numero reale.

Commenti
Il Double tipo di dati fornisce le Magnitude più grandi e minime possibili per un numero.
Il valore predefinito di Double è 0.

Suggerimenti per la programmazione


Precisione. Quando si utilizzano numeri a virgola mobile, tenere presente che non sempre hanno una
rappresentazione precisa in memoria. Questo può causare risultati imprevisti di determinate operazioni,
ad esempio il confronto dei valori e l' Mod operatore. Per ulteriori informazioni, vedere risoluzione dei
problemirelativi ai tipi di dati.
Zeri finali. I tipi di dati a virgola mobile non hanno alcuna rappresentazione interna di caratteri zero
finali. Ad esempio, non si distinguono tra 4,2000 e 4,2. Di conseguenza, i caratteri zero finali non vengono
visualizzati quando si visualizzano o stampano valori a virgola mobile.
Digitare i caratteri. Aggiungendo il carattere di tipo letterale R a un valore letterale, se ne determina
la conversione nel tipo di dati Double . Se, ad esempio, un valore integer è seguito da R , il valore viene
modificato in un oggetto Double .

' Visual Basic expands the 4 in the statement Dim dub As Double = 4R to 4.0:
Dim dub As Double = 4.0R

Aggiungendo il carattere identificatore di tipo # a qualsiasi identificatore, se ne determina la


conversione al tipo di dati Double . Nell'esempio seguente la variabile num è tipizzata come Double :

Dim num# = 3

Tipo di framework . Il tipo corrispondente in .NET Framework è la struttura System.Double.

Vedi anche
System.Double
Tipi di dati
Tipo di dati Decimal
Tipo di dati Single
CString
Riepilogo della conversione
Utilizzo efficiente dei tipi di dati
Risoluzione dei problemi relativi ai tipi di dati
Caratteri tipo
Tipo di dati Integer (Visual Basic)
05/03/2021 • 6 minutes to read • Edit Online

Contiene valori integer con segno a 32 bit (4 byte) in un intervallo compreso tra -2.147.483.648 e
2.147.483.647.

Commenti
Il tipo di dati Integer consente di ottenere prestazioni ottimali su processori a 32 bit. Gli altri tipi integrali
vengono caricati e memorizzati più lentamente.
Il valore predefinito di Integer è 0.

Assegnazioni di valori letterali


È possibile dichiarare e inizializzare una Integer variabile assegnandogli un valore letterale decimale, un valore
letterale esadecimale, un valore letterale ottale o (a partire da Visual Basic 2017) un valore letterale binario. Se il
valore letterale integer è esterno all'intervallo di Integer , vale a dire se è minore di Int32.MinValue o maggiore
di Int32.MaxValue, si verifica un errore di compilazione.
Nell'esempio seguente, i valori interi uguali a 90.946 rappresentati come valori letterali decimali, esadecimali o
binari vengono assegnati a valori Integer .

Dim intValue1 As Integer = 90946


Console.WriteLine(intValue1)
Dim intValue2 As Integer = &H16342
Console.WriteLine(intValue2)

Dim intValue3 As Integer = &B0001_0110_0011_0100_0010


Console.WriteLine(intValue3)
' The example displays the following output:
' 90946
' 90946
' 90946

NOTE
Usare il prefisso &h o &H per indicare un valore letterale esadecimale, il prefisso &b o &B per indicare un valore
letterale binario e il prefisso &o o &O per indicare un valore letterale ottale. I valori letterali decimali non hanno prefissi.

A partire da Visual Basic 2017, è anche possibile usare il carattere di sottolineatura, _ , come separatore di cifre
per migliorare la leggibilità, come illustrato nell'esempio seguente.
Dim intValue1 As Integer = 90_946
Console.WriteLine(intValue1)

Dim intValue2 As Integer = &H0001_6342


Console.WriteLine(intValue2)

Dim intValue3 As Integer = &B0001_0110_0011_0100_0010


Console.WriteLine(intValue3)
' The example displays the following output:
' 90946
' 90946
' 90946

A partire da Visual Basic 15,5, è anche possibile usare il carattere di sottolineatura ( _ ) come separatore iniziale
tra il prefisso e le cifre esadecimali, binarie o ottali. Ad esempio:

Dim number As Integer = &H_C305_F860

Per usare il carattere di sottolineatura come separatore iniziale, è necessario aggiungere l'elemento seguente al
file di progetto (*.vbproj) di Visual Basic:

<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>

Per ulteriori informazioni, vedere Impostazione della versione del linguaggio Visual Basic.
I valori letterali numerici possono includere anche il I carattere tipo per indicare il Integer tipo di dati, come
illustrato nell'esempio seguente.

Dim number = &H_035826I

Suggerimenti per la programmazione


Considerazioni sull'interoperabilità. Se si interagisce con componenti non scritti per il .NET
Framework, ad esempio oggetti COM o di automazione, tenere presente che Integer in altri ambienti è
presente una larghezza dei dati diversa (16 bit). Se si passa un argomento a 16 bit a un componente di
questo tipo, nel nuovo codice Visual Basic è necessario eseguirne la dichiarazione come Short anziché
come Integer .
Conversioni. Il tipo di dati Integer può ampliarsi nel tipo Long , Decimal , Single o Double .È
pertanto possibile convertire Integer in uno di questi tipi senza generare un errore
System.OverflowException.
Digitare i caratteri. Aggiungendo il carattere di tipo letterale I a un valore letterale, se ne determina
la conversione nel tipo di dati Integer . Aggiungendo il carattere identificatore di tipo % a qualsiasi
identificatore, se ne determina la conversione al tipo di dati Integer .
Tipo di framework . Il tipo corrispondente in .NET Framework è la struttura System.Int32.

Range
Se si tenta di impostare una variabile di un tipo integrale su un numero esterno all'intervallo valido per tale tipo,
verrà generato un errore. Se si tenta di impostarlo in una frazione, il numero viene arrotondato all'intero pari
più vicino. Se il numero è egualmente vicino a due valori interi, il valore viene arrotondato all'intero pari più
vicino. Questo comportamento riduce al minimo gli errori di arrotondamento risultanti dall'arrotondamento
coerente di un valore del punto centrale in una singola direzione. Nel codice riportato di seguito vengono
illustrati esempi di arrotondamento.

' The valid range of an Integer variable is -2147483648 through +2147483647.


Dim k As Integer
' The following statement causes an error because the value is too large.
k = 2147483648
' The following statement sets k to 6.
k = 5.9
' The following statement sets k to 4
k = 4.5
' The following statement sets k to 6
' Note, Visual Basic uses banker’s rounding (toward nearest even number)
k = 5.5

Vedi anche
System.Int32
Tipi di dati
Tipo di dati Long
Tipo di dati Short
CString
Riepilogo della conversione
Utilizzo efficiente dei tipi di dati
Tipo di dati Long (Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

Include interi con segno a 64 bit (8 byte) compresi tra-9.223.372.036.854.775.808 E 9.223.372.036.854.775.807


(9.2... E + 18).

Commenti
Utilizzare il Long tipo di dati per contenere numeri interi troppo grandi per il tipo di Integer dati.
Il valore predefinito di Long è 0.

Assegnazioni di valori letterali


È possibile dichiarare e inizializzare una variabile assegnandogli un valore letterale Long decimale, un valore
letterale esadecimale, un valore letterale ottale o (a partire da Visual Basic 2017) un valore letterale binario. Se il
valore letterale integer è esterno all'intervallo di Long , vale a dire se è minore di Int64.MinValue o maggiore di
Int64.MaxValue, si verifica un errore di compilazione.
Nell'esempio seguente, i valori interi uguali a 4.294.967.296 rappresentati come valori letterali decimali,
esadecimali o binari vengono assegnati a valori Long .

Dim longValue1 As Long = 4294967296


Console.WriteLine(longValue1)

Dim longValue2 As Long = &H100000000


Console.WriteLine(longValue2)

Dim longValue3 As Long = &B1_0000_0000_0000_0000_0000_0000_0000_0000


Console.WriteLine(longValue3)
' The example displays the following output:
' 4294967296
' 4294967296
' 4294967296

NOTE
Usare il prefisso &h o &H per indicare un valore letterale esadecimale, il prefisso &b o &B per indicare un valore
letterale binario e il prefisso &o o &O per indicare un valore letterale ottale. I valori letterali decimali non hanno prefissi.

A partire da Visual Basic 2017, è anche possibile usare il carattere di sottolineatura, _ , come separatore di cifre
per migliorare la leggibilità, come illustrato nell'esempio seguente.
Dim longValue1 As Long = 4_294_967_296
Console.WriteLine(longValue1)

Dim longValue2 As Long = &H1_0000_0000


Console.WriteLine(longValue2)

Dim longValue3 As Long = &B1_0000_0000_0000_0000_0000_0000_0000_0000


Console.WriteLine(longValue3)
' The example displays the following output:
' 4294967296
' 4294967296
' 4294967296

A partire da Visual Basic 15,5, è anche possibile usare il carattere di sottolineatura ( _ ) come separatore iniziale
tra il prefisso e le cifre esadecimali, binarie o ottali. Ad esempio:

Dim number As Long = &H_0FAC_0326_1489_D68C

Per usare il carattere di sottolineatura come separatore iniziale, è necessario aggiungere l'elemento seguente al
file di progetto (*.vbproj) di Visual Basic:

<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>

Per ulteriori informazioni, vedere Impostazione della versione del linguaggio Visual Basic.
I valori letterali numerici possono includere anche il L carattere tipo per indicare il Long tipo di dati, come
illustrato nell'esempio seguente.

Dim number = &H_0FAC_0326_1489_D68CL

Suggerimenti per la programmazione


Considerazioni sull'interoperabilità. Se si è connessi con componenti non scritti per il .NET
Framework, ad esempio oggetti COM o di automazione, tenere presente che Long in altri ambienti è
presente una larghezza dati diversa (32 bit). Se si passa un argomento a 32 bit a tale componente,
dichiararlo come Integer anziché Long nel nuovo codice Visual Basic.
Conversioni. Il Long tipo di dati viene ampliato in Decimal , Single o Double . È pertanto possibile
convertire Long in uno di questi tipi senza generare un errore System.OverflowException.
Digitare i caratteri. Aggiungendo il carattere di tipo letterale L a un valore letterale, se ne determina
la conversione nel tipo di dati Long . Aggiungendo il carattere identificatore di tipo & a qualsiasi
identificatore, se ne determina la conversione al tipo di dati Long .
Tipo di framework . Il tipo corrispondente in .NET Framework è la struttura System.Int64.

Vedi anche
Int64
Tipi di dati
Tipo di dati Integer
Tipo di dati Short
CString
Riepilogo della conversione
Utilizzo efficiente dei tipi di dati
Object Data Type
05/03/2021 • 5 minutes to read • Edit Online

Include indirizzi che fanno riferimento a oggetti. È possibile assegnare qualsiasi tipo di riferimento (stringa,
matrice, classe o interfaccia) a una Object variabile. Una Object variabile può anche fare riferimento a dati di
qualsiasi tipo di valore (numeric,,,, Boolean Char Date Structure o Enumeration).

Commenti
Il Object tipo di dati può puntare a dati di qualsiasi tipo di dati, inclusa qualsiasi istanza di oggetto riconosciuta
dall'applicazione. Usare Object quando non si conosce in fase di compilazione a quale tipo di dati può puntare
la variabile.
Il valore predefinito di Object è Nothing (un riferimento null).

Tipi di dati
È possibile assegnare una variabile, una costante o un'espressione di qualsiasi tipo di dati a una Object
variabile. Per determinare il tipo di dati Object a cui fa attualmente riferimento una variabile, è possibile usare il
GetTypeCode metodo della System.Type classe. Questa condizione è illustrata nell'esempio seguente.

Dim myObject As Object


' Suppose myObject has now had something assigned to it.
Dim datTyp As Integer
datTyp = Type.GetTypeCode(myObject.GetType())

Il Object tipo di dati è un tipo di riferimento. Tuttavia, Visual Basic considera una Object variabile come tipo di
valore quando fa riferimento ai dati di un tipo di valore.

Archiviazione
Indipendentemente dal tipo di dati a cui fa riferimento, una Object variabile non contiene il valore di dati
stesso, bensì un puntatore al valore. Usa sempre quattro byte nella memoria del computer, ma non include
l'archiviazione per i dati che rappresentano il valore della variabile. A causa del codice che usa il puntatore per
individuare i dati, le Object variabili che mantengono i tipi di valore sono leggermente più lente per accedere
alle variabili tipizzate in modo esplicito.

Suggerimenti per la programmazione


Considerazioni sull'interoperabilità. Se si è connessi con componenti non scritti per il .NET
Framework, ad esempio oggetti COM o di automazione, tenere presente che i tipi di puntatore in altri
ambienti non sono compatibili con il Object tipo di Visual Basic.
Prestazioni. Una variabile dichiarata con il Object tipo è sufficientemente flessibile da contenere un
riferimento a qualsiasi oggetto. Tuttavia, quando si richiama un metodo o una proprietà in una variabile
di questo tipo, si verifica sempre un' associazione tardiva (in fase di esecuzione). Per forzare l'
associazione anticipata (in fase di compilazione) e migliorare le prestazioni, dichiarare la variabile con un
nome di classe specifico oppure eseguirne il cast al tipo di dati specifico.
Quando si dichiara una variabile oggetto, provare a usare un tipo di classe specifico, ad esempio
OperatingSystem , anziché il tipo generalizzato Object . È inoltre consigliabile utilizzare la classe più
specifica disponibile, ad esempio TextBox anziché Control , in modo da poter accedere alle proprietà e ai
metodi. In genere, è possibile usare l'elenco delle classi nella Visualizzatore oggetti per trovare i nomi
delle classi disponibili.
Conversioni. Tutti i tipi di dati e tutti i tipi di riferimento vengono ampliati al Object tipo di dati. Ciò
significa che è possibile convertire qualsiasi tipo in Object senza riscontrare un
System.OverflowException errore.
Tuttavia, se si esegue la conversione tra tipi di valore e Object , Visual Basic esegue operazioni
denominate Boxing e unboxing, che rendono l'esecuzione più lenta.
Digitare i caratteri. Object non ha un carattere di tipo letterale o un carattere di tipo identificatore.
Tipo di framework . Il tipo corrispondente nella .NET Framework è la System.Object classe.

Esempio
Nell'esempio seguente viene illustrata una Object variabile che punta a un'istanza dell'oggetto.

Dim objDb As Object


Dim myCollection As New Collection()
' Suppose myCollection has now been populated.
objDb = myCollection.Item(1)

Vedi anche
Object
Tipi di dati
CString
Riepilogo della conversione
Utilizzo efficiente dei tipi di dati
Procedura: determinare se due oggetti sono correlati
Procedura: determinare se due oggetti sono identici
Tipo di dati SByte (Visual Basic)
05/03/2021 • 6 minutes to read • Edit Online

Include interi con segno a 8 bit (1 byte) compresi tra-128 e 127.

Commenti
Utilizzare il SByte tipo di dati per contenere valori integer che non richiedono la larghezza dei dati completa di
Integer o persino la lunghezza della metà dei dati di Short . In alcuni casi, il Common Language Runtime
potrebbe essere in grado di comprimere le variabili in modo SByte stretto e di risparmiare sull'utilizzo della
memoria.
Il valore predefinito di SByte è 0.

Assegnazioni di valori letterali


È possibile dichiarare e inizializzare una SByte variabile assegnandogli un valore letterale decimale, un valore
letterale esadecimale, un valore letterale ottale o (a partire da Visual Basic 2017) un valore letterale binario.
Nell'esempio seguente, i numeri interi uguali a-102 rappresentati come valori letterali decimali, esadecimali e
binari vengono assegnati ai SByte valori. Questo esempio richiede la compilazione con l' /removeintchecks
opzione del compilatore.

Dim sbyteValue1 As SByte = -102


Console.WriteLine(sbyteValue1)

Dim sbyteValue4 As SByte = &H9A


Console.WriteLine(sbyteValue4)

Dim sbyteValue5 As SByte = &B1001_1010


Console.WriteLine(sbyteValue5)
' The example displays the following output:
' -102
' -102
' -102

NOTE
Usare il prefisso &h o &H per indicare un valore letterale esadecimale, il prefisso &b o &B per indicare un valore
letterale binario e il prefisso &o o &O per indicare un valore letterale ottale. I valori letterali decimali non hanno prefissi.

A partire da Visual Basic 2017, è anche possibile usare il carattere di sottolineatura, _ , come separatore di cifre
per migliorare la leggibilità, come illustrato nell'esempio seguente.

Dim sbyteValue3 As SByte = &B1001_1010


Console.WriteLine(sbyteValue3)
' The example displays the following output:
' -102

A partire da Visual Basic 15,5, è anche possibile usare il carattere di sottolineatura ( _ ) come separatore iniziale
tra il prefisso e le cifre esadecimali, binarie o ottali. Ad esempio:
Dim number As SByte = &H_F9

Per usare il carattere di sottolineatura come separatore iniziale, è necessario aggiungere l'elemento seguente al
file di progetto (*.vbproj) di Visual Basic:

<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>

Per ulteriori informazioni, vedere Impostazione della versione del linguaggio Visual Basic.
Se il valore letterale integer è esterno all'intervallo di SByte , vale a dire se è minore di SByte.MinValue o
maggiore di SByte.MaxValue, si verifica un errore di compilazione. Quando un valore letterale integer non ha
alcun suffisso, viene dedotto un valore integer . Se il valore letterale integer non è compreso nell'intervallo del
Integer tipo, viene dedotto un valore Long . Ciò significa che, negli esempi precedenti, i valori letterali numerici
0x9A e 0b10011010 vengono interpretati come interi con segno a 32 bit con un valore di 156, che supera
SByte.MaxValue . Per compilare correttamente codice simile a questo che assegna un Integer non decimale a un
SByte , è possibile eseguire una delle operazioni seguenti:

Disabilitare i controlli dei limiti Integer compilando con l' /removeintchecks opzione del compilatore.
Usare un carattere tipo per definire in modo esplicito il valore letterale che si vuole assegnare a SByte .
Nell'esempio seguente viene assegnato un valore letterale negativo Short a un oggetto SByte . Si noti
che, per i numeri negativi, è necessario impostare il bit più significativo della parola più ordinata del
valore letterale numerico. Nel caso dell'esempio, si tratta del bit 15 del valore letterale Short .

Dim sByteValue1 As SByte = &HFF_9As


Dim sByteValue2 As SByte = &B1111_1111_1001_1010s
Console.WriteLine(sByteValue1)
Console.WriteLine(sByteValue2)

Suggerimenti per la programmazione


Conformità a CLS. Il SByte tipo di dati non fa parte del Common Language Specification (CLS),
pertanto il codice conforme a CLS non può utilizzare un componente che lo utilizza.
Conversioni. Il SByte tipo di dati viene ampliato in Short , Integer , Long , Decimal , Single e
Double . Ciò significa che è possibile SByte eseguire la conversione in uno di questi tipi senza
riscontrare un System.OverflowException errore.
Digitare i caratteri. SByte non ha un carattere di tipo letterale o un carattere di tipo identificatore.
Tipo di framework . Il tipo corrispondente in .NET Framework è la struttura System.SByte.

Vedi anche
System.SByte
Tipi di dati
CString
Riepilogo della conversione
Tipo di dati Short
Tipo di dati Integer
Tipo di dati Long
Utilizzo efficiente dei tipi di dati
Tipo di dati short (Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

Include interi con segno a 16 bit (2 byte) compresi tra-32.768 e 32.767.

Commenti
Utilizzare il Short tipo di dati per contenere valori integer per i quali non è necessaria la larghezza dei dati
completa di Integer . In alcuni casi, il Common Language Runtime è in grado di comprimere le variabili in
modo Short stretto e di risparmiare sull'utilizzo della memoria.
Il valore predefinito di Short è 0.

Assegnazioni di valori letterali


È possibile dichiarare e inizializzare una variabile assegnandogli un valore letterale Short decimale, un valore
letterale esadecimale, un valore letterale ottale o (a partire da Visual Basic 2017) un valore letterale binario. Se il
valore letterale integer è esterno all'intervallo di Short , vale a dire se è minore di Int16.MinValue o maggiore di
Int16.MaxValue, si verifica un errore di compilazione.
Nell'esempio seguente, i numeri interi uguali a 1.034 rappresentati come valori letterali decimali, esadecimali e
binari vengono convertiti in modo implicito da Integer a Short valori.

Dim shortValue1 As Short = 1034


Console.WriteLine(shortValue1)

Dim shortValue2 As Short = &H040A


Console.WriteLine(shortValue2)

Dim shortValue3 As Short = &B0100_00001010


Console.WriteLine(shortValue3)
' The example displays the following output:
' 1034
' 1034
' 1034

NOTE
Usare il prefisso &h o &H per indicare un valore letterale esadecimale, il prefisso &b o &B per indicare un valore
letterale binario e il prefisso &o o &O per indicare un valore letterale ottale. I valori letterali decimali non hanno prefissi.

A partire da Visual Basic 2017, è anche possibile usare il carattere di sottolineatura, _ , come separatore di cifre
per migliorare la leggibilità, come illustrato nell'esempio seguente.

Dim shortValue1 As Short = 1_034


Console.WriteLine(shortValue1)

Dim shortValue3 As Short = &B00000100_00001010


Console.WriteLine(shortValue3)
' The example displays the following output:
' 1034
' 1034
A partire da Visual Basic 15,5, è anche possibile usare il carattere di sottolineatura ( _ ) come separatore iniziale
tra il prefisso e le cifre esadecimali, binarie o ottali. Ad esempio:

Dim number As Short = &H_3264

Per usare il carattere di sottolineatura come separatore iniziale, è necessario aggiungere l'elemento seguente al
file di progetto (*.vbproj) di Visual Basic:

<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>

Per ulteriori informazioni, vedere Impostazione della versione del linguaggio Visual Basic.
I valori letterali numerici possono includere anche il S carattere tipo per indicare il Short tipo di dati, come
illustrato nell'esempio seguente.

Dim number = &H_3264S

Suggerimenti per la programmazione


Conversioni. Il Short tipo di dati viene ampliato in Integer , Long , Decimal , Single o Double .È
pertanto possibile convertire Short in uno di questi tipi senza generare un errore
System.OverflowException.
Digitare i caratteri. Aggiungendo il carattere di tipo letterale S a un valore letterale, se ne determina
la conversione nel tipo di dati Short . Short non ha un carattere di tipo identificatore.
Tipo di framework . Il tipo corrispondente in .NET Framework è la struttura System.Int16.

Vedi anche
System.Int16
Tipi di dati
CString
Riepilogo della conversione
Tipo di dati Integer
Tipo di dati Long
Utilizzo efficiente dei tipi di dati
Tipo di dati Single (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Include numeri a virgola mobile a precisione singola IEEE a 32 bit (4 byte) compresi tra-3.4028235 E + 38 e-
401298E E-45 per i valori negativi e da 401298E E-45 a 3.4028235 E + 38 per i valori positivi. I numeri a
precisione singola archiviano un'approssimazione di un numero reale.

Commenti
Utilizzare il Single tipo di dati per contenere valori a virgola mobile che non richiedono la larghezza dei dati
completa di Double . In alcuni casi è possibile che il Common Language Runtime sia in grado di comprimere le
variabili in modo Single stretto e di risparmiare sull'utilizzo della memoria.
Il valore predefinito di Single è 0.

Suggerimenti per la programmazione


Precisione. Quando si utilizzano numeri a virgola mobile, tenere presente che non sempre hanno una
rappresentazione precisa in memoria. Questo può causare risultati imprevisti di determinate operazioni,
ad esempio il confronto dei valori e l' Mod operatore. Per ulteriori informazioni, vedere risoluzione dei
problemirelativi ai tipi di dati.
Conversioni. Il Single tipo di dati viene ampliato a Double . Ciò significa che è possibile Single
eseguire la conversione in Double senza riscontrare un System.OverflowException errore.
Zeri finali. I tipi di dati a virgola mobile non hanno alcuna rappresentazione interna di caratteri finali 0.
Ad esempio, non si distinguono tra 4,2000 e 4,2. Di conseguenza, i caratteri finali 0 non vengono
visualizzati quando si visualizzano o stampano valori a virgola mobile.
Digitare i caratteri. Aggiungendo il carattere di tipo letterale F a un valore letterale, se ne determina
la conversione nel tipo di dati Single . Aggiungendo il carattere identificatore di tipo ! a qualsiasi
identificatore, se ne determina la conversione al tipo di dati Single .
Tipo di framework . Il tipo corrispondente in .NET Framework è la struttura System.Single.

Vedi anche
System.Single
Tipi di dati
Tipo di dati Decimal
Tipo di dati Double
CString
Riepilogo della conversione
Utilizzo efficiente dei tipi di dati
Risoluzione dei problemi relativi ai tipi di dati
Tipo di dati String (Visual Basic)
05/03/2021 • 5 minutes to read • Edit Online

Include sequenze di punti di codice senza segno a 16 bit (2 byte) che variano da 0 a 65535. Ogni punto di
codice, o codice carattere, rappresenta un singolo carattere Unicode. Una stringa può contenere da 0 a circa 2
miliardi (2 ^ 31) caratteri Unicode.

Commenti
Usare il String tipo di dati per mantenere più caratteri senza l'overhead di gestione della matrice di Char() ,
una matrice di Char elementi.
Il valore predefinito di String è Nothing (un riferimento null). Si noti che questa operazione non corrisponde
alla stringa vuota (valore "" ).

Caratteri Unicode
I primi 128 punti di codice (0-127) di Unicode corrispondono a lettere e simboli in una tastiera standard degli
Stati Uniti. Questi primi 128 punti di codice corrispondono a quelli definiti dal set di caratteri ASCII. I due punti di
codice 128 (128-255) rappresentano caratteri speciali, ad esempio lettere di alfabeto latino, accenti, simboli di
valuta e frazioni. Unicode usa i punti di codice rimanenti (256-65535) per un'ampia gamma di simboli. Sono
inclusi i caratteri testuali, i segni diacritici e i simboli matematici e tecnici in tutto il mondo.
È possibile utilizzare metodi quali IsDigit e IsPunctuation su un singolo carattere in una String variabile per
determinare la relativa classificazione Unicode.

Requisiti di formato
È necessario racchiudere un String valore letterale racchiuso tra virgolette ( " " ). Se è necessario includere
una virgoletta come uno dei caratteri nella stringa, è possibile utilizzare due virgolette contigue ( "" ). Questa
condizione è illustrata nell'esempio seguente.

Dim j As String = "Joe said ""Hello"" to me."


Dim h As String = "Hello"
' The following messages all display the same thing:
' "Joe said "Hello" to me."
MsgBox(j)
MsgBox("Joe said " & """" & h & """" & " to me.")
MsgBox("Joe said """ & h & """ to me.")

Si noti che le virgolette contigue che rappresentano le virgolette nella stringa sono indipendenti dalle virgolette
che iniziano e terminano il String valore letterale.

Modifiche delle stringhe


Una volta assegnata una stringa a una String variabile, tale stringa non è modificabile, quindi non è possibile
modificarne la lunghezza o il contenuto. Quando si modifica una stringa in qualsiasi modo, Visual Basic crea una
nuova stringa e abbandona quella precedente. La String variabile fa quindi riferimento alla nuova stringa.
È possibile modificare il contenuto di una String variabile usando un'ampia gamma di funzioni di stringa.
Nell'esempio seguente viene illustrata la Left funzione
Dim S As String = "Database"
' The following statement sets S to a new string containing "Data".
S = Microsoft.VisualBasic.Left(S, 4)

Una stringa creata da un altro componente potrebbe essere riempita con spazi iniziali o finali. Se si riceve una
stringa di questo tipo, è possibile usare le Trim LTrim funzioni, e RTrim per rimuovere questi spazi.
Per ulteriori informazioni sulle modifiche delle stringhe, vedere stringhe.

Suggerimenti per la programmazione


Numeri negativi. Tenere presente che i caratteri conservati da String non sono firmati e non possono
rappresentare valori negativi. In ogni caso, è consigliabile non usare String per mantenere i valori
numerici.
Considerazioni sull'interoperabilità. Se si è connessi con componenti non scritti per il .NET
Framework, ad esempio oggetti COM o di automazione, tenere presente che i caratteri stringa hanno una
larghezza dati diversa (8 bit) in altri ambienti. Se si passa un argomento stringa di caratteri a 8 bit a tale
componente, dichiararlo come Byte() una matrice di Byte elementi, anziché String nel nuovo codice
Visual Basic.
Digitare i caratteri. L'aggiunta del carattere di tipo identificatore $ a qualsiasi identificatore forza il
String tipo di dati. String non ha un carattere di tipo letterale. Tuttavia, il compilatore considera i valori
letterali racchiusi tra virgolette ( " " ) come String .
Tipo di framework . Il tipo corrispondente nella .NET Framework è la System.String classe.

Vedi anche
System.String
Tipi di dati
Tipo di dati Char
CString
Riepilogo della conversione
Procedura: Chiamare una funzione Windows che accetta tipi senza segno
Utilizzo efficiente dei tipi di dati
UInteger (tipo di dati)
05/03/2021 • 5 minutes to read • Edit Online

Include interi senza segno a 32 bit (4 byte) compresi tra 0 e 4.294.967.295.

Commenti
Il UInteger tipo di dati fornisce il valore senza segno più grande nella larghezza dei dati più efficiente.
Il valore predefinito di UInteger è 0.

Assegnazioni di valori letterali


È possibile dichiarare e inizializzare una variabile assegnandogli un valore letterale UInteger decimale, un
valore letterale esadecimale, un valore letterale ottale o (a partire da Visual Basic 2017) un valore letterale
binario. Se il valore letterale integer è esterno all'intervallo di UInteger , vale a dire se è minore di
UInt32.MinValue o maggiore di UInt32.MaxValue, si verifica un errore di compilazione.
Nell'esempio seguente, i valori interi uguali a 3.000.000.000 rappresentati come valori letterali decimali,
esadecimali o binari vengono assegnati a valori UInteger .

Dim uintValue1 As UInteger = 3000000000ui


Console.WriteLine(uintValue1)

Dim uintValue2 As UInteger = &HB2D05E00ui


Console.WriteLine(uintValue2)

Dim uintValue3 As UInteger = &B1011_0010_1101_0000_0101_1110_0000_0000ui


Console.WriteLine(uintValue3)
' The example displays the following output:
' 3000000000
' 3000000000
' 3000000000

NOTE
Usare il prefisso &h o &H per indicare un valore letterale esadecimale, il prefisso &b o &B per indicare un valore
letterale binario e il prefisso &o o &O per indicare un valore letterale ottale. I valori letterali decimali non hanno prefissi.

A partire da Visual Basic 2017, è anche possibile usare il carattere di sottolineatura, _ , come separatore di cifre
per migliorare la leggibilità, come illustrato nell'esempio seguente.
Dim uintValue1 As UInteger = 3_000_000_000ui
Console.WriteLine(uintValue1)

Dim uintValue2 As UInteger = &HB2D0_5E00ui


Console.WriteLine(uintValue2)

Dim uintValue3 As UInteger = &B1011_0010_1101_0000_0101_1110_0000_0000ui


Console.WriteLine(uintValue3)
' The example displays the following output:
' 3000000000
' 3000000000
' 3000000000

A partire da Visual Basic 15,5, è anche possibile usare il carattere di sottolineatura ( _ ) come separatore iniziale
tra il prefisso e le cifre esadecimali, binarie o ottali. Ad esempio:

Dim number As UInteger = &H_0F8C_0326

Per usare il carattere di sottolineatura come separatore iniziale, è necessario aggiungere l'elemento seguente al
file di progetto (*.vbproj) di Visual Basic:

<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>

Per ulteriori informazioni, vedere Impostazione della versione del linguaggio Visual Basic.
I valori letterali numerici possono includere anche il UI ui carattere di tipo o per indicare il UInteger tipo di
dati, come illustrato nell'esempio riportato di seguito.

Dim number = &H_0FAC_14D7ui

Suggerimenti per la programmazione


I UInteger Integer tipi di dati e offrono prestazioni ottimali in un processore a 32 bit, perché i tipi integer più
piccoli ( UShort , Short , Byte e SByte ), anche se usano meno bit, richiedono più tempo per il caricamento,
l'archiviazione e il recupero.
Numeri negativi. Poiché UInteger è un tipo senza segno, non può rappresentare un numero negativo.
Se si usa l'operatore unario meno ( - ) su un'espressione che restituisce il tipo UInteger , Visual Basic
converte prima l'espressione in Long .
Conformità a CLS. Il UInteger tipo di dati non fa parte del Common Language Specification (CLS),
pertanto il codice conforme a CLS non può utilizzare un componente che lo utilizza.
Considerazioni sull'interoperabilità. Se si è connessi con componenti non scritti per il .NET
Framework, ad esempio oggetti COM o di automazione, tenere presente che i tipi come uint possono
avere una larghezza di dati diversa (16 bit) in altri ambienti. Se si passa un argomento a 16 bit a tale
componente, dichiararlo come UShort anziché UInteger nel codice gestito del Visual Basic.
Conversioni. Il UInteger tipo di dati viene ampliato in Long , ULong , Decimal , Single e Double . Ciò
significa che è possibile UInteger eseguire la conversione in uno di questi tipi senza riscontrare un
System.OverflowException errore.
Digitare i caratteri. L'aggiunta di caratteri di tipo letterale UI a un valore letterale impone il UInteger
tipo di dati. UInteger non ha un carattere di tipo identificatore.
Tipo di framework . Il tipo corrispondente in .NET Framework è la struttura System.UInt32.

Vedi anche
UInt32
Tipi di dati
CString
Riepilogo della conversione
Procedura: Chiamare una funzione Windows che accetta tipi senza segno
Utilizzo efficiente dei tipi di dati
Tipo di dati ULong (Visual Basic)
05/03/2021 • 5 minutes to read • Edit Online

Include interi senza segno a 64 bit (8 byte) compresi tra 0 e 18.446.744.073.709.551.615 (più di 1,84 volte 10 ^
19).

Commenti
Utilizzare il ULong tipo di dati per contenere dati binari troppo grandi per UInteger o i valori Unsigned Integer
più grandi possibili.
Il valore predefinito di ULong è 0.

Assegnazioni di valori letterali


È possibile dichiarare e inizializzare una variabile assegnandogli un valore letterale ULong decimale, un valore
letterale esadecimale, un valore letterale ottale o (a partire da Visual Basic 2017) un valore letterale binario. Se il
valore letterale integer è esterno all'intervallo di ULong , vale a dire se è minore di UInt64.MinValue o maggiore
di UInt64.MaxValue, si verifica un errore di compilazione.
Nell'esempio seguente, i valori interi uguali a 7.934.076.125 rappresentati come valori letterali decimali,
esadecimali o binari vengono assegnati a valori ULong .

Dim ulongValue1 As ULong = 7934076125


Console.WriteLine(ulongValue1)

Dim ulongValue2 As ULong = &H0001D8e864DD


Console.WriteLine(ulongValue2)

Dim ulongValue3 As ULong = &B0001_1101_1000_1110_1000_0110_0100_1101_1101


Console.WriteLine(ulongValue3)
' The example displays the following output:
' 7934076125
' 7934076125
' 7934076125

NOTE
Usare il prefisso &h o &H per indicare un valore letterale esadecimale, il prefisso &b o &B per indicare un valore
letterale binario e il prefisso &o o &O per indicare un valore letterale ottale. I valori letterali decimali non hanno prefissi.

A partire da Visual Basic 2017, è anche possibile usare il carattere di sottolineatura, _ , come separatore di cifre
per migliorare la leggibilità, come illustrato nell'esempio seguente.
Dim longValue1 As Long = 4_294_967_296
Console.WriteLine(longValue1)

Dim longValue2 As Long = &H1_0000_0000


Console.WriteLine(longValue2)

Dim longValue3 As Long = &B1_0000_0000_0000_0000_0000_0000_0000_0000


Console.WriteLine(longValue3)
' The example displays the following output:
' 4294967296
' 4294967296
' 4294967296

A partire da Visual Basic 15,5, è anche possibile usare il carattere di sottolineatura ( _ ) come separatore iniziale
tra il prefisso e le cifre esadecimali, binarie o ottali. Ad esempio:

Dim number As ULong = &H_F9AC_0326_1489_D68C

Per usare il carattere di sottolineatura come separatore iniziale, è necessario aggiungere l'elemento seguente al
file di progetto (*.vbproj) di Visual Basic:

<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>

Per ulteriori informazioni, vedere Impostazione della versione del linguaggio Visual Basic.
I valori letterali numerici possono includere anche il UL ul carattere di tipo o per indicare il ULong tipo di dati,
come illustrato nell'esempio riportato di seguito.

Dim number = &H_00_00_0A_96_2F_AC_14_D7ul

Suggerimenti per la programmazione


Numeri negativi. Poiché ULong è un tipo senza segno, non può rappresentare un numero negativo. Se
si usa l'operatore unario meno ( - ) su un'espressione che restituisce il tipo ULong , Visual Basic
converte prima l'espressione in Decimal .
Conformità a CLS. Il ULong tipo di dati non fa parte del Common Language Specification (CLS),
pertanto il codice conforme a CLS non può utilizzare un componente che lo utilizza.
Considerazioni sull'interoperabilità. Se si è connessi con componenti non scritti per il .NET
Framework, ad esempio oggetti COM o di automazione, tenere presente che i tipi come ulong possono
avere una larghezza di dati diversa (32 bit) in altri ambienti. Se si passa un argomento a 32 bit a tale
componente, dichiararlo come UInteger anziché ULong nel codice Visual Basic gestito.
Inoltre, l'automazione non supporta interi a 64 bit in Windows 95, Windows 98, Windows ME o Windows
2000. Non è possibile passare un ULong argomento Visual Basic a un componente di automazione su
queste piattaforme.
Conversioni. Il ULong tipo di dati viene ampliato in Decimal , Single e Double . Ciò significa che è
possibile ULong eseguire la conversione in uno di questi tipi senza riscontrare un
System.OverflowException errore.
Digitare i caratteri. L'aggiunta di caratteri di tipo letterale UL a un valore letterale impone il ULong
tipo di dati. ULong non ha un carattere di tipo identificatore.
Tipo di framework . Il tipo corrispondente in .NET Framework è la struttura System.UInt64.

Vedi anche
UInt64
Tipi di dati
CString
Riepilogo della conversione
Procedura: Chiamare una funzione Windows che accetta tipi senza segno
Utilizzo efficiente dei tipi di dati
Tipo di dati definito dall'utente
05/03/2021 • 4 minutes to read • Edit Online

Include i dati in un formato definito dall'utente. L' Structure istruzione definisce il formato.
Le versioni precedenti di Visual Basic supportano il tipo definito dall'utente (UDT). La versione corrente espande
il tipo definito dall'utente a una struttura. Una struttura è una concatenazione di uno o più membri di diversi tipi
di dati. Visual Basic considera una struttura come una singola unità, sebbene sia anche possibile accedere
singolarmente ai relativi membri.

Commenti
Definire e usare un tipo di dati di struttura quando è necessario combinare diversi tipi di dati in una singola
unità o quando nessuno dei tipi di dati elementari soddisfa le proprie esigenze.
Il valore predefinito di un tipo di dati della struttura è costituito dalla combinazione dei valori predefiniti di
ognuno dei relativi membri.

Formato della dichiarazione


Una dichiarazione di struttura inizia con l' istruzione Structure e termina con l' End Structure istruzione. L'
Structure istruzione fornisce il nome della struttura, che è anche l'identificatore del tipo di dati che la struttura
sta definendo. Altre parti del codice possono usare questo identificatore per dichiarare variabili, parametri e
valori restituiti della funzione in modo che siano del tipo di dati della struttura.
Le dichiarazioni tra le Structure istruzioni e End Structure definiscono i membri della struttura.

Livelli di accesso ai membri


È necessario dichiarare ogni membro usando un' istruzione Dim o un'istruzione che specifica il livello di accesso,
ad esempio public, Friendo private. Se si usa un' Dim istruzione, il livello di accesso predefinito è public.

Suggerimenti per la programmazione


Consumo di memoria. Come per tutti i tipi di dati compositi, non è possibile calcolare in modo sicuro il
consumo di memoria totale di una struttura aggiungendo le allocazioni di archiviazione nominale dei
relativi membri. Inoltre, non è possibile presupporre in modo sicuro che l'ordine di archiviazione in
memoria sia uguale all'ordine di dichiarazione. Se è necessario controllare il layout di archiviazione di
una struttura, è possibile applicare l' StructLayoutAttribute attributo all' Structure istruzione.
Considerazioni sull'interoperabilità. Se si è connessi con componenti non scritti per il .NET
Framework, ad esempio oggetti COM o di automazione, tenere presente che i tipi definiti dall'utente in
altri ambienti non sono compatibili con Visual Basic tipi di struttura.
Conversioni. Non viene eseguita alcuna conversione automatica da o verso qualsiasi tipo di dati della
struttura. È possibile definire gli operatori di conversione sulla struttura usando l' istruzione Operatored è
possibile dichiarare ogni operatore di conversione come Widening o Narrowing .
Digitare i caratteri. I tipi di dati della struttura non hanno un carattere di tipo letterale o un carattere di
tipo identificatore.
Tipo di framework . Nessun tipo corrispondente nell'.NET Framework. Tutte le strutture ereditano dalla
classe .NET Framework System.ValueType , ma nessuna struttura specifica corrisponde a
System.ValueType .

Esempio
Nel paradigma seguente viene illustrato il contorno della dichiarazione di una struttura.

[Public | Protected | Friend | Protected Friend | Private] Structure structname


{Dim | Public | Friend | Private} member1 As datatype1
' ...
{Dim | Public | Friend | Private} memberN As datatypeN
End Structure

Vedi anche
ValueType
StructLayoutAttribute
Tipi di dati
CString
Riepilogo della conversione
Istruzione Structure
Widening
Narrowing
Strutture
Utilizzo efficiente dei tipi di dati
Tipo di dati UShort (Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

Include interi senza segno a 16 bit (a 2 byte) compresi tra 0 e 65.535.

Commenti
Utilizzare il UShort tipo di dati per contenere dati binari troppo grandi per Byte .
Il valore predefinito di UShort è 0.

Assegnazioni di valori letterali


È possibile dichiarare e inizializzare una variabile assegnandogli un valore letterale UShort decimale, un valore
letterale esadecimale, un valore letterale ottale o (a partire da Visual Basic 2017) un valore letterale binario. Se il
valore letterale integer è esterno all'intervallo di UShort , vale a dire se è minore di UInt16.MinValue o maggiore
di UInt16.MaxValue, si verifica un errore di compilazione.
Nell'esempio seguente, i numeri interi uguali a 65.034 rappresentati come valori letterali decimali, esadecimali e
binari vengono assegnati ai UShort valori.

Dim ushortValue1 As UShort = 65034


Console.WriteLine(ushortValue1)

Dim ushortValue2 As UShort = &HFE0A


Console.WriteLine(ushortValue2)

Dim ushortValue3 As UShort = &B1111_1110_0000_1010


Console.WriteLine(ushortValue3)
' The example displays the following output:
' 65034
' 65034
' 65034

NOTE
Usare il prefisso &h o &H per indicare un valore letterale esadecimale, il prefisso &b o &B per indicare un valore
letterale binario e il prefisso &o o &O per indicare un valore letterale ottale. I valori letterali decimali non hanno prefissi.

A partire da Visual Basic 2017, è anche possibile usare il carattere di sottolineatura, _ , come separatore di cifre
per migliorare la leggibilità, come illustrato nell'esempio seguente.

Dim ushortValue1 As UShort = 65_034


Console.WriteLine(ushortValue1)

Dim ushortValue3 As UShort = &B11111110_00001010


Console.WriteLine(ushortValue3)
' The example displays the following output:
' 65034
' 65034

A partire da Visual Basic 15,5, è anche possibile usare il carattere di sottolineatura ( _ ) come separatore iniziale
tra il prefisso e le cifre esadecimali, binarie o ottali. Ad esempio:

Dim number As UShort = &H_FF8C

Per usare il carattere di sottolineatura come separatore iniziale, è necessario aggiungere l'elemento seguente al
file di progetto (*.vbproj) di Visual Basic:

<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>

Per ulteriori informazioni, vedere Impostazione della versione del linguaggio Visual Basic.
I valori letterali numerici possono includere anche il US us carattere di tipo o per indicare il UShort tipo di
dati, come illustrato nell'esempio riportato di seguito.

Dim number = &H_5826us

Suggerimenti per la programmazione


Numeri negativi. Poiché UShort è un tipo senza segno, non può rappresentare un numero negativo. Se
si usa l'operatore unario meno ( - ) su un'espressione che restituisce il tipo UShort , Visual Basic
converte prima l'espressione in Integer .
Conformità a CLS. Il UShort tipo di dati non fa parte del Common Language Specification (CLS),
pertanto il codice conforme a CLS non può utilizzare un componente che lo utilizza.
Conversioni. Il UShort tipo di dati viene ampliato in Integer , UInteger , Long , ULong , Decimal ,
Single e Double . Ciò significa che è possibile UShort eseguire la conversione in uno di questi tipi
senza riscontrare un System.OverflowException errore.
Digitare i caratteri. L'aggiunta di caratteri di tipo letterale US a un valore letterale impone il UShort
tipo di dati. UShort non ha un carattere di tipo identificatore.
Tipo di framework . Il tipo corrispondente in .NET Framework è la struttura System.UInt16.

Vedi anche
UInt16
Tipi di dati
CString
Riepilogo della conversione
Procedura: Chiamare una funzione Windows che accetta tipi senza segno
Utilizzo efficiente dei tipi di dati
Direttiva #Const
05/03/2021 • 2 minutes to read • Edit Online

Definisce le costanti del compilatore condizionale per Visual Basic.

Sintassi
#Const constname = expression

Parti
constname
Obbligatorio. Nome della costante da definire.
expression
Obbligatorio. Valore letterale, altra costante del compilatore condizionale o qualsiasi combinazione che includa
tutti gli operatori aritmetici o logici eccetto Is .

Commenti
Le costanti del compilatore condizionale sono sempre private per il file in cui sono visualizzate. Non è possibile
creare costanti del compilatore pubbliche usando la #Const direttiva. è possibile crearle solo nell'interfaccia
utente o con l' /define opzione del compilatore.
È possibile utilizzare solo le costanti del compilatore condizionale e i valori letterali in expression . L'uso di una
costante standard definita con Const causa un errore. Viceversa, è possibile utilizzare le costanti definite con la
#Const parola chiave solo per la compilazione condizionale. Le costanti possono anche essere indefinite, nel
qual caso hanno un valore di Nothing .

Esempio
In questo esempio viene usata la direttiva #Const .

#Const MyLocation = "USA"


#Const Version = "8.0.0012"
#Const CustomerNumber = 36

Vedi anche
-define (Visual Basic)
#If... Direttive then... #Else
Istruzione Const
Compilazione condizionale
Istruzione If...Then...Else
Direttiva #ExternalSource
05/03/2021 • 2 minutes to read • Edit Online

Indica un mapping tra le righe specifiche del codice sorgente e il testo esterno all'origine.

Sintassi
#ExternalSource( StringLiteral , IntLiteral )
[ LogicalLine+ ]
#End ExternalSource

Parti
StringLiteral
Percorso dell'origine esterna.
IntLiteral
Il numero di riga della prima riga dell'origine esterna.
LogicalLine
Riga in cui si è verificato l'errore nell'origine esterna.
#End ExternalSource
Termina il blocco #ExternalSource .

Commenti
Questa direttiva viene utilizzata solo dal compilatore e dal debugger.
Un file di origine può includere direttive di origine esterne, che indicano un mapping tra righe specifiche di
codice nel file di origine e testo esterno all'origine, ad esempio un file aspx. Se durante la compilazione vengono
rilevati errori nel codice sorgente designato, vengono identificati come provenienti dall'origine esterna.
Le direttive external source non hanno alcun effetto sulla compilazione e non possono essere annidate. Sono
destinate esclusivamente all'uso interno da parte dell'applicazione.

Vedi anche
Compilazione condizionale
Direttive #If...Then...#Else
05/03/2021 • 3 minutes to read • Edit Online

Compila in modo condizionale i blocchi selezionati del codice Visual Basic.

Sintassi
#If expression Then
statements
[ #ElseIf expression Then
[ statements ]
...
#ElseIf expression Then
[ statements ] ]
[ #Else
[ statements ] ]
#End If

Parti
expression
Obbligatorio per #If le #ElseIf istruzioni e, facoltativo altrove. Qualsiasi espressione, costituita
esclusivamente da una o più costanti del compilatore condizionali, valori letterali e operatori, che restituiscono
True o False .

statements
Obbligatorio per il #If blocco di istruzioni, facoltativo altrove. Visual Basic linee di programma o direttive del
compilatore compilate se l'espressione associata restituisce True .
#End If
Termina il #If blocco di istruzioni.

Commenti
Nell'area, il comportamento delle #If...Then...#Else direttive appare come quello delle If...Then...Else
istruzioni. Tuttavia, le #If...Then...#Else direttive valutano gli elementi compilati dal compilatore, mentre le
If...Then...Else istruzioni valutano le condizioni in fase di esecuzione.

La compilazione condizionale viene in genere utilizzata per compilare lo stesso programma per piattaforme
diverse. Viene inoltre usato per impedire che il codice di debug venga visualizzato in un file eseguibile. Il codice
escluso durante la compilazione condizionale viene omesso completamente dal file eseguibile finale, quindi non
ha alcun effetto sulle dimensioni o sulle prestazioni.
Indipendentemente dal risultato di una valutazione, tutte le espressioni vengono valutate mediante
Option Compare Binary . L' Option Compare istruzione non influisce sulle espressioni #If nelle #ElseIf
istruzioni e.

NOTE
Non esiste alcuna forma a riga singola #If delle #Else #ElseIf direttive,, e #End If . Non è possibile visualizzare
altro codice nella stessa riga delle direttive.
Le istruzioni all'interno di un blocco di compilazione condizionale devono essere istruzioni logiche complete. Ad
esempio, non è possibile compilare in modo condizionale solo gli attributi di una funzione, ma è possibile
dichiarare la funzione in modo condizionale insieme ai relativi attributi:

#If DEBUG Then


<WebMethod()>
Public Function SomeFunction() As String
#Else
<WebMethod(CacheDuration:=86400)>
Public Function SomeFunction() As String
#End If

Esempio
Questo esempio usa il #If...Then...#Else costrutto per determinare se compilare determinate istruzioni.

#Const CustomerNumber = 36
#If CustomerNumber = 35 Then
' Insert code to be compiled for customer # 35.
#ElseIf CustomerNumber = 36 Then
' Insert code to be compiled for customer # 36.
#Else
' Insert code to be compiled for all other customers.
#End If

Vedi anche
#Const (direttiva)
Istruzione If...Then...Else
Compilazione condizionale
System.Diagnostics.ConditionalAttribute
Direttiva #Region
05/03/2021 • 2 minutes to read • Edit Online

Comprime e nasconde sezioni di codice in file di Visual Basic.

Sintassi
#Region "identifier_string"
#End Region

Parti
T ERM IN E DEF IN IZ IO N E

identifier_string Obbligatorio. Stringa che funge da titolo di un'area quando


viene compressa. Le aree sono compresse per impostazione
predefinita.

#End Region Termina il blocco #Region .

Commenti
Usare la direttiva #Region per specificare un blocco di codice da espandere o comprimere durante l'uso della
funzionalità di struttura dell'editor di Visual Studio Code. È possibile inserire, o annidare, le aree all'interno di
altre aree per raggruppare aree simili.

Esempio
In questo esempio viene usata la direttiva #Region .

#Region "MathFunctions"
' Insert code for the Math functions here.
#End Region

Vedi anche
#If... Direttive then... #Else
struttura
Procedura: Comprimere e nascondere sezioni di codice
Direttive #Disable e #Enable (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Le #Disable #Enable direttive e sono Visual Basic direttive del compilatore del codice sorgente. Vengono usati
per disabilitare e riabilitare avvisi specifici per le aree di codice.

' Suppress warning about no awaits in this method.


#Disable Warning BC42356
Async Function TestAsync() As Task
Console.WriteLine("testing")
End Function
#Enable Warning BC42356

È anche possibile disabilitare e abilitare un elenco delimitato da virgole di codici di avviso.

Vedi anche
Riferimenti al linguaggio Visual Basic
Come disattivare gli avvisi di analisi del codice
Funzioni (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Gli argomenti di questa sezione contengono tabelle delle funzioni membro di runtime di Visual Basic.

NOTE
È anche possibile creare funzioni e chiamarle. Per alte informazioni, vedere Istruzione Function e Procedura: Creare una
routine che restituisce un valore.

Contenuto della sezione


Funzioni di conversione
Funzioni matematiche
Funzioni per i valori stringa
CString
CType Function

Sezioni correlate
Riferimenti al linguaggio Visual Basic
Funzioni di conversione (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Asc
AscW
CBool (funzione)
CByte (funzione)
CChar (funzione)
CDate (funzione)
CDbl (funzione)
CDec (funzione)
Chr
ChrW
Funzione CInt
CLng (funzione)
CObj (funzione)
CSByte (funzione)
CShort (funzione)
CSng (funzione)
CStr (funzione)
CType Function
CUInt (funzione)
CULng (funzione)
CUShort (funzione)
Format
Hex
Oct
Str
Val

Vedi anche
CString
Conversione dei tipi di dati
Funzioni matematiche (Visual Basic)
05/03/2021 • 9 minutes to read • Edit Online

I metodi della System.Math classe forniscono funzioni trigonometriche, logaritmiche e altre funzioni
matematiche comuni.

Commenti
Nella tabella seguente sono elencati i metodi della System.Math classe. È possibile usarli in un programma
Visual Basic:

M ETO DO . N ET DESC RIZ IO N E

Abs Restituisce il valore assoluto di un numero.

Acos Restituisce l'angolo il cui coseno è il numero specificato.

Asin Restituisce l'angolo il cui seno è il numero specificato.

Atan Restituisce l'angolo la cui tangente è il numero specificato.

Atan2 Restituisce l'angolo la cui tangente è il quoziente di due


numeri specificati.

BigMul Restituisce il prodotto completo dei numeri a 2 32 bit.

Ceiling Restituisce il valore integrale minimo maggiore o uguale


all'oggetto Decimal o specificato Double .

Cos Restituisce il coseno dell'angolo specificato.

Cosh Restituisce il coseno iperbolico dell'angolo specificato.

DivRem Restituisce il quoziente di interi con segno a 2 32 bit o a 64


bit e restituisce anche il resto in un parametro di output.

Exp Restituisce e (la base dei logaritmi naturali) elevato alla


potenza specificata.

Floor Restituisce l'intero più grande che è minore o uguale al


Decimal numero o specificato Double .

IEEERemainder Restituisce il resto risultante dalla divisione di un numero


specificato per un altro numero specificato.

Log Restituisce il logaritmo naturale (base e) di un numero


specificato o il logaritmo di un numero specificato in una
base specificata.

Log10 Restituisce il logaritmo in base 10 del numero specificato.


M ETO DO . N ET DESC RIZ IO N E

Max Restituisce il più elevato tra due numeri.

Min Restituisce il meno elevato tra due numeri.

Pow Restituisce il numero specificato elevato alla potenza


specificata.

Round Restituisce un Decimal Double valore o arrotondato al


valore integrale più vicino o a un numero specificato di cifre
frazionarie.

Sign Restituisce un Integer valore che indica il segno di un


numero.

Sin Restituisce il seno dell'angolo specificato.

Sinh Restituisce il seno iperbolico dell'angolo specificato.

Sqrt Restituisce la radice quadrata del numero specificato.

Tan Restituisce la tangente dell'angolo specificato.

Tanh Restituisce la tangente iperbolica dell'angolo specificato.

Truncate Calcola la parte integrale di un Decimal numero o


specificato Double .

La tabella seguente elenca i metodi della System.Math classe che non esistono in .NET Framework ma che
vengono aggiunti in .NET standard o .NET Core:

M ETO DO . N ET DESC RIZ IO N E DISP O N IB IL E IN

Acosh Restituisce l'angolo il cui coseno A partire da .NET Core 2,1 e .NET
iperbolico è il numero specificato. Standard 2,1

Asinh Restituisce l'angolo il cui seno A partire da .NET Core 2,1 e .NET
iperbolico è il numero specificato. Standard 2,1

Atanh Restituisce l'angolo la cui tangente A partire da .NET Core 2,1 e .NET
iperbolica è il numero specificato. Standard 2,1

BitDecrement Restituisce il successivo valore più A partire da .NET Core 3,0


piccolo che risulta minore di x .

BitIncrement Restituisce il successivo valore più A partire da .NET Core 3,0


grande che risulta maggiore di x .

Cbrt Restituisce la radice cubica di un A partire da .NET Core 2,1 e .NET


numero specificato. Standard 2,1

Clamp Restituisce il valore value fissato A partire da .NET Core 2,0 e .NET
all'intervallo inclusivo di min e max . Standard 2,1
M ETO DO . N ET DESC RIZ IO N E DISP O N IB IL E IN

CopySign Restituisce un valore con grandezza A partire da .NET Core 3,0


pari a x e segno y .

FusedMultiplyAdd Restituisce (x * y) + z, arrotondato A partire da .NET Core 3,0


come un'operazione ternaria.

ILogB Restituisce la parte intera del logaritmo A partire da .NET Core 3,0
in base 2 del numero specificato.

Log2 Restituisce il logaritmo in base 2 di un A partire da .NET Core 3,0


numero specificato.

MaxMagnitude Restituisce la grandezza più elevata tra A partire da .NET Core 3,0
due numeri a virgola mobile e
precisione doppia.

MinMagnitude Restituisce la grandezza meno elevata A partire da .NET Core 3,0


tra due numeri a virgola mobile e
precisione doppia.

ScaleB Restituisce x * 2 ^ n calcolato in modo A partire da .NET Core 3,0


efficiente.

Per usare queste funzioni senza qualifica, importare lo System.Math spazio dei nomi nel progetto aggiungendo
il codice seguente all'inizio del file di origine:

Imports System.Math

Esempio-ABS
In questo esempio viene usato il Abs metodo della Math classe per calcolare il valore assoluto di un numero.

Dim x As Double = Math.Abs(50.3)


Dim y As Double = Math.Abs(-50.3)
Console.WriteLine(x)
Console.WriteLine(y)
' This example produces the following output:
' 50.3
' 50.3

Esempio: atan
In questo esempio viene usato il Atan metodo della Math classe per calcolare il valore di pi greco.

Public Function GetPi() As Double


' Calculate the value of pi.
Return 4.0 * Math.Atan(1.0)
End Function
NOTE
La System.Math classe contiene un Math.PI campo costante. È possibile usarlo anziché calcolarlo.

Esempio-cos
In questo esempio viene usato il Cos metodo della Math classe per restituire il coseno di un angolo.

Public Function Sec(angle As Double) As Double


' Calculate the secant of angle, in radians.
Return 1.0 / Math.Cos(angle)
End Function

Esempio: Exp
In questo esempio viene usato il Exp metodo della Math classe per restituire e elevato a una potenza.

Public Function Sinh(angle As Double) As Double


' Calculate hyperbolic sine of an angle, in radians.
Return (Math.Exp(angle) - Math.Exp(-angle)) / 2.0
End Function

Esempio-log
In questo esempio viene usato il Log metodo della Math classe per restituire il logaritmo naturale di un numero.

Public Function Asinh(value As Double) As Double


' Calculate inverse hyperbolic sine, in radians.
Return Math.Log(value + Math.Sqrt(value * value + 1.0))
End Function

Esempio-round
In questo esempio viene usato il Round metodo della Math classe per arrotondare un numero all'intero più
vicino.

Dim myVar2 As Double = Math.Round(2.8)


Console.WriteLine(myVar2)
' The code produces the following output:
' 3

Esempio-firma
In questo esempio viene usato il Sign metodo della Math classe per determinare il segno di un numero.
Dim mySign1 As Integer = Math.Sign(12)
Dim mySign2 As Integer = Math.Sign(-2.4)
Dim mySign3 As Integer = Math.Sign(0)
Console.WriteLine(mySign1)
Console.WriteLine(mySign2)
Console.WriteLine(mySign3)
' The code produces the following output:
' 1
' -1
' 0

Esempio-sin
In questo esempio viene usato il Sin metodo della Math classe per restituire il seno di un angolo.

Public Function Csc(angle As Double) As Double


' Calculate cosecant of an angle, in radians.
Return 1.0 / Math.Sin(angle)
End Function

Esempio-sqrt
In questo esempio viene usato il Sqrt metodo della Math classe per calcolare la radice quadrata di un numero.

Dim mySqrt1 As Double = Math.Sqrt(4)


Dim mySqrt2 As Double = Math.Sqrt(23)
Dim mySqrt3 As Double = Math.Sqrt(0)
Dim mySqrt4 As Double = Math.Sqrt(-4)
Console.WriteLine(mySqrt1)
Console.WriteLine(mySqrt2)
Console.WriteLine(mySqrt3)
Console.WriteLine(mySqrt4)
' The code produces the following output:
' 2
' 4.79583152331272
' 0
' NaN

Esempio-Tan
In questo esempio viene usato il Tan metodo della Math classe per restituire la tangente di un angolo.

Public Function Ctan(angle As Double) As Double


' Calculate cotangent of an angle, in radians.
Return 1.0 / Math.Tan(angle)
End Function

Vedi anche
Rnd
Randomize
NaN
Funzioni matematiche derivate
Operatori aritmetici
Funzioni stringa (Visual Basic)
05/03/2021 • 9 minutes to read • Edit Online

Nella tabella seguente sono elencate le funzioni fornite da Visual Basic nella Microsoft.VisualBasic.Strings classe
per la ricerca e la modifica delle stringhe. Possono essere considerati come Visual Basic funzioni intrinseche;
ovvero non è necessario chiamarli come membri espliciti di una classe, come illustrato negli esempi. Nella classe
sono disponibili metodi aggiuntivi e, in alcuni casi, metodi complementari System.String .

M ETO DO . N ET F RA M EW O RK DESC RIZ IO N E

Asc, AscW Restituisce un Integer valore che rappresenta il codice


carattere corrispondente a un carattere.

Chr, ChrW Restituisce il carattere associato al codice carattere


specificato.

Filter Restituisce una matrice con indice in base zero che contiene
un sottoinsieme di una matrice String definito in base ai
criteri di filtro specificati.

Format Restituisce una stringa formattata in base alle istruzioni


contenute in un'espressione String di formato.

FormatCurrency Restituisce un'espressione nel formato valore di valuta


utilizzando il simbolo di valuta impostato nel Pannello di
controllo del sistema.

FormatDateTime Restituisce un'espressione stringa che rappresenta un valore


data/ora.

FormatNumber Restituisce un'espressione in formato di numero.

FormatPercent Restituisce un'espressione formattata come percentuale


(ovvero moltiplicata per 100) con un carattere % finale.

InStr Restituisce un Integer che specifica la posizione di inizio della


prima occorrenza di una stringa in un'altra.

InStrRev Restituisce la posizione della prima occorrenza di una stringa


inclusa in un'altra a partire dalla destra della stringa.

Join Restituisce una stringa creata unendo un certo numero di


sottostringhe di una matrice.

LCase Restituisce una stringa o un carattere convertito in


minuscolo.

Left Restituisce una stringa contenente un numero specificato di


caratteri a partire dal lato sinistro di una stringa.
M ETO DO . N ET F RA M EW O RK DESC RIZ IO N E

Len Restituisce un intero contenente il numero di caratteri in una


stringa.

LSet Restituisce una stringa allineata a sinistra contenente la


stringa specificata adeguata alla lunghezza specificata.

LTrim Restituisce una stringa contenente una copia di una stringa


specificata senza spazi iniziali.

Mid Restituisce una stringa contenente un numero specificato di


caratteri da una stringa.

Replace Restituisce una stringa nella quale la sottostringa specificata


è stata sostituita con un'altra sottostringa per il numero di
volte indicato.

Right Restituisce una stringa contenente un numero di caratteri


specificato a partire dalla destra della stringa.

RSet Restituisce una stringa allineata a destra contenente la


stringa specificata adattata alla lunghezza specificata.

RTrim Restituisce una stringa contenente una copia di una stringa


specificata senza spazi finali.

Space Restituisce una stringa composta dal numero di spazi


specificato.

Split Restituisce una matrice unidimensionale con indice in base


zero che contiene il numero di sottostringhe specificato.

StrComp Restituisce -1, 0 o 1 in base al risultato di un confronto tra


stringhe.

StrConv Restituisce una stringa convertita come specificato.

StrDup Restituisce una stringa o un oggetto composto dal carattere


specificato ripetuto per il numero di volte specificato.

StrReverse Restituisce una stringa nella quale è stato invertito l'ordine


dei caratteri della stringa specificata.

Trim Restituisce una stringa contenente una copia di una stringa


specificata senza spazi iniziali o finali.

UCase Restituisce una stringa o un carattere contenente la stringa


specificata convertita in lettere maiuscole.

È possibile utilizzare l'istruzione Option Compare per impostare se le stringhe vengono confrontate utilizzando
un ordinamento del testo senza distinzione tra maiuscole e minuscole determinato dalle impostazioni locali del
sistema ( Text ) o dalle rappresentazioni binarie interne dei caratteri ( Binary ). Il metodo di confronto del
testo predefinito è Binary .
Esempio: UCase
Nell'esempio seguente la funzione UCase viene utilizzata per restituire una versione in lettere maiuscole di una
stringa:

' String to convert.


Dim lowerCase As String = "Hello World 1234"
' Returns "HELLO WORLD 1234".
Dim upperCase As String = UCase(lowerCase)

Esempio: LTrim
In questo esempio vengono utilizzate la funzione LTrim per rimuovere gli spazi iniziali e la funzione RTrim per
rimuovere gli spazi finali da una variabile String. Viene utilizzata la funzione Trim per eliminare entrambi i tipi
di spazi.

' Initializes string.


Dim testString As String = " <-Trim-> "
Dim trimString As String
' Returns "<-Trim-> ".
trimString = LTrim(testString)
' Returns " <-Trim->".
trimString = RTrim(testString)
' Returns "<-Trim->".
trimString = LTrim(RTrim(testString))
' Using the Trim function alone achieves the same result.
' Returns "<-Trim->".
trimString = Trim(testString)

Esempio: Mid
In questo esempio viene utilizzata la Mid funzione per restituire un numero specificato di caratteri da una
stringa.

' Creates text string.


Dim testString As String = "Mid Function Demo"
' Returns "Mid".
Dim firstWord As String = Mid(testString, 1, 3)
' Returns "Demo".
Dim lastWord As String = Mid(testString, 14, 4)
' Returns "Function Demo".
Dim midWords As String = Mid(testString, 5)

Esempio: Len
Nell'esempio riportato di seguito la funzione Len viene utilizzata per restituire il numero di caratteri di una
stringa.

' Initializes variable.


Dim testString As String = "Hello World"
' Returns 11.
Dim testLen As Integer = Len(testString)

Esempio: InStr
Nell'esempio riportato di seguito la funzione InStr viene utilizzata per restituire la posizione della prima
occorrenza di una stringa in un'altra:

' String to search in.


Dim searchString As String = "XXpXXpXXPXXP"
' Search for "P".
Dim searchChar As String = "P"

Dim testPos As Integer


' A textual comparison starting at position 4. Returns 6.
testPos = InStr(4, searchString, searchChar, CompareMethod.Text)

' A binary comparison starting at position 1. Returns 9.


testPos = InStr(1, SearchString, SearchChar, CompareMethod.Binary)

' If Option Compare is not set, or set to Binary, return 9.


' If Option Compare is set to Text, returns 3.
testPos = InStr(searchString, searchChar)

' Returns 0.
testPos = InStr(1, searchString, "W")

Esempio: Format
In questo esempio sono presentati vari utilizzi della funzione Format per formattare valori mediante formati sia
di tipo String che definiti dall'utente. Per quanto riguarda il separatore della data ( / ), dell'ora ( : ) e gli
indicatori AM/PM ( t e tt ), l'output formattato visualizzato dal sistema dipende dalle impostazioni locali
utilizzate per il codice. Nell'ambiente di sviluppo la data e l'ora vengono visualizzate nel formato breve delle
impostazioni locali.

NOTE
Per le impostazioni locali che utilizzano il formato 24 ore, gli indicatori AM/PM ( t e tt ) non visualizzano alcun output.
Dim testDateTime As Date = #1/27/2001 5:04:23 PM#
Dim testStr As String
' Returns current system time in the system-defined long time format.
testStr = Format(Now(), "Long Time")
' Returns current system date in the system-defined long date format.
testStr = Format(Now(), "Long Date")
' Also returns current system date in the system-defined long date
' format, using the single letter code for the format.
testStr = Format(Now(), "D")

' Returns the value of testDateTime in user-defined date/time formats.


' Returns "5:4:23".
testStr = Format(testDateTime, "h:m:s")
' Returns "05:04:23 PM".
testStr = Format(testDateTime, "hh:mm:ss tt")
' Returns "Saturday, Jan 27 2001".
testStr = Format(testDateTime, "dddd, MMM d yyyy")
' Returns "17:04:23".
testStr = Format(testDateTime, "HH:mm:ss")
' Returns "23".
testStr = Format(23)

' User-defined numeric formats.


' Returns "5,459.40".
testStr = Format(5459.4, "##,##0.00")
' Returns "334.90".
testStr = Format(334.9, "###0.00")
' Returns "500.00%".
testStr = Format(5, "0.00%")

Vedi anche
Parole chiave
Membri della libreria di runtime di Visual Basic
Riepilogo della modifica delle stringhe
Metodi della classe System. String
Funzioni di conversione del tipo (Visual Basic)
05/03/2021 • 23 minutes to read • Edit Online

Queste funzioni vengono compilate inline, ovvero il codice di conversione fa parte del codice che valuta
l'espressione. A volte non viene eseguita alcuna chiamata a una procedura per eseguire la conversione,
migliorando le prestazioni. Ogni funzione assegna un'espressione a un tipo di dati specifico.

Sintassi
CBool(expression)
CByte(expression)
CChar(expression)
CDate(expression)
CDbl(expression)
CDec(expression)
CInt(expression)
CLng(expression)
CObj(expression)
CSByte(expression)
CShort(expression)
CSng(expression)
CStr(expression)
CUInt(expression)
CULng(expression)
CUShort(expression)

Parte
expression
Obbligatorio. Qualsiasi espressione del tipo di dati di origine.

Tipo di dati del valore restituito


Il nome della funzione determina il tipo di dati del valore restituito, come illustrato nella tabella seguente.

IN T ERVA L LO P ER EXPRESSION
N O M E DEL L A F UN Z IO N E T IP O DI DAT I REST IT UITO A RGO M EN TO

CBool Tipo di dati Boolean Qualsiasi Char String espressione


numerica o valida.

CByte Tipo di dati Byte Byte.MinValue (0) fino a Byte.MaxValue


(255) (senza segno); le parti frazionarie
vengono arrotondate. 1

A partire da Visual Basic 15,8, Visual


Basic ottimizza le prestazioni della
conversione da virgola mobile a byte
con la CByte funzione. per ulteriori
informazioni, vedere la sezione
osservazioni . Per un esempio, vedere
la sezione di esempio CInt .

CChar Tipo di dati Char Qualsiasi Char espressione o valida


String ; viene convertito solo il
primo carattere di un oggetto. il
String valore può essere compreso
tra 0 e 65535 (senza segno).

CDate Tipo di dati Date Qualsiasi rappresentazione valida di


data e ora.
IN T ERVA L LO P ER EXPRESSION
N O M E DEL L A F UN Z IO N E T IP O DI DAT I REST IT UITO A RGO M EN TO

CDbl Tipo di dati Double -1.79769313486231570 e + 308 a-


4.94065645841246544 E-324 per i
valori negativi; 4.94065645841246544
e-324 tramite 1.79769313486231570
E + 308 per i valori positivi.

CDec Tipo di dati Decimal +/-


79.228.162.514.264.337.593.543.950.
335 per numeri con scala zero, ovvero
numeri senza posizioni decimali. Per i
numeri con 28 cifre decimali,
l'intervallo è +/-
7.9228162514264337593543950335.
Il numero più piccolo possibile diverso
da zero è
0,0000000000000000000000000001
(+/-1E-28).

CInt Tipo di dati Integer Int32.MinValue da-2.147.483.648 a


Int32.MaxValue (2.147.483.647); le
parti frazionarie vengono arrotondate.
1

A partire da Visual Basic 15,8, Visual


Basic ottimizza le prestazioni della
conversione da virgola mobile a
integer con la CInt funzione. per
ulteriori informazioni, vedere la sezione
osservazioni . Per un esempio, vedere
la sezione di esempio CInt .

CLng Tipo di dati Long Int64.MinValue (-


9.223.372.036.854.775.808) fino a
Int64.MaxValue
(9.223.372.036.854.775.807); le parti
frazionarie vengono arrotondate. 1

A partire da Visual Basic 15,8, Visual


Basic ottimizza le prestazioni della
conversione di interi a virgola mobile a
64 bit con la CLng funzione. per
ulteriori informazioni, vedere la sezione
osservazioni . Per un esempio, vedere
la sezione di esempio CInt .

CObj Object Data Type Qualsiasi espressione valida.

CSByte Tipo di dati SByte SByte.MinValue da-128 a


SByte.MaxValue (127); le parti
frazionarie vengono arrotondate. 1

A partire da Visual Basic 15,8, Visual


Basic ottimizza le prestazioni della
conversione in byte a virgola mobile e
con firma con la CSByte funzione. per
ulteriori informazioni, vedere la sezione
osservazioni . Per un esempio, vedere
la sezione di esempio CInt .
IN T ERVA L LO P ER EXPRESSION
N O M E DEL L A F UN Z IO N E T IP O DI DAT I REST IT UITO A RGO M EN TO

CShort Tipo di dati Short Int16.MinValue da-32.768 a


Int16.MaxValue (32.767); le parti
frazionarie vengono arrotondate. 1

A partire da Visual Basic 15,8, Visual


Basic ottimizza le prestazioni della
conversione a valori integer a 16 bit in
virgola mobile con la CShort
funzione. per ulteriori informazioni,
vedere la sezione osservazioni . Per un
esempio, vedere la sezione di esempio
CInt .

CSng Tipo di dati Single -3 402823e38 e + 38 fino a-401298E


E-45 per i valori negativi; 401298E e-
45 tramite 3 402823e38 E + 38 per i
valori positivi.

CStr Tipo di dati String Restituisce per CStr dipendere dall'


expression argomento. Vedere
valori restituiti per la funzione CStr.

CUInt Tipo di dati UInteger UInt32.MinValue (0) fino a


UInt32.MaxValue (4.294.967.295)
(senza segno); le parti frazionarie
vengono arrotondate. 1

A partire da Visual Basic 15,8, Visual


Basic ottimizza le prestazioni della
conversione a virgola mobile e
Unsigned Integer con la CUInt
funzione. per ulteriori informazioni,
vedere la sezione osservazioni . Per un
esempio, vedere la sezione di esempio
CInt .

CULng Tipo di dati ULong UInt64.MinValue (0) tramite


UInt64.MaxValue
(18.446.744.073.709.551.615) (senza
segno); le parti frazionarie vengono
arrotondate. 1

A partire da Visual Basic 15,8, Visual


Basic ottimizza le prestazioni della
conversione a virgola mobile e long
integer senza segno con la CULng
funzione. per ulteriori informazioni,
vedere la sezione osservazioni . Per un
esempio, vedere la sezione di esempio
CInt .

CUShort Tipo di dati UShort UInt16.MinValue (0) fino a


UInt16.MaxValue (65.535) (senza
segno); le parti frazionarie vengono
arrotondate. 1

A partire da Visual Basic 15,8, Visual


Basic ottimizza le prestazioni della
conversione a valori integer a 16 bit
senza segno a virgola mobile con la
CUShort funzione. per ulteriori
informazioni, vedere la sezione
osservazioni . Per un esempio, vedere
la sezione di esempio CInt .

1 le parti frazionarie possono essere soggette a un tipo speciale di arrotondamento denominato

arrotondamento del banco. Per ulteriori informazioni, vedere la sezione "osservazioni".


Commenti
Come regola, è consigliabile usare le funzioni di conversione del tipo Visual Basic in preferenza ai metodi di .NET
Framework, ad esempio ToString() , nella Convert classe o in una singola struttura o classe del tipo. Le
funzioni Visual Basic sono progettate per un'interazione ottimale con il codice Visual Basic e rendono anche il
codice sorgente più breve e più facile da leggere. Inoltre, i metodi di conversione .NET Framework non
producono sempre gli stessi risultati delle funzioni di Visual Basic, ad esempio quando si esegue la conversione
Boolean in Integer . Per ulteriori informazioni, vedere risoluzione dei problemirelativi ai tipi di dati.

A partire da Visual Basic 15,8, le prestazioni della conversione da virgola mobile a integer sono ottimizzate
quando si passa Single il Double valore o restituito dai metodi seguenti a una delle funzioni di conversione
integer ( CByte , CShort , CInt , CLng , CSByte , CUShort , CUInt , CULng ):
Conversion.Fix(Double)
Conversion.Fix(Object)
Conversion.Fix(Single)
Conversion.Int(Double)
Conversion.Int(Object)
Conversion.Int(Single)
Math.Ceiling(Double)
Math.Floor(Double)
Math.Round(Double)
Math.Truncate(Double)
Questa ottimizzazione consente di eseguire il codice che esegue un numero elevato di conversioni di valori
integer fino a due volte più velocemente. Nell'esempio seguente vengono illustrate le conversioni a virgola
mobile ottimizzate:

Dim s As Single = 173.7619


Dim d As Double = s

Dim i1 As Integer = CInt(Fix(s)) ' Result: 173


Dim b1 As Byte = CByte(Int(d)) ' Result: 173
Dim s1 AS Short = CShort(Math.Truncate(s)) ' Result: 173
Dim i2 As Integer = CInt(Math.Ceiling(d)) ' Result: 174
Dim i3 As Integer = CInt(Math.Round(s)) ' Result: 174

Comportamento
Coercizione. In generale, è possibile utilizzare le funzioni di conversione del tipo di dati per assegnare il
risultato di un'operazione a un tipo di dati specifico anziché al tipo di dati predefinito. Usare, ad esempio,
CDec per forzare l'aritmetica decimale nei casi in cui normalmente si verificano calcoli di precisione
singola, a precisione doppia o Integer.
Conversioni non riuscite. Se l'oggetto expression passato alla funzione non è compreso
nell'intervallo del tipo di dati in cui deve essere convertito, OverflowException si verifica un errore.
Par ti frazionarie. Quando si converte un valore non integrale in un tipo integrale, le funzioni di
conversione di valori integer ( CByte ,, CInt CLng , CSByte , CShort , CUInt , CULng e CUShort )
rimuovono la parte frazionaria e arrotondano il valore all'intero più vicino.
Se la parte frazionaria è esattamente 0,5, le funzioni di conversione integer arrotondano al numero intero
pari più vicino. 0,5, ad esempio, viene arrotondato a 0, 1,5 e 2,5 entrambi arrotondati a 2. Questa
operazione viene talvolta denominata arrotondamento del banco e il suo scopo consiste nel compensare
la distorsione che potrebbe accumularsi durante l'aggiunta di molti di questi numeri.
CInt e CLng differiscono dalle Int Fix funzioni e, che troncano, anziché arrotondare, la parte frazionaria
di un numero. Inoltre, Fix e Int restituiscono sempre un valore dello stesso tipo di dati passato.
Conversioni di data e ora. Utilizzare la IsDate funzione per determinare se un valore può essere
convertito in una data e ora. CDate riconosce i valori letterali di data e ora, ma non i valori numerici. Per
convertire un valore Visual Basic 6,0 Date in un Date valore in Visual Basic 2005 o versioni successive,
è possibile usare il DateTime.FromOADate metodo.
Valori di data/ora neutri. Il tipo di dati date contiene sempre le informazioni di data e ora. Ai fini della
conversione del tipo, Visual Basic considera 1/1/0001 (1 gennaio dell'anno 1) come valore neutro per la
data e 00:00:00 (mezzanotte) come valore neutro per l'ora. Se si converte un Date valore in una stringa,
CStr in non sono inclusi valori neutri nella stringa risultante. Se ad esempio si esegue
#January 1, 0001 9:30:00# la conversione in una stringa, il risultato sarà "9:30:00 AM"; le informazioni
sulla data vengono annullate. Tuttavia, le informazioni sulla data sono ancora presenti nel Date valore
originale e possono essere ripristinate con funzioni come DatePart Function.
Sensibilità delle impostazioni cultura. Le funzioni di conversione dei tipi che coinvolgono stringhe
eseguono conversioni in base alle impostazioni cultura correnti dell'applicazione. Ad esempio, CDate
riconosce i formati di data in base alle impostazioni locali del sistema. È necessario specificare il giorno, il
mese e l'anno nell'ordine corretto per le impostazioni locali o la data potrebbe non essere interpretata
correttamente. Un formato di data estesa non viene riconosciuto se contiene una stringa del giorno della
settimana, ad esempio "mercoledì".
Se è necessario eseguire la conversione da o verso una rappresentazione di stringa di un valore in un
formato diverso da quello specificato dalle impostazioni locali, non è possibile usare le funzioni di
conversione del tipo di Visual Basic. A tale scopo, usare i ToString(IFormatProvider)
Parse(String, IFormatProvider) metodi e del tipo di tale valore. Utilizzare, ad esempio, Double.Parse
quando si converte una stringa in un oggetto Double e Double.ToString si utilizza quando si converte un
valore di tipo Double in una stringa.

CType Function
La funzione CType accetta un secondo argomento, typename , e viene assegnato expression a typename , dove
typename può essere qualsiasi tipo di dati, struttura, classe o interfaccia a cui esiste una conversione valida.

Per un confronto di CType con le altre parole chiave di conversione dei tipi, vedere Operatore DirectCast e
operatore TryCast.

Esempio di CBool
Nell'esempio seguente viene utilizzata la CBool funzione per convertire espressioni in Boolean valori. Se
un'espressione restituisce un valore diverso da zero, CBool restituisce True ; in caso contrario, restituisce
False .

Dim a, b, c As Integer
Dim check As Boolean
a = 5
b = 5
' The following line of code sets check to True.
check = CBool(a = b)
c = 0
' The following line of code sets check to False.
check = CBool(c)

Esempio di CByte
Nell'esempio seguente viene usata la CByte funzione per convertire un'espressione in un oggetto Byte .

Dim aDouble As Double


Dim aByte As Byte
aDouble = 125.5678
' The following line of code sets aByte to 126.
aByte = CByte(aDouble)

Esempio di CChar
Nell'esempio seguente viene usata la CChar funzione per convertire il primo carattere di un' String
espressione in un Char tipo.
Dim aString As String
Dim aChar As Char
' CChar converts only the first character of the string.
aString = "BCD"
' The following line of code sets aChar to "B".
aChar = CChar(aString)

L'argomento di input per CChar deve essere di tipo di dati Char o String . Non è possibile utilizzare CChar
per convertire un numero in un carattere, perché CChar non è in grado di accettare un tipo di dati numerico.
Nell'esempio seguente viene ottenuto un numero che rappresenta un punto di codice (codice carattere) e lo
converte nel carattere corrispondente. Usa la InputBox funzione per ottenere la stringa di cifre, CInt per
convertire la stringa nel tipo Integer e ChrW per convertire il numero nel tipo Char .

Dim someDigits As String


Dim codePoint As Integer
Dim thisChar As Char
someDigits = InputBox("Enter code point of character:")
codePoint = CInt(someDigits)
' The following line of code sets thisChar to the Char value of codePoint.
thisChar = ChrW(codePoint)

Esempio di CDate
Nell'esempio seguente viene usata la CDate funzione per convertire le stringhe in Date valori. In generale, le
date e le ore di codifica hardcoded come stringhe, come illustrato in questo esempio, non sono consigliate.
Usare i valori letterali di data e ora, ad esempio #Feb 12, 1969 # e #4:45:23 PM #, in alternativa.

Dim aDateString, aTimeString As String


Dim aDate, aTime As Date
aDateString = "February 12, 1969"
aTimeString = "4:35:47 PM"
' The following line of code sets aDate to a Date value.
aDate = CDate(aDateString)
' The following line of code sets aTime to Date value.
aTime = CDate(aTimeString)

Esempio di CDbl
Dim aDec As Decimal
Dim aDbl As Double
' The following line of code uses the literal type character D to make aDec a Decimal.
aDec = 234.456784D
' The following line of code sets aDbl to 1.9225456288E+1.
aDbl = CDbl(aDec * 8.2D * 0.01D)

Esempio di CDec
Nell'esempio seguente viene usata la CDec funzione per convertire un valore numerico in Decimal .

Dim aDouble As Double


Dim aDecimal As Decimal
aDouble = 10000000.0587
' The following line of code sets aDecimal to 10000000.0587.
aDecimal = CDec(aDouble)

Esempio di CInt
Nell'esempio seguente viene usata la CInt funzione per convertire un valore in Integer .
Dim aDbl As Double
Dim anInt As Integer
aDbl = 2345.5678
' The following line of code sets anInt to 2346.
anInt = CInt(aDbl)

Esempio di CLng
Nell'esempio seguente viene usata la CLng funzione per convertire i valori in Long .

Dim aDbl1, aDbl2 As Double


Dim aLng1, aLng2 As Long
aDbl1 = 25427.45
aDbl2 = 25427.55
' The following line of code sets aLng1 to 25427.
aLng1 = CLng(aDbl1)
' The following line of code sets aLng2 to 25428.
aLng2 = CLng(aDbl2)

Esempio di CObj
Nell'esempio seguente viene usata la CObj funzione per convertire un valore numerico in Object . La Object
variabile stessa contiene solo un puntatore a quattro byte, che punta al Double valore assegnato.

Dim aDouble As Double


Dim anObject As Object
aDouble = 2.7182818284
' The following line of code sets anObject to a pointer to aDouble.
anObject = CObj(aDouble)

Esempio di CSByte
Nell'esempio seguente viene usata la CSByte funzione per convertire un valore numerico in SByte .

Dim aDouble As Double


Dim anSByte As SByte
aDouble = 39.501
' The following line of code sets anSByte to 40.
anSByte = CSByte(aDouble)

Esempio di CShort
Nell'esempio seguente viene usata la CShort funzione per convertire un valore numerico in Short .

Dim aByte As Byte


Dim aShort As Short
aByte = 100
' The following line of code sets aShort to 100.
aShort = CShort(aByte)

Esempio di CSng
Nell'esempio seguente viene usata la CSng funzione per convertire i valori in Single .
Dim aDouble1, aDouble2 As Double
Dim aSingle1, aSingle2 As Single
aDouble1 = 75.3421105
aDouble2 = 75.3421567
' The following line of code sets aSingle1 to 75.34211.
aSingle1 = CSng(aDouble1)
' The following line of code sets aSingle2 to 75.34216.
aSingle2 = CSng(aDouble2)

Esempio di CStr
Nell'esempio seguente viene usata la CStr funzione per convertire un valore numerico in String .

Dim aDouble As Double


Dim aString As String
aDouble = 437.324
' The following line of code sets aString to "437.324".
aString = CStr(aDouble)

Nell'esempio seguente viene usata la CStr funzione per convertire Date i valori in String valori.

Dim aDate As Date


Dim aString As String
' The following line of code generates a COMPILER ERROR because of invalid format.
' aDate = #February 12, 1969 00:00:00#
' Date literals must be in the format #m/d/yyyy# or they are invalid.
' The following line of code sets the time component of aDate to midnight.
aDate = #2/12/1969#
' The following conversion suppresses the neutral time value of 00:00:00.
' The following line of code sets aString to "2/12/1969".
aString = CStr(aDate)
' The following line of code sets the time component of aDate to one second past midnight.
aDate = #2/12/1969 12:00:01 AM#
' The time component becomes part of the converted value.
' The following line of code sets aString to "2/12/1969 12:00:01 AM".
aString = CStr(aDate)

CStr esegue sempre il rendering di un Date valore nel formato abbreviato standard per le impostazioni locali
correnti, ad esempio, "6/15/2003 4:35:47 PM". Tuttavia, non vengono CStr eliminati i valori neutri di 1/1/0001
per la data e 00:00:00 per l'ora.
Per informazioni più dettagliate sui valori restituiti da CStr , vedere valori restituiti per la funzione CStr.

Esempio di CUInt
Nell'esempio seguente viene usata la CUInt funzione per convertire un valore numerico in UInteger .

Dim aDouble As Double


Dim aUInteger As UInteger
aDouble = 39.501
' The following line of code sets aUInteger to 40.
aUInteger = CUInt(aDouble)

Esempio di CULng
Nell'esempio seguente viene usata la CULng funzione per convertire un valore numerico in ULong .

Dim aDouble As Double


Dim aULong As ULong
aDouble = 39.501
' The following line of code sets aULong to 40.
aULong = CULng(aDouble)

Esempio di CUShort
Nell'esempio seguente viene usata la CUShort funzione per convertire un valore numerico in UShort .

Dim aDouble As Double


Dim aUShort As UShort
aDouble = 39.501
' The following line of code sets aUShort to 40.
aUShort = CUShort(aDouble)

Vedi anche
Asc
AscW
Chr
ChrW
Int
Fix
Format
Hex
Oct
Str
Val
Funzioni di conversione
Conversioni di tipi in Visual Basic
Valori restituiti dalla funzione CStr (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Nella tabella seguente vengono descritti i valori restituiti per CStr per diversi tipi di dati di expression .

SE IL EXPRESSION T IP O È VA LO RI REST IT UIT I CSTR

Tipo di dati Boolean Stringa contenente "true" o "false".

Tipo di dati Date Stringa contenente un Date valore (data e ora) nel formato
di data breve del sistema.

Tipi di dati numerici Stringa che rappresenta il numero.

CStr e data
Il Date tipo contiene sempre le informazioni di data e ora. Ai fini della conversione del tipo, Visual Basic
considera 1/1/0001 (1 gennaio dell'anno 1) come valore neutro per la data e 00:00:00 (mezzanotte) come
valore neutro per l'ora. CStr non include valori neutri nella stringa risultante. Se ad esempio si esegue
#January 1, 0001 9:30:00# la conversione in una stringa, il risultato sarà "9:30:00 AM"; le informazioni sulla data
vengono annullate. Tuttavia, le informazioni sulla data sono ancora presenti nel Date valore originale e possono
essere ripristinate con funzioni come DatePart .

NOTE
La CStr funzione esegue la conversione in base alle impostazioni cultura correnti dell'applicazione. Per ottenere la
rappresentazione di stringa di un numero in determinate impostazioni cultura, usare il metodo del numero
ToString(IFormatProvider) . Ad esempio, usare Double.ToString quando si converte un valore di tipo Double in un
oggetto String .

Vedi anche
DatePart
CString
Tipo di dati Boolean
Tipo di dati Date
Funzione CType (Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

Restituisce il risultato della conversione esplicita di un'espressione in un tipo di dati, oggetto, struttura, classe o
interfaccia specificati.

Sintassi
CType(expression, typename)

Parti
expression Qualsiasi espressione valida. Se il valore di non expression è compreso nell'intervallo consentito
da typename , Visual Basic genera un'eccezione.
typename Qualsiasi espressione valida all'interno di una As clausola in un' Dim istruzione, ovvero il nome di
qualsiasi tipo di dati, oggetto, struttura, classe o interfaccia.

Commenti
TIP
Per eseguire una conversione del tipo è inoltre possibile utilizzare le funzioni seguenti:
Funzioni di conversione dei tipi CByte , ad esempio, CDbl e CInt che eseguono una conversione in un tipo di dati
specifico. Per altre informazioni, vedere Funzioni di conversione del tipo.
Operatore DirectCast o operatore TryCast. Questi operatori richiedono che un tipo erediti da o implementi l'altro tipo.
Possono fornire prestazioni leggermente migliori rispetto CType a quando si esegue la conversione da e verso il
Object tipo di dati.

CType viene compilato inline, il che significa che il codice di conversione fa parte del codice che valuta
l'espressione. In alcuni casi, il codice viene eseguito più velocemente perché non viene chiamata alcuna routine
per eseguire la conversione.
Se non viene definita alcuna conversione da expression a typename (ad esempio, da Integer a Date ), Visual
Basic Visualizza un messaggio di errore in fase di compilazione.
Se una conversione non riesce in fase di esecuzione, viene generata l'eccezione appropriata. Se una conversione
verso un tipo di caratteri più piccolo non riesce, OverflowException è il risultato più comune. Se la conversione
non è definita, viene InvalidCastException generata un'eccezione. Questo può verificarsi, ad esempio, se
expression è di tipo Object e il tipo in fase di esecuzione non dispone di conversione in typename .

Se il tipo di dati di expression o typename è una classe o una struttura definita, è possibile definire CType su
tale classe o struttura come operatore di conversione. In questo CType modo, funge da operatore di overload. In
tal caso, è possibile controllare il comportamento delle conversioni da e verso la classe o la struttura, incluse le
eccezioni che possono essere generate.

Overload
CType È inoltre possibile eseguire l'overload dell'operatore in una classe o in una struttura definita all'esterno
del codice. Se il codice viene convertito in o da tale classe o struttura, assicurarsi di comprendere il
comportamento dell' CType operatore. Per altre informazioni, vedere Operator Procedures.

Conversione di oggetti dinamici


Le conversioni di tipi di oggetti dinamici vengono eseguite da conversioni dinamiche definite dall'utente che
utilizzano i TryConvert BindConvert metodi o. Se si utilizzano oggetti dinamici, utilizzare il CTypeDynamic
metodo per convertire l'oggetto dinamico.

Esempio
Nell'esempio seguente viene utilizzata la CType funzione per convertire un'espressione nel Single tipo di dati.

Dim testNumber As Long = 1000


' The following line of code sets testNewType to 1000.0.
Dim testNewType As Single = CType(testNumber, Single)

Per altri esempi, vedere conversioni implicite ed esplicite.

Vedi anche
OverflowException
InvalidCastException
CString
Funzioni di conversione
Operator Statement
Procedura: Definire un operatore di conversione
Conversione di tipi in .NET Framework
Modificatori (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Gli argomenti di questa sezione descrivono i modificatori di runtime di Visual Basic.

Contenuto della sezione


ANSI
Assembly
Asincrona
Auto
ByRef
ByVal
Default
Friend
In
Iterator
Chiave
Modulo <keyword>
MustInherit
MustOverride
Narrowing
NotInheritable
NotOverridable
Facoltativo
Out
Overload
Overridable
Override
ParamArray
Parziale
Privata
Privato protetto
Protetto
Protected Friend
Pubblica
ReadOnly
Ombreggiature
Condivisa
Statico
Unicode
Widening
WithEvents
WriteOnly

Sezioni correlate
Riferimenti al linguaggio Visual Basic
Ansi (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica che Visual Basic deve effettuare il marshalling di tutte le stringhe in valori di American National
Standards Institute (ANSI) indipendentemente dal nome della procedura esterna dichiarata.
Quando si chiama una routine definita all'esterno del progetto, il compilatore Visual Basic non ha accesso alle
informazioni necessarie per chiamare correttamente la stored procedure. Queste informazioni includono la
posizione in cui si trova la stored procedure, la modalità di identificazione, la sequenza chiamante e il tipo
restituito e il set di caratteri stringa utilizzato. L' istruzione Declare crea un riferimento a una procedura esterna e
fornisce le informazioni necessarie.
La charsetmodifier parte nell' Declare istruzione fornisce le informazioni sul set di caratteri per il marshalling
delle stringhe durante una chiamata alla procedura esterna. Influiscono inoltre sul modo in cui Visual Basic
Cerca nel file esterno il nome della procedura esterna. Il Ansi modificatore specifica che Visual Basic deve
effettuare il marshalling di tutte le stringhe in valori ANSI ed esaminare la procedura senza modificarne il nome
durante la ricerca.
Se non viene specificato alcun modificatore del set di caratteri, Ansi è il valore predefinito.

Commenti
Il Ansi modificatore può essere usato in questo contesto:
Declare Statement

Note per gli sviluppatori di Smart Device


Questa parola chiave non è supportata.

Vedi anche
Auto
Unicode
Parole chiave
Assembly (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica che un attributo all'inizio di un file di origine viene applicato all'intero assembly.

Commenti
Molti attributi riguardano un singolo elemento di programmazione, ad esempio una classe o una proprietà.
Applicare tale attributo alleghindo il blocco di attributi, racchiuso tra parentesi acute ( < > ), direttamente
all'istruzione di dichiarazione.
Se un attributo riguarda non solo l'elemento seguente ma l'intero assembly, inserire il blocco di attributi
all'inizio del file di origine e identificare l'attributo con la Assembly parola chiave. Se si applica al modulo di
assembly corrente, usare la parola chiave Module .
È anche possibile applicare un attributo a un assembly nel file AssemblyInfo. vb, nel qual caso non è necessario
usare un blocco di attributi nel file del codice sorgente principale.

Vedi anche
Modulo <keyword>
Panoramica degli attributi
Async (Visual Basic)
05/03/2021 • 5 minutes to read • Edit Online

Il Async modificatore indica che il metodo o l' espressione lambda modificata è asincrona. Questi metodi sono
detti metodi asincroni.
Un metodo asincrono è un modo pratico per eseguire le operazioni potenzialmente di lunga durata senza
bloccare il thread del chiamante. Il chiamante di un metodo asincrono può riprendere il proprio lavoro senza
attendere il completamento del metodo asincrono.

NOTE
Le parole chiave Async e Await sono state introdotte in Visual Studio 2012. Per un'introduzione alla programmazione
asincrona, vedere programmazione asincrona con Async e await.

Nell'esempio seguente viene illustrata la struttura di un metodo async. Per convenzione, i nomi dei metodi async
terminano con "Async".

Public Async Function ExampleMethodAsync() As Task(Of Integer)


' . . .

' At the Await expression, execution in this method is suspended and,


' if AwaitedProcessAsync has not already finished, control returns
' to the caller of ExampleMethodAsync. When the awaited task is
' completed, this method resumes execution.
Dim exampleInt As Integer = Await AwaitedProcessAsync()

' . . .

' The return statement completes the task. Any method that is
' awaiting ExampleMethodAsync can now get the integer result.
Return exampleInt
End Function

In genere, un metodo modificato dalla Async parola chiave contiene almeno un'espressione o un'istruzione
await . Il metodo funziona in modo sincrono fino al primo Await , a quel punto viene sospeso finché l'attività di
cui si è in attesa non viene completata. Nel frattempo, il controllo viene restituito al chiamante del metodo. Se il
metodo non contiene un' Await espressione o un'istruzione, il metodo non viene sospeso ed eseguito come
metodo sincrono. Un avviso del compilatore segnala eventuali metodi asincroni che non contengono Await
perché questa situazione potrebbe indicare un errore. Per ulteriori informazioni, vedere l' errore del compilatore.
La parola chiave Async è una parola chiave non riservata. È una parola chiave quando si modifica un metodo o
un'espressione lambda. In tutti gli altri contesti, viene interpretata come identificatore.

Tipi restituiti
Un metodo asincrono è una routine Sub o una routine di funzione con un tipo restituito Task o Task<TResult> . Il
metodo non può dichiarare parametri ByRef .
Specificare Task(Of TResult) per il tipo restituito di un metodo asincrono se l'istruzione Return del metodo ha
un operando di tipo TResult. Utilizzare Task se non viene restituito alcun valore significativo al completamento
del metodo. In altre parole, una chiamata al metodo restituisce Task , ma quando Task viene completato, ogni
istruzione Await in attesa di Task non produce un valore risultante.
Le subroutine async vengono utilizzate principalmente per definire i gestori eventi in cui è richiesta una
procedura Sub . Il chiamante di una subroutine async non può attendere il metodo e non può intercettare le
eccezioni generate dal metodo.
Per altre informazioni ed esempi, vedere Tipi restituiti asincroni.

Esempio
Negli esempi seguenti viene illustrato un gestore eventi async, un'espressione lambda async e un metodo async.
Per un esempio completo in cui vengono usati questi elementi, vedere procedura dettagliata: accesso al Web
tramite Async e await. È possibile scaricare il codice della procedura dettagliata dalla pagina Developer Code
Samples (Esempi di codice per sviluppatori).

' An event handler must be a Sub procedure.


Async Sub button1_Click(sender As Object, e As RoutedEventArgs) Handles button1.Click
textBox1.Clear()
' SumPageSizesAsync is a method that returns a Task.
Await SumPageSizesAsync()
textBox1.Text = vbCrLf & "Control returned to button1_Click."
End Sub

' The following async lambda expression creates an equivalent anonymous


' event handler.
AddHandler button1.Click, Async Sub(sender, e)
textBox1.Clear()
' SumPageSizesAsync is a method that returns a Task.
Await SumPageSizesAsync()
textBox1.Text = vbCrLf & "Control returned to button1_Click."
End Sub

' The following async method returns a Task(Of T).


' A typical call awaits the Byte array result:
' Dim result As Byte() = Await GetURLContents("https://msdn.com")
Private Async Function GetURLContentsAsync(url As String) As Task(Of Byte())

' The downloaded resource ends up in the variable named content.


Dim content = New MemoryStream()

' Initialize an HttpWebRequest for the current URL.


Dim webReq = CType(WebRequest.Create(url), HttpWebRequest)

' Send the request to the Internet resource and wait for
' the response.
Using response As WebResponse = Await webReq.GetResponseAsync()
' Get the data stream that is associated with the specified URL.
Using responseStream As Stream = response.GetResponseStream()
' Read the bytes in responseStream and copy them to content.
' CopyToAsync returns a Task, not a Task<T>.
Await responseStream.CopyToAsync(content)
End Using
End Using

' Return the result as a byte array.


Return content.ToArray()
End Function

Vedi anche
AsyncStateMachineAttribute
Operatore await
Programmazione asincrona con Async e Await
Procedura dettagliata: accesso al Web tramite Async e await
Auto (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica che Visual Basic deve effettuare il marshalling delle stringhe in base alle regole di .NET Framework in
base al nome esterno della procedura esterna dichiarata.
Quando si chiama una routine definita all'esterno del progetto, il compilatore Visual Basic non ha accesso alle
informazioni necessarie per chiamare correttamente la stored procedure. Queste informazioni includono la
posizione in cui si trova la stored procedure, la modalità di identificazione, la sequenza chiamante e il tipo
restituito e il set di caratteri stringa utilizzato. L' istruzione Declare crea un riferimento a una procedura esterna e
fornisce le informazioni necessarie.
La charsetmodifier parte nell' Declare istruzione fornisce le informazioni sul set di caratteri per il marshalling
delle stringhe durante una chiamata alla procedura esterna. Influiscono inoltre sul modo in cui Visual Basic
Cerca nel file esterno il nome della procedura esterna. Il Auto modificatore specifica che Visual Basic deve
effettuare il marshalling delle stringhe in base alle regole di .NET Framework e che deve determinare il set di
caratteri di base della piattaforma di runtime ed eventualmente modificare il nome della procedura esterna se la
ricerca iniziale ha esito negativo. Per ulteriori informazioni, vedere "set di caratteri" nell' istruzione Declare.
Se non viene specificato alcun modificatore del set di caratteri, Ansi è il valore predefinito.

Commenti
Il Auto modificatore può essere usato in questo contesto:
Declare Statement

Note per gli sviluppatori di Smart Device


Questa parola chiave non è supportata.

Vedi anche
ANSI
Unicode
Parole chiave
ByRef (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica che un argomento viene passato in modo tale che la routine chiamata possa modificare il valore di una
variabile sottostante l'argomento nel codice chiamante.

Commenti
Il modificatore ByRef può essere usato nei contesti seguenti:
Declare Statement
Istruzione Function
Istruzione Sub

Vedi anche
Parole chiave
Passaggio di argomenti per valore e per riferimento
ByVal (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica che un argomento viene passato per valore, in modo che la routine o proprietà chiamata non possa
modificare il valore di una variabile sottostante l'argomento nel codice chiamante. Se non si specifica alcun
modificatore, ByVal è il valore predefinito.

NOTE
Poiché è l'impostazione predefinita, non è necessario specificare in modo esplicito la ByVal parola chiave nelle firme dei
metodi. Tende a produrre codice rumoroso e spesso conduce alla parola chiave non predefinita da ByRef trascurare.

Commenti
Il modificatore ByVal può essere usato nei contesti seguenti:
Declare Statement
Istruzione Function
Operator Statement
Property Statement
Istruzione Sub

Esempio
Nell'esempio seguente viene illustrato l'utilizzo del ByVal meccanismo di passaggio del parametro con un
argomento di tipo riferimento. Nell'esempio, l'argomento è c1 , un'istanza della classe Class1 . ByVal
impedisce al codice nelle procedure di modificare il valore sottostante dell'argomento di riferimento, c1 , ma
non protegge i campi e le proprietà accessibili di c1 .
Module Module1

Sub Main()

' Declare an instance of the class and assign a value to its field.
Dim c1 As New Class1()
c1.Field = 5
Console.WriteLine(c1.Field)
' Output: 5

' ByVal does not prevent changing the value of a field or property.
ChangeFieldValue(c1)
Console.WriteLine(c1.Field)
' Output: 500

' ByVal does prevent changing the value of c1 itself.


ChangeClassReference(c1)
Console.WriteLine(c1.Field)
' Output: 500

Console.ReadKey()
End Sub

Public Sub ChangeFieldValue(ByVal cls As Class1)


cls.Field = 500
End Sub

Public Sub ChangeClassReference(ByVal cls As Class1)


cls = New Class1()
cls.Field = 1000
End Sub

Public Class Class1


Public Field As Integer
End Class

End Module

Vedi anche
Parole chiave
Passaggio di argomenti per valore e per riferimento
Default (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Identifica una proprietà come proprietà predefinita della relativa classe, struttura o interfaccia.

Commenti
Una classe, una struttura o un'interfaccia può definire al massimo una delle proprietà come proprietà
predefinita, purché la proprietà accetti almeno un parametro. Se il codice fa riferimento a una classe o a una
struttura senza specificare un membro, Visual Basic risolve il riferimento alla proprietà predefinita.
Le proprietà predefinite possono causare una riduzione ridotta dei caratteri di codice sorgente, ma possono
rendere il codice più difficile da leggere. Se il codice chiamante non ha familiarità con la classe o la struttura,
quando fa riferimento al nome della classe o della struttura, non può essere certo se il riferimento accede alla
classe o alla struttura o a una proprietà predefinita. Questo può causare errori del compilatore o errori di logica
di run-time sottili.
È possibile ridurre in qualche modo la probabilità di errori di proprietà predefiniti usando sempre l' istruzione
Option Strict per impostare il controllo dei tipi del compilatore su On .
Se si prevede di usare una classe o una struttura predefinita nel codice, è necessario determinare se dispone di
una proprietà predefinita e, in caso affermativo, il nome.
A causa di questi svantaggi, è consigliabile non definire le proprietà predefinite. Per la leggibilità del codice, è
consigliabile considerare sempre il riferimento a tutte le proprietà in modo esplicito, anche le proprietà
predefinite.
Il Default modificatore può essere usato in questo contesto:
Property Statement

Vedi anche
Procedura: dichiarare e chiamare una proprietà predefinita in Visual Basic
Parole chiave
Friend (Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

Specifica che uno o più elementi di programmazione dichiarati sono accessibili solo all'interno dell'assembly
che contiene la relativa dichiarazione.

Commenti
In molti casi, si desidera che gli elementi di programmazione come classi e strutture siano utilizzati dall'intero
assembly, non solo dal componente che li dichiara. Tuttavia, è possibile che non si desideri che siano accessibili
dal codice all'esterno dell'assembly (ad esempio, se l'applicazione è proprietaria). Se si vuole limitare l'accesso a
un elemento in questo modo, è possibile dichiararlo usando il Friend modificatore.
Il codice in altre classi, strutture e moduli compilati nello stesso assembly può accedere a tutti gli Friend
elementi in tale assembly.
Friend l'accesso è spesso il livello preferenziale per gli elementi di programmazione di un'applicazione e
Friend rappresenta il livello di accesso predefinito di un'interfaccia, un modulo, una classe o una struttura.
È possibile usare Friend solo a livello di modulo, interfaccia o spazio dei nomi. Il contesto di dichiarazione per
un Friend elemento deve pertanto essere un file di origine, uno spazio dei nomi, un'interfaccia, un modulo, una
classe o una struttura e non può essere una routine.

NOTE
È anche possibile usare il modificatore di accesso Friend protetto , che rende accessibile un membro della classe da tale
classe, dalle classi derivate e dallo stesso assembly in cui è definita la classe. Per limitare l'accesso a un membro dall'interno
della relativa classe e dalle classi derivate nello stesso assembly, usare il modificatore di accesso privato protetto .

Per un confronto tra Friend e gli altri modificatori di accesso, vedere livelli di accesso in Visual Basic.

NOTE
È possibile specificare che un altro assembly è un assembly Friend, che consente di accedere a tutti i tipi e membri
contrassegnati come Friend . Per ulteriori informazioni, vedere assembly Friend.

Esempio
La classe seguente usa il Friend modificatore per consentire ad altri elementi di programmazione all'interno
dello stesso assembly di accedere a determinati membri.
Class CustomerInfo

Private p_CustomerID As Integer

Public ReadOnly Property CustomerID() As Integer


Get
Return p_CustomerID
End Get
End Property

' Allow friend access to the empty constructor.


Friend Sub New()

End Sub

' Require that a customer identifier be specified for the public constructor.
Public Sub New(ByVal customerID As Integer)
p_CustomerID = customerID
End Sub

' Allow friend programming elements to set the customer identifier.


Friend Sub SetCustomerID(ByVal customerID As Integer)
p_CustomerID = customerID
End Sub
End Class

Utilizzo
È possibile usare il Friend modificatore in questi contesti:
Istruzione Class
Istruzione Const
Declare Statement
Istruzione Delegate
Istruzione Dim
Istruzione Enum
Istruzione Event
Istruzione Function
Istruzione Interface
Istruzione Module
Property Statement
Istruzione Structure
Istruzione Sub

Vedi anche
InternalsVisibleToAttribute
Pubblica
Protetto
Privata
Privato protetto
Protected Friend
Livelli di accesso in Visual Basic
Procedure
Strutture
Oggetti e classi
In (modificatore generico) (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Per i parametri di tipo generico, la parola chiave In specifica che il parametro di tipo è controvariante.

Commenti
La controvarianza consente di usare un tipo meno derivato di quello specificato dal parametro generico. Ciò
consente la conversione implicita di classi che implementano interfacce varianti e la conversione implicita di tipi
delegati.
Per altre informazioni, vedere Covarianza e controvarianza.

Regole
È possibile usare la parola chiave In in interfacce e delegati generici.
Un parametro di tipo può essere dichiarato controvariante in un'interfaccia o in un delegato generico se viene
usato solo come tipo di argomenti del metodo e non viene usato come tipo restituito del metodo. ByRef i
parametri non possono essere covarianti o controvarianti.
Covarianza e controvarianza sono supportate per i tipi di riferimento e non sono supportate per i tipi di valore.
In Visual Basic non è possibile dichiarare eventi in interfacce controvarianti senza specificare il tipo delegato.
Inoltre, le interfacce controvarianti non possono avere classi, enumerazioni o strutture annidate, ma possono
avere interfacce nidificate.

Comportamento
Un'interfaccia che dispone di un parametro di tipo controvariante consente ai metodi di accettare argomenti di
tipi meno derivati di quelli specificati dal parametro di tipo di interfaccia. Poiché, ad esempio, in .NET Framework
4, nell' IComparer<T> interfaccia, il tipo T è controvariante, è possibile assegnare un oggetto di
IComparer(Of Person) tipo a un oggetto del IComparer(Of Employee) tipo senza usare alcun metodo di
conversione speciale se Employee eredita da Person .
A un delegato controvariante può essere assegnato un altro delegato dello stesso tipo, ma con un parametro di
tipo generico meno derivato.

Esempio: interfaccia generica controvariante


L'esempio seguente illustra come dichiarare, estendere e implementare un'interfaccia generica controvariante.
L'esempio descrive anche come usare la conversione implicita per le classi che implementano quest'interfaccia.
' Contravariant interface.
Interface IContravariant(Of In A)
End Interface

' Extending contravariant interface.


Interface IExtContravariant(Of In A)
Inherits IContravariant(Of A)
End Interface

' Implementing contravariant interface.


Class Sample(Of A)
Implements IContravariant(Of A)
End Class

Sub Main()
Dim iobj As IContravariant(Of Object) = New Sample(Of Object)()
Dim istr As IContravariant(Of String) = New Sample(Of String)()

' You can assign iobj to istr, because


' the IContravariant interface is contravariant.
istr = iobj
End Sub

Esempio: delegato generico controvariante


L'esempio seguente illustra come dichiarare, creare un'istanza e chiamare un delegato generico controvariante.
Illustra anche come convertire in modo implicito un tipo delegato.

' Contravariant delegate.


Public Delegate Sub DContravariant(Of In A)(ByVal argument As A)

' Methods that match the delegate signature.


Public Shared Sub SampleControl(ByVal control As Control)
End Sub

Public Shared Sub SampleButton(ByVal control As Button)


End Sub

Private Sub Test()

' Instantiating the delegates with the methods.


Dim dControl As DContravariant(Of Control) =
AddressOf SampleControl
Dim dButton As DContravariant(Of Button) =
AddressOf SampleButton

' You can assign dControl to dButton


' because the DContravariant delegate is contravariant.
dButton = dControl

' Invoke the delegate.


dButton(New Button())
End Sub

Vedi anche
Varianza nelle interfacce generiche
Out
Iteratore (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Specifica che una funzione o una funzione di Get accesso è un iteratore.

Commenti
Un iteratore esegue un'iterazione personalizzata su una raccolta. Un iteratore usa l'istruzione yield per restituire
ogni elemento della raccolta uno alla volta. Quando Yield viene raggiunta un'istruzione, viene mantenuta la
posizione corrente nel codice. L'esecuzione viene riavviata a partire da quella posizione la volta successiva che
viene chiamata la funzione iteratore.
Un iteratore può essere implementato come funzione o come funzione Get di accesso di una definizione di
proprietà. Il Iterator modificatore viene visualizzato nella dichiarazione della funzione o della funzione di
accesso iteratore Get .
È possibile chiamare un iteratore dal codice client usando un per ogni... Istruzione successiva.
Il tipo restituito di una funzione o di una funzione di accesso iteratore Get può essere IEnumerable ,,
IEnumerable<T> IEnumerator o IEnumerator<T> .
Un iteratore non può avere ByRef parametri.
Un iteratore non può verificarsi in un evento, costruttore di istanza, costruttore statico o distruttore statico.
Un iteratore può essere una funzione anonima. Per ulteriori informazioni, vedere iteratori.

Utilizzo
Il modificatore Iterator può essere usato nei contesti seguenti:
Istruzione Function
Property Statement

Esempio
Nell'esempio seguente viene illustrata una funzione iteratore. La funzione iteratore ha un' Yield istruzione che
si trova all'interno di un oggetto per... Ciclo successivo . Ogni iterazione del corpo dell'istruzione for each in
Main Crea una chiamata alla Power funzione iteratore. Ogni chiamata alla funzione iteratore procede fino alla
prossima esecuzione dell'istruzione Yield , che si verifica durante l'iterazione successiva del ciclo For…Next .
Sub Main()
For Each number In Power(2, 8)
Console.Write(number & " ")
Next
' Output: 2 4 8 16 32 64 128 256
Console.ReadKey()
End Sub

Private Iterator Function Power(


ByVal base As Integer, ByVal highExponent As Integer) _
As System.Collections.Generic.IEnumerable(Of Integer)

Dim result = 1

For counter = 1 To highExponent


result = result * base
Yield result
Next
End Function

Esempio
Nell'esempio seguente viene illustrata una funzione di accesso Get che è un iteratore. Il Iterator modificatore
si trova nella dichiarazione della proprietà.

Sub Main()
Dim theGalaxies As New Galaxies
For Each theGalaxy In theGalaxies.NextGalaxy
With theGalaxy
Console.WriteLine(.Name & " " & .MegaLightYears)
End With
Next
Console.ReadKey()
End Sub

Public Class Galaxies


Public ReadOnly Iterator Property NextGalaxy _
As System.Collections.Generic.IEnumerable(Of Galaxy)
Get
Yield New Galaxy With {.Name = "Tadpole", .MegaLightYears = 400}
Yield New Galaxy With {.Name = "Pinwheel", .MegaLightYears = 25}
Yield New Galaxy With {.Name = "Milky Way", .MegaLightYears = 0}
Yield New Galaxy With {.Name = "Andromeda", .MegaLightYears = 3}
End Get
End Property
End Class

Public Class Galaxy


Public Property Name As String
Public Property MegaLightYears As Integer
End Class

Per altri esempi, vedere iteratori.

Vedi anche
IteratorStateMachineAttribute
Iterators
Istruzione Yield
Key (Visual Basic)
05/03/2021 • 5 minutes to read • Edit Online

La Key parola chiave consente di specificare il comportamento per le proprietà dei tipi anonimi. Solo le
proprietà designate come proprietà chiave partecipano ai test di uguaglianza tra le istanze di tipo anonimo o il
calcolo dei valori del codice hash. Non è possibile modificare i valori delle proprietà chiave.
Per definire una proprietà di un tipo anonimo come proprietà chiave, inserire la parola chiave davanti alla Key
relativa dichiarazione nell'elenco di inizializzazione. Nell'esempio seguente Airline e FlightNo sono proprietà
chiave, ma non lo Gate è.

Dim flight1 = New With {Key .Airline = "Blue Yonder Airlines",


Key .FlightNo = 3554, .Gate = "C33"}

Quando viene creato un nuovo tipo anonimo, esso eredita direttamente da Object . Il compilatore esegue
l'override di tre membri ereditati: Equals , GetHashCode e ToString . Il codice di sostituzione prodotto per Equals
e GetHashCode si basa sulle proprietà chiave. Se non sono presenti proprietà chiave nel tipo GetHashCode e
Equals non vengono sottoposte a override.

Uguaglianza
Due istanze di tipo anonimo sono uguali se sono istanze dello stesso tipo e se i valori delle relative proprietà
chiave sono uguali. Negli esempi seguenti flight2 è uguale all' flight1 esempio precedente, perché sono
istanze dello stesso tipo anonimo e hanno valori corrispondenti per le relative proprietà chiave. Tuttavia,
flight3 non è uguale a flight1 perché ha un valore diverso per una proprietà chiave FlightNo . flight4
L'istanza non è dello stesso tipo di flight1 perché designa proprietà diverse come proprietà chiave.

Dim flight2 = New With {Key .Airline = "Blue Yonder Airlines",


Key .FlightNo = 3554, .Gate = "D14"}
' The following statement displays True. The values of the non-key
' property, Gate, do not have to be equal.
Console.WriteLine(flight1.Equals(flight2))

Dim flight3 = New With {Key .Airline = "Blue Yonder Airlines",


Key .FlightNo = 431, .Gate = "C33"}
' The following statement displays False, because flight3 has a
' different value for key property FlightNo.
Console.WriteLine(flight1.Equals(flight3))

Dim flight4 = New With {Key .Airline = "Blue Yonder Airlines",


.FlightNo = 3554, .Gate = "C33"}
' The following statement displays False. Instance flight4 is not the
' same type as flight1 because they have different key properties.
' FlightNo is a key property of flight1 but not of flight4.
Console.WriteLine(flight1.Equals(flight4))

Se due istanze sono dichiarate solo con proprietà non chiave, identiche in nome, tipo, ordine e valore, le due
istanze non sono uguali. Un'istanza senza proprietà chiave è uguale solo a se stessa.
Per ulteriori informazioni sulle condizioni in cui due istanze di tipo anonimo sono istanze dello stesso tipo
anonimo, vedere tipi anonimi.
Calcolo del codice hash
Analogamente Equals , la funzione hash definita in GetHashCode per un tipo anonimo si basa sulle proprietà
chiave del tipo. Negli esempi seguenti viene illustrata l'interazione tra le proprietà chiave e i valori del codice
hash.
Le istanze di un tipo anonimo che hanno gli stessi valori per tutte le proprietà chiave hanno lo stesso valore di
codice hash, anche se le proprietà non chiave non hanno valori corrispondenti. L'istruzione seguente restituisce
True .

Console.WriteLine(flight1.GetHashCode = flight2.GetHashCode)

Le istanze di un tipo anonimo con valori diversi per una o più proprietà chiave hanno valori di codice hash
diversi. L'istruzione seguente restituisce False .

Console.WriteLine(flight1.GetHashCode = flight3.GetHashCode)

Le istanze di tipi anonimi che designano proprietà diverse come proprietà chiave non sono istanze dello stesso
tipo. Hanno valori di codice hash diversi anche quando i nomi e i valori di tutte le proprietà sono uguali.
L'istruzione seguente restituisce False .

Console.WriteLine(flight1.GetHashCode = flight4.GetHashCode)

Valori Read-Only
Non è possibile modificare i valori delle proprietà chiave. Negli flight1 esempi precedenti, ad esempio, i
Airline campi e sono di sola FlightNo lettura, ma Gate possono essere modificati.

' The following statement will not compile, because FlightNo is a key
' property and cannot be changed.
' flight1.FlightNo = 1234
'
' Gate is not a key property. Its value can be changed.
flight1.Gate = "C5"

Vedi anche
Definizione di tipo anonimo
Procedura: dedurre tipi e nomi di proprietà nelle dichiarazioni di tipo anonimo
Tipi anonimi
Modulo <keyword> (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica che un attributo all'inizio di un file di origine viene applicato al modulo di assembly corrente.

Commenti
Molti attributi riguardano un singolo elemento di programmazione, ad esempio una classe o una proprietà.
Applicare tale attributo alleghindo il blocco di attributi, racchiuso tra parentesi acute ( < > ), direttamente
all'istruzione di dichiarazione.
Se un attributo riguarda non solo l'elemento seguente ma al modulo di assembly corrente, il blocco di attributi
viene inserito all'inizio del file di origine e l'attributo viene identificato con la Module parola chiave. Se si applica
all'intero assembly, usare la parola chiave assembly .
Il Module modificatore non è uguale all' istruzione Module.

Vedi anche
Assembly
Istruzione Module
Panoramica degli attributi
MustInherit (Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

Specifica che una classe può essere utilizzata solo come classe base e che non è possibile creare un oggetto
direttamente da tale classe.

Commenti
Lo scopo di una classe di base (nota anche come classe astratta) consiste nel definire la funzionalità comune a
tutte le classi derivate. Questo consente di salvare le classi derivate dalla necessità di ridefinire gli elementi
comuni. In alcuni casi, questa funzionalità comune non è sufficientemente completa per creare un oggetto
utilizzabile e ogni classe derivata definisce la funzionalità mancante. In tal caso, si desidera che il codice
consumer crei oggetti solo dalle classi derivate. Usare MustInherit nella classe di base per applicare questa
operazione.
Un altro uso di una MustInherit classe consiste nel limitare una variabile a un set di classi correlate. È possibile
definire una classe di base e derivare tutte le classi correlate. La classe base non deve fornire funzionalità
comuni a tutte le classi derivate, ma può fungere da filtro per l'assegnazione di valori alle variabili. Se il codice
consumer dichiara una variabile come classe di base, Visual Basic consente di assegnare a tale variabile solo un
oggetto da una delle classi derivate.
Il .NET Framework definisce diverse MustInherit classi, tra cui Array , Enum e ValueType . ValueType è un
esempio di una classe di base che limita una variabile. Tutti i tipi di valore derivano da ValueType . Se si dichiara
una variabile come ValueType , è possibile assegnare solo tipi valore a tale variabile.

Regole
Contesto della dichiarazione. È possibile utilizzare MustInherit solo in un' Class istruzione.
Modificatori combinati. Non è possibile specificare MustInherit insieme NotInheritable a nella
stessa dichiarazione.

Esempio
Nell'esempio seguente viene illustrata l'ereditarietà forzata e l'override forzato. La classe base shape definisce
una variabile acrossLine . Le classi circle e square derivano da shape . Ereditano la definizione di
acrossLine , ma devono definire la funzione area perché il calcolo è diverso per ogni tipo di forma.
Public MustInherit Class shape
Public acrossLine As Double
Public MustOverride Function area() As Double
End Class
Public Class circle : Inherits shape
Public Overrides Function area() As Double
Return Math.PI * acrossLine
End Function
End Class
Public Class square : Inherits shape
Public Overrides Function area() As Double
Return acrossLine * acrossLine
End Function
End Class
Public Class consumeShapes
Public Sub makeShapes()
Dim shape1, shape2 As shape
shape1 = New circle
shape2 = New square
End Sub
End Class

È possibile dichiarare shape1 e shape2 per essere di tipo shape . Tuttavia, non è possibile creare un oggetto da
shape perché manca la funzionalità della funzione area ed è contrassegnato MustInherit .

Poiché sono dichiarati come shape , le variabili shape1 e shape2 sono limitate agli oggetti delle classi derivate
circle e square . Visual Basic non consente di assegnare altri oggetti a queste variabili, che offre un livello
elevato di indipendenza dai tipi.

Utilizzo
Il MustInherit modificatore può essere usato in questo contesto:
Istruzione Class

Vedi anche
Inherits Statement
NotInheritable
Parole chiave
Nozioni fondamentali sull'ereditarietà
MustOverride (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica che una proprietà o una routine non è implementata in questa classe e deve essere sottoposta a
override in una classe derivata prima di poter essere utilizzata.

Commenti
È possibile utilizzare MustOverride solo in un'istruzione di dichiarazione di proprietà o di routine. La proprietà o
la routine che specifica MustOverride deve essere un membro di una classe e la classe deve essere
contrassegnata come MustInherit.

Regole
Dichiarazione incompleta. Quando si specifica MustOverride , non vengono fornite righe di codice
aggiuntive per la proprietà o la routine, non anche per l' End Function End Property istruzione, o
End Sub .

Modificatori combinati. Non è possibile specificare MustOverride insieme a NotOverridable ,


Overridable o Shared nella stessa dichiarazione.

Shadowing e override. Sebbene lo shadowing e l'override ridefiniscano entrambi un elemento


ereditato, tra i due metodi esistono differenze sostanziali. Per ulteriori informazioni, vedere shadowing in
Visual Basic.
Termini alternativi. Un elemento che non può essere utilizzato ad eccezione di un override viene
talvolta denominato elemento virtuale puro .
Il modificatore MustOverride può essere usato nei contesti seguenti:
Istruzione Function
Property Statement
Istruzione Sub

Vedi anche
NotOverridable
Overridable
Override
MustInherit
Parole chiave
Shadowing in Visual Basic
Narrowing (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Indica che un operatore di conversione ( CType ) converte una classe o una struttura in un tipo che potrebbe
non essere in grado di contenere alcuni dei possibili valori della classe o della struttura originale.

Conversione con la parola chiave Narrowing


La procedura di conversione deve specificare Public Shared oltre a Narrowing .
Le conversioni verso un tipo di dati più piccolo non vengono sempre eseguite in fase di esecuzione e possono
avere esito negativo o causare una perdita di dati. Gli esempi Long sono Integer , String a Date e un tipo di
base a un tipo derivato. Questa ultima conversione si restringe perché il tipo di base potrebbe non contenere
tutti i membri del tipo derivato e pertanto non è un'istanza del tipo derivato.
Se Option Strict è On , il codice consumer deve utilizzare CType per tutte le conversioni verso un tipo di
caratteri più piccolo.
La Narrowing parola chiave può essere usata in questo contesto:
Operator Statement

Vedi anche
Operator Statement
Widening
Widening and Narrowing Conversions
Procedura: definire un operatore
CType Function
Option Strict Statement
NotInheritable (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica che una classe non può essere utilizzata come classe base.

Commenti
Termini alternativi . Una classe che non può essere ereditata è talvolta denominata classe sealed .
Il NotInheritable modificatore può essere usato in questo contesto:
Istruzione Class

Vedi anche
Inherits Statement
MustInherit
Parole chiave
NotOverridable (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica che una proprietà o una routine non può essere sottoposta a override in una classe derivata.

Commenti
Il NotOverridable modificatore impedisce che una proprietà o un metodo venga sottoposto a override in una
classe derivata. Il modificatore Overridable consente di eseguire l'override di una proprietà o di un metodo in
una classe in una classe derivata. Per altre informazioni, vedere Nozioni fondamentali sull'ereditarietà.
Se il Overridable NotOverridable modificatore o non è specificato, l'impostazione predefinita dipende dalla
proprietà o dal metodo che esegue l'override di una proprietà o di un metodo della classe base. Se la proprietà o
il metodo esegue l'override di una proprietà o di un metodo della classe base, l'impostazione predefinita è
Overridable ; in caso contrario, è NotOverridable .

Un elemento che non può essere sottoposto a override è talvolta denominato elemento sealed .
È possibile utilizzare NotOverridable solo in un'istruzione di dichiarazione di proprietà o di routine. È possibile
specificare NotOverridable solo su una proprietà o una routine che esegue l'override di un'altra proprietà o
routine, ovvero solo in combinazione con Overrides .

Modificatori combinati
Non è possibile specificare Overridable o NotOverridable per un Private metodo.
Non è possibile specificare NotOverridable insieme a MustOverride , Overridable o Shared nella stessa
dichiarazione.

Utilizzo
Il modificatore NotOverridable può essere usato nei contesti seguenti:
Istruzione Function
Property Statement
Istruzione Sub

Vedi anche
Modificatori
Nozioni fondamentali sull'ereditarietà
MustOverride
Overridable
Override
Parole chiave
Shadowing in Visual Basic
Optional (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica che un argomento di routine può essere omesso quando viene chiamata la stored procedure.

Commenti
Per ogni parametro facoltativo, è necessario specificare un'espressione costante come valore predefinito del
parametro. Se l'espressione restituisce Nothing, il valore predefinito del tipo di dati value viene utilizzato come
valore predefinito del parametro.
Se l'elenco di parametri contiene un parametro facoltativo, anche ogni parametro che lo segue deve essere
facoltativo.
Il modificatore Optional può essere usato nei contesti seguenti:
Declare Statement
Istruzione Function
Property Statement
Istruzione Sub

NOTE
Quando si chiama una routine con o senza parametri facoltativi, è possibile passare gli argomenti in base alla posizione o
al nome. Per ulteriori informazioni, vedere passaggio di argomenti in base alla posizione e al nome.

NOTE
È anche possibile definire una routine con parametri facoltativi tramite l'overload. Se si dispone di un parametro
facoltativo, è possibile definire due versioni di overload della stored procedure, una che accetta il parametro e l'altra. Per
altre informazioni, vedere Procedure Overloading.

Esempio
Nell'esempio seguente viene definita una routine con un parametro facoltativo.
Public Function FindMatches(ByRef values As List(Of String),
ByVal searchString As String,
Optional ByVal matchCase As Boolean = False) As List(Of String)

Dim results As IEnumerable(Of String)

If matchCase Then
results = From v In values
Where v.Contains(searchString)
Else
results = From v In values
Where UCase(v).Contains(UCase(searchString))
End If

Return results.ToList()
End Function

Esempio
Nell'esempio seguente viene illustrato come chiamare una stored procedure con argomenti passati in base alla
posizione e con argomenti passati in base al nome. La procedura include due parametri facoltativi.

Private Sub TestParameters()


' Call the procedure with its arguments passed by position,
studentInfo("Mary", 19, #9/21/1981#)

' Omit one optional argument by holding its place with a comma.
studentInfo("Mary", , #9/21/1981#)

' Call the procedure with its arguments passed by name.


studentInfo(age:=19, birth:=#9/21/1981#, name:="Mary")

' Supply an argument by position and an argument by name.


studentInfo("Mary", birth:=#9/21/1981#)
End Sub

Private Sub studentInfo(ByVal name As String,


Optional ByVal age As Short = 0,
Optional ByVal birth As Date = #1/1/2000#)

Console.WriteLine("name: " & name)


Console.WriteLine("age: " & age)
Console.WriteLine("birth date: " & birth)
Console.WriteLine()
End Sub

Vedi anche
Elenco parametri
Parametri facoltativi
Parole chiave
Out (modificatore generico) (Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

Per i parametri di tipo generico, la Out parola chiave specifica che il tipo è covariante.

Commenti
La covarianza consente di usare un tipo più derivato di quello specificato dal parametro generico. Ciò consente
la conversione implicita di classi che implementano interfacce varianti e la conversione implicita di tipi delegati.
Per altre informazioni, vedere Covarianza e controvarianza.

Regole
È possibile usare la parola chiave Out in interfacce e delegati generici.
In un'interfaccia generica un parametro di tipo può essere dichiarato covariante se soddisfa le condizioni
seguenti:
Il parametro di tipo viene usato solo come tipo restituito di metodi di interfaccia e non viene usato come
tipo di argomenti del metodo.

NOTE
Esiste un'eccezione a questa regola. Se in un'interfaccia covariante è presente un delegato generico controvariante
come parametro del metodo, è possibile usare il tipo covariante come parametro di tipo generico per questo
delegato. Per altre informazioni sui delegati generici covarianti e controvarianti, vedere Varianza nei delegati e Uso
della varianza per i delegati generici Func e Action.

Il parametro di tipo non viene usato come vincolo generico per i metodi di interfaccia.
In un delegato generico, un parametro di tipo può essere dichiarato covariante se viene usato solo come tipo
restituito del metodo e non usato per gli argomenti del metodo.
La covarianza e la controvarianza sono supportate per i tipi di riferimento, ma non per i tipi di valore.
In Visual Basic non è possibile dichiarare gli eventi nelle interfacce covariante senza specificare il tipo delegato.
Inoltre, le interfacce covariante non possono avere classi, enumerazioni o strutture annidate, ma possono avere
interfacce nidificate.

Comportamento
Un'interfaccia che dispone di un parametro di tipo covariante consente ai metodi di restituire tipi più derivati di
quelli specificati dal parametro di tipo. Poiché, ad esempio, in .NET Framework 4, nell'interfaccia
IEnumerable<T>, il tipo T è covariante, è possibile assegnare un oggetto di tipo IEnumerable(Of String) a un
oggetto di tipo IEnumerable(Of Object) senza usare alcun metodo di conversione speciale.
A un delegato covariante può essere assegnato un altro delegato dello stesso tipo, ma con un parametro di tipo
generico più derivato.

Esempio
L'esempio seguente illustra come dichiarare, estendere e implementare un'interfaccia generica covariante.
L'esempio descrive anche come usare la conversione implicita per le classi che implementano un'interfaccia
covariante.

' Covariant interface.


Interface ICovariant(Of Out R)
End Interface

' Extending covariant interface.


Interface IExtCovariant(Of Out R)
Inherits ICovariant(Of R)
End Interface

' Implementing covariant interface.


Class Sample(Of R)
Implements ICovariant(Of R)
End Class

Sub Main()
Dim iobj As ICovariant(Of Object) = New Sample(Of Object)()
Dim istr As ICovariant(Of String) = New Sample(Of String)()

' You can assign istr to iobj because


' the ICovariant interface is covariant.
iobj = istr
End Sub

Esempio
L'esempio seguente illustra come dichiarare, creare un'istanza e richiamare un delegato generico covariante.
Viene inoltre illustrato come è possibile utilizzare la conversione implicita per i tipi delegati.

' Covariant delegate.


Public Delegate Function DCovariant(Of Out R)() As R

' Methods that match the delegate signature.


Public Shared Function SampleControl() As Control
Return New Control()
End Function

Public Shared Function SampleButton() As Button


Return New Button()
End Function

Private Sub Test()

' Instantiating the delegates with the methods.


Dim dControl As DCovariant(Of Control) =
AddressOf SampleControl
Dim dButton As DCovariant(Of Button) =
AddressOf SampleButton

' You can assign dButton to dControl


' because the DCovariant delegate is covariant.
dControl = dButton

' Invoke the delegate.


dControl()
End Sub

Vedi anche
Varianza nelle interfacce generiche
In
Overloads (Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

Specifica che una proprietà o una routine ridichiara una o più proprietà o routine esistenti con lo stesso nome.

Commenti
L' Overload è la pratica di fornire più di una definizione per un nome di proprietà o di routine specifico nello
stesso ambito. La ridichiarazione di una proprietà o di una routine con una firma diversa viene talvolta chiamata
nascosta dalla firma.

Regole
Contesto della dichiarazione. È possibile utilizzare Overloads solo in un'istruzione di dichiarazione di
proprietà o di routine.
Modificatori combinati. Non è possibile specificare Overloads insieme a Shadows nella stessa
dichiarazione di routine.
Differenze necessarie. La firma in questa dichiarazione deve essere diversa dalla firma di ogni
proprietà o routine che viene sovraccaricata. La firma comprende il nome della proprietà o della routine e
gli elementi seguenti:
numero dei parametri
ordine dei parametri
tipi di dati dei parametri
numero dei parametri di tipo (per una routine generica)
tipo restituito (solo per una routine di operatore di conversione)
Tutti gli overload devono avere lo stesso nome, ma ognuno deve essere diverso da tutti gli altri per uno o
più elementi tra quelli elencati in precedenza. Questo consente al compilatore di distinguere la versione
da usare quando il codice chiama la proprietà o la routine.
Differenze non consentite. Poiché gli elementi riportati di seguito non fanno parte della firma, la
relativa modifica non è valida per l'overload di una proprietà o di una routine:
la capacità di restituire un valore (per una routine)
il tipo di dati del valore restituito (ad eccezione di un operatore di conversione)
i nomi dei parametri o dei parametri di tipo
i vincoli definiti sui parametri di tipo (per una routine generica)
le parole chiave di modificatori di parametro (ad esempio ByRef o Optional )
e parole chiave di modificatori di proprietà o di routine (ad esempio Public o Shared )
Modificatore facoltativo. Non è necessario usare il Overloads modificatore quando si definiscono più
proprietà o routine di overload nella stessa classe. Se tuttavia si usa Overloads in una dichiarazione, è
necessario usarlo in tutte.
Ombreggiatura e overload. Overloads può anche essere usato per nascondere un membro esistente
o un set di membri di overload in una classe base. Quando si usa Overloads a questo scopo, è necessario
dichiarare la proprietà o il metodo con lo stesso nome e lo stesso elenco di parametri del membro della
classe base, senza specificare la parola chiave Shadows .
Se si usa Overrides , il compilatore aggiunge implicitamente Overloads in modo che le API della libreria
funzionino più facilmente con C#.
Il modificatore Overloads può essere usato nei contesti seguenti:
Istruzione Function
Operator Statement
Property Statement
Istruzione Sub

Vedi anche
Ombreggiature
Overload della routine
Generic Types in Visual Basic
Routine di operatore
Procedura: Definire un operatore di conversione
Overridable (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica che una proprietà o una routine può essere sottoposta a override da una proprietà o una routine con
nome identico in una classe derivata.

Commenti
Il Overridable modificatore consente di eseguire l'override di una proprietà o di un metodo in una classe in una
classe derivata. Il modificatore NotOverridable impedisce l'override di una proprietà o di un metodo in una
classe derivata. Per altre informazioni, vedere Nozioni fondamentali sull'ereditarietà.
Se il Overridable NotOverridable modificatore o non è specificato, l'impostazione predefinita dipende dalla
proprietà o dal metodo che esegue l'override di una proprietà o di un metodo della classe base. Se la proprietà o
il metodo esegue l'override di una proprietà o di un metodo della classe base, l'impostazione predefinita è
Overridable ; in caso contrario, è NotOverridable .

È possibile eseguire l'ombreggiatura o l'override per ridefinire un elemento ereditato, ma esistono differenze
significative tra i due approcci. Per ulteriori informazioni, vedere shadowing in Visual Basic.
Un elemento di cui è possibile eseguire l'override viene talvolta definito come elemento virtuale . Se è possibile
eseguirne l'override, ma non è necessario, viene talvolta chiamato anche elemento concreto .
È possibile utilizzare Overridable solo in un'istruzione di dichiarazione di proprietà o di routine.

Modificatori combinati
Non è possibile specificare Overridable o NotOverridable per un Private metodo.
Non è possibile specificare Overridable insieme a MustOverride , NotOverridable o Shared nella stessa
dichiarazione.
Poiché un elemento che esegue l'override può essere implicitamente sottoposto a override, non è possibile
combinare Overridable e Overrides .

Utilizzo
Il modificatore Overridable può essere usato nei contesti seguenti:
Istruzione Function
Property Statement
Istruzione Sub

Vedi anche
Modificatori
Nozioni fondamentali sull'ereditarietà
MustOverride
NotOverridable
Override
Parole chiave
Shadowing in Visual Basic
Overrides (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica che una proprietà o una routine esegue l'override di una proprietà o una routine con nome identico
ereditata da una classe base.

Regole
Contesto della dichiarazione. È possibile utilizzare Overrides solo in un'istruzione di dichiarazione di
proprietà o di routine.
Modificatori combinati. Non è possibile specificare Overrides insieme a Shadows o Shared nella
stessa dichiarazione. Poiché un elemento che esegue l'override può essere implicitamente sottoposto a
override, non è possibile combinare Overridable e Overrides .
Firme corrispondenti. La firma di questa dichiarazione deve corrispondere esattamente alla firma della
proprietà o della routine sottoposta a override. In altre parole, gli elenchi di parametri devono presentare
lo stesso numero di parametri, nel medesimo ordine, e contenere gli stessi tipi di dati.
Oltre alla firma, la dichiarazione che esegue l'override deve anche corrispondere esattamente a quanto
segue.
Livello di accesso
Tipo restituito, se disponibile
Firme generiche. Nel caso di una routine generica la firma include il numero di parametri del tipo. La
dichiarazione che esegue l'override, quindi, deve corrispondere alla versione della classe base anche in
relazione a tali caratteristiche.
Corrispondenze aggiuntive. Oltre a corrispondere alla firma della versione della classe base, la
dichiarazione deve presentare anche le corrispondenze seguenti:
Modificatore a livello di accesso (ad esempio public)
Passaggio del meccanismo di ogni parametro (ByVal o ByRef)
Elenchi di vincoli su ogni parametro di tipo di una routine generica
Shadowing e override. Sebbene lo shadowing e l'override ridefiniscano entrambi un elemento
ereditato, tra i due metodi esistono differenze sostanziali. Per ulteriori informazioni, vedere shadowing in
Visual Basic.
Se si usa Overrides , il compilatore aggiunge implicitamente Overloads in modo che le API della libreria
funzionino più facilmente con C#.
Il modificatore Overrides può essere usato nei contesti seguenti:
Istruzione Function
Property Statement
Istruzione Sub

Vedi anche
MustOverride
NotOverridable
Overridable
Parole chiave
Shadowing in Visual Basic
Generic Types in Visual Basic
Type List
ParamArray (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica che un parametro di routine accetta una matrice facoltativa di elementi del tipo specificato. ParamArray
può essere usato solo nell'ultimo parametro di un elenco di parametri.

Commenti
ParamArray consente di passare un numero arbitrario di argomenti alla procedura. Un ParamArray parametro
viene sempre dichiarato utilizzando ByVal.
È possibile specificare uno o più argomenti per un ParamArray parametro passando una matrice del tipo di dati
appropriato, un elenco delimitato da virgole di valori o nulla. Per informazioni dettagliate, vedere la sezione
relativa alla chiamata a ParamArray in matrici di parametri.

IMPORTANT
Ogni volta che si tratta di una matrice che può essere indefinitamente grande, esiste il rischio di sovraeseguire una
capacità interna dell'applicazione. Se si accetta una matrice di parametri dal codice chiamante, è necessario testarne la
lunghezza ed eseguire le operazioni appropriate se è troppo grande per l'applicazione.

Il modificatore ParamArray può essere usato nei contesti seguenti:


Declare Statement
Istruzione Function
Property Statement
Istruzione Sub

Vedi anche
Parole chiave
Matrici di parametri
Partial (Visual Basic)
05/03/2021 • 5 minutes to read • Edit Online

Indica che una dichiarazione di tipo è una definizione parziale del tipo.
Si può dividere la definizione di un tipo tra più dichiarazioni mediante la parola chiave Partial . Si può usare il
numero di dichiarazioni parziali desiderato, in un numero qualsiasi di file di origine differenti. Tutte le
dichiarazioni, tuttavia, devono trovarsi nello stesso assembly e nello stesso spazio dei nomi.

NOTE
Visual Basic supporta i metodi parziali, che in genere sono implementati nelle classi parziali. Per altre informazioni, vedere
metodi parziali e istruzione secondaria.

Sintassi
[ <attrlist> ] [ accessmodifier ] [ Shadows ] [ MustInherit | NotInheritable ] _
Partial { Class | Structure | Interface | Module } name [ (Of typelist) ]
[ Inherits classname ]
[ Implements interfacenames ]
[ variabledeclarations ]
[ proceduredeclarations ]
{ End Class | End Structure }

Parti
T ERM IN E DEF IN IZ IO N E

attrlist facoltativo. Elenco degli attributi applicabili al tipo. È


necessario racchiudere l' elenco degli attributi tra parentesi
angolari ( < > ).

accessmodifier facoltativo. Specifica il tipo di codice che può accedere al tipo.


Vedere livelli di accesso in Visual Basic.

Shadows facoltativo. Vedere Shadows.

MustInherit facoltativo. Vedere MustInherit.

NotInheritable facoltativo. Vedere NotInheritable.

name Obbligatorio. Nome del tipo. Deve corrispondere al nome


definito in tutte le altre dichiarazioni parziali dello stesso tipo.

Of facoltativo. Specifica che si tratta di un tipo generico. Vedere


tipi generici in Visual Basic.

typelist Obbligatorio se si usa. Vedere elenco dei tipi.


T ERM IN E DEF IN IZ IO N E

Inherits facoltativo. Vedere istruzione Inherits.

classname Obbligatorio se si usa Inherits . Nome della classe o


dell'interfaccia da cui deriva la classe.

Implements facoltativo. Vedere istruzione Implements.

interfacenames Obbligatorio se si usa Implements . Nomi delle interfacce


implementate dal tipo.

variabledeclarations facoltativo. Istruzioni che dichiarano variabili ed eventi


aggiuntivi per il tipo.

proceduredeclarations facoltativo. Istruzioni che dichiarano e definiscono routine


aggiuntive per il tipo.

End Class o End Structure Termina questa definizione Class o Structure parziale.

Commenti
Visual Basic usa definizioni di classi parziali per separare il codice generato dal codice creato dall'utente in file di
origine distinti. Ad esempio, Progettazione Windows Form definisce classi parziali per controlli come Form.
In questi controlli il codice generato non deve essere modificato.
Durante la creazione di un tipo parziale vengono applicate tutte le regole per la creazione delle classi, delle
strutture, delle interfacce e dei moduli, ad esempio quelle relative all'uso dei modificatori e all'ereditarietà.

Procedure consigliate
In condizioni normali, non è consigliabile suddividere lo sviluppo di un singolo tipo in due o più
dichiarazioni. Pertanto, nella maggior parte dei casi non occorre specificare la parola chiave Partial .
Per migliorare la leggibilità, ogni dichiarazione parziale di un tipo deve includere la parola chiave
Partial . Il compilatore consente che la parola chiave venga omessa al massimo in una dichiarazione
parziale. Se viene omessa in due o più dichiarazioni, viene segnalato un errore.

Comportamento
Unione delle dichiarazioni Il compilatore considera il tipo come l'unione di tutte le relative
dichiarazioni parziali. Ogni modificatore di ciascuna definizione parziale si applica all'intero tipo e ogni
membro di ciascuna definizione parziale è disponibile per l'intero tipo.
Promozione tipo non consentita per i tipi parziali nei moduli. Se una definizione parziale si trova
all'interno di un modulo, l'effetto della promozione tipo di tale tipo viene automaticamente annullato. In
questo caso, un set di definizioni parziali può generare risultati imprevisti e persino errori del
compilatore. Per ulteriori informazioni, vedere promozione del tipo.
Il compilatore unisce le definizioni parziali solo se i relativi percorsi completi sono identici.
È possibile usare la parola chiave Partial nei contesti seguenti:
Istruzione Class
Istruzione Structure

Esempio
L'esempio seguente suddivide la definizione della classe sampleClass in due dichiarazioni, ognuna delle quali
definisce una routine Sub differente.

Partial Public Class sampleClass


Public Sub sub1()
End Sub
End Class
Partial Public Class sampleClass
Public Sub sub2()
End Sub
End Class

Le due definizioni parziali nell'esempio precedente possono trovarsi nello stesso file di origine o in due file di
origine differenti.

Vedi anche
Istruzione Class
Istruzione Structure
Promozione tipo
Ombreggiature
Generic Types in Visual Basic
Metodi parziali
Private (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica che uno o più elementi di programmazione dichiarati sono accessibili solo dall'interno del contesto di
dichiarazione, incluso all'interno di qualsiasi tipo contenuto.

Commenti
Se un elemento di programmazione rappresenta una funzionalità proprietaria o contiene dati riservati, in
genere si vuole limitarne l'accesso al più possibile. Si ottiene la massima limitazione consentendo solo il
modulo, la classe o la struttura che lo definisce per accedervi. Per limitare l'accesso a un elemento in questo
modo, è possibile dichiararlo con Private .

NOTE
È anche possibile usare il modificatore di accesso privato protetto , che rende accessibile un membro all'interno di tale
classe e dalle classi derivate presenti nell'assembly contenitore.

Regole
Contesto della dichiarazione. Si può usare Private solo a livello di modulo. Ciò significa che il contesto
di dichiarazione per un Private elemento deve essere un modulo, una classe o una struttura e non può
essere un file di origine, uno spazio dei nomi, un'interfaccia o una routine.

Comportamento
Livello di accesso. Tutto il codice all'interno di un contesto di dichiarazione può accedere ai relativi
Private elementi. Incluso il codice all'interno di un tipo contenuto, ad esempio una classe annidata o
un'espressione di assegnazione in un'enumerazione. Nessun codice esterno al contesto di dichiarazione
può accedere ai relativi Private elementi.
Modificatori di accesso. Le parole chiave che specificano il livello di accesso sono denominate
modificatori di accesso. Per un confronto dei modificatori di accesso, vedere livelli di accesso in Visual
Basic.
Il modificatore Private può essere usato nei contesti seguenti:
Istruzione Class
Istruzione Const
Declare Statement
Istruzione Delegate
Istruzione Dim
Istruzione Enum
Istruzione Event
Istruzione Function
Istruzione Interface
Property Statement
Istruzione Structure
Istruzione Sub

Vedi anche
Pubblica
Protetto
Friend
Privato protetto
Protected Friend
Livelli di accesso in Visual Basic
Procedure
Strutture
Oggetti e classi
Privato protetto (Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

La combinazione delle parole chiave Private Protected è un modificatore di accesso ai membri. Un


Private Protected membro è accessibile da tutti i membri della classe che lo contiene, nonché dai tipi derivati
dalla classe che lo contiene, ma solo se vengono trovati nell'assembly contenitore.
È possibile specificare Private Protected solo per i membri delle classi. non è possibile applicare
Private Protected ai membri di una struttura perché le strutture non possono essere ereditate.

Il Private Protected modificatore di accesso è supportato da Visual Basic 15,5 e versioni successive. Per usarlo,
è possibile aggiungere l'elemento seguente al file del progetto di Visual Basic ( * . vbproj). Fino a quando nel
sistema è installato Visual Basic 15,5 o versione successiva, è possibile sfruttare tutte le funzionalità del
linguaggio supportate dalla versione più recente del compilatore Visual Basic:

<PropertyGroup>
<LangVersion>latest</LangVersion>
</PropertyGroup>

Per ulteriori informazioni, vedere impostazione della versione della lingua Visual Basic.

NOTE
In Visual Studio, selezionando la Guida sensibile al contesto, private protected viene fornita una guida per privato o
protetto. L'IDE sceglie il singolo token sotto il cursore anziché la parola composta.

Regole
Contesto della dichiarazione. È possibile usare Private Protected solo a livello di classe. Ciò significa che
il contesto di dichiarazione per un Protected elemento deve essere una classe e non può essere un file di
origine, uno spazio dei nomi, un'interfaccia, un modulo, una struttura o una procedura.

Comportamento
Livello di accesso. Tutto il codice in una classe può accedere ai relativi elementi. Il codice in qualsiasi
classe che deriva da una classe base e che è contenuto nello stesso assembly può accedere a tutti gli
Private Protected elementi della classe di base. Tuttavia, il codice in qualsiasi classe che deriva da una
classe base e che è contenuto in un assembly diverso non può accedere agli elementi della classe di base
Private Protected .

Modificatori di accesso. Le parole chiave che specificano il livello di accesso sono denominate
modificatori di accesso. Per un confronto dei modificatori di accesso, vedere livelli di accesso in Visual
Basic.
Il modificatore Private Protected può essere usato nei contesti seguenti:
Istruzione Class di una classe annidata
Istruzione Const
Declare Statement
Istruzione Delegate di un delegato annidato in una classe
Istruzione Dim
Istruzione enum di un'enumerazione annidata in una classe
Istruzione Event
Istruzione Function
Istruzione Interface di un'interfaccia annidata in una classe
Property Statement
Istruzione Structure di una struttura annidata in una classe
Istruzione Sub

Vedi anche
Pubblica
Protetto
Friend
Privata
Protected Friend
Livelli di accesso in Visual Basic
Procedure
Strutture
Oggetti e classi
Protected (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Un modificatore di accesso ai membri che specifica che uno o più elementi di programmazione dichiarati sono
accessibili solo dall'interno della propria classe o da una classe derivata.

Commenti
A volte un elemento di programmazione dichiarato in una classe contiene dati sensibili o codice limitato e si
vuole limitare l'accesso all'elemento. Tuttavia, se la classe è ereditabile e si prevede una gerarchia di classi
derivate, potrebbe essere necessario che queste classi derivate accedano ai dati o al codice. In tal caso, è
necessario che l'elemento sia accessibile sia dalla classe di base che da tutte le classi derivate. Per limitare
l'accesso a un elemento in questo modo, è possibile dichiararlo con Protected .

NOTE
Il Protected modificatore di accesso può essere combinato con altri due modificatori:
Il modificatore Friend protetto rende accessibile un membro della classe da tale classe, dalle classi derivate e dallo
stesso assembly in cui è definita la classe.
Il modificatore protected privato rende accessibile a un membro della classe i tipi derivati, ma solo all'interno
dell'assembly che lo contiene.

Regole
Contesto della dichiarazione. È possibile usare Protected solo a livello di classe. Ciò significa che il contesto
di dichiarazione per un Protected elemento deve essere una classe e non può essere un file di origine, uno
spazio dei nomi, un'interfaccia, un modulo, una struttura o una procedura.

Comportamento
Livello di accesso. Tutto il codice in una classe può accedere ai relativi elementi. Il codice in qualsiasi
classe che deriva da una classe base può accedere a tutti gli Protected elementi della classe di base.
Questo vale per tutte le generazioni di derivazione. Ciò significa che una classe può accedere Protected
agli elementi della classe di base della classe di base e così via.
L'accesso protetto non è un superset o un subset di accesso Friend.
Modificatori di accesso. Le parole chiave che specificano il livello di accesso sono denominate
modificatori di accesso. Per un confronto dei modificatori di accesso, vedere livelli di accesso in Visual
Basic.
Il modificatore Protected può essere usato nei contesti seguenti:
Istruzione Class
Istruzione Const
Declare Statement
Istruzione Delegate
Istruzione Dim
Istruzione Enum
Istruzione Event
Istruzione Function
Istruzione Interface
Property Statement
Istruzione Structure
Istruzione Sub

Vedi anche
Pubblica
Friend
Privata
Privato protetto
Protected Friend
Livelli di accesso in Visual Basic
Procedure
Strutture
Oggetti e classi
Friend protetto (Visual Basic)
18/03/2021 • 2 minutes to read • Edit Online

La combinazione delle parole chiave Protected Friend è un modificatore di accesso ai membri. Conferisce sia
l'accesso Friend che l'accesso protetto sugli elementi dichiarati, in modo che siano accessibili da qualsiasi punto
dello stesso assembly, dalla propria classe e dalle classi derivate. È possibile specificare Protected Friend solo
per i membri delle classi. non è possibile applicare Protected Friend ai membri di una struttura perché le
strutture non possono essere ereditate.

NOTE
In Visual Studio, selezionando la Guida sensibile al contesto, Protected Friend viene fornita una guida per protected o
Friend. L'IDE sceglie il singolo token sotto il cursore anziché la parola composta.

Vedi anche
Pubblica
Protetto
Friend
Privata
Privato protetto
Livelli di accesso in Visual Basic
Procedure
Strutture
Oggetti e classi
Public (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica che uno o più elementi di programmazione dichiarati non hanno restrizioni di accesso.

Commenti
Se si pubblica un componente o un set di componenti, ad esempio una libreria di classi, in genere si vuole che
gli elementi di programmazione siano accessibili da qualsiasi codice che interagisce con l'assembly. Per
conferire l'accesso illimitato a un elemento, è possibile dichiararlo con Public .
L'accesso pubblico è il livello normale per un elemento di programmazione quando non è necessario limitarne
l'accesso. Si noti che il livello di accesso di un elemento dichiarato all'interno di un'interfaccia, di un modulo, di
una classe o di una struttura viene impostato sul valore predefinito Public se non viene dichiarato in caso
contrario.

Regole
Contesto della dichiarazione. È possibile usare Public solo a livello di modulo, interfaccia o spazio dei
nomi. Ciò significa che il contesto di dichiarazione per un Public elemento deve essere un file di origine,
uno spazio dei nomi, un'interfaccia, un modulo, una classe o una struttura e non può essere una routine.

Comportamento
Livello di accesso. Tutto il codice che può accedere a un modulo, una classe o una struttura può
accedere ai relativi Public elementi.
Accesso predefinito. Per impostazione predefinita, le variabili locali all'interno di una stored procedure
non possono usare alcun modificatore di accesso.
Modificatori di accesso. Le parole chiave che specificano il livello di accesso sono denominate
modificatori di accesso. Per un confronto dei modificatori di accesso, vedere livelli di accesso in Visual
Basic.
Il modificatore Public può essere usato nei contesti seguenti:
Istruzione Class
Istruzione Const
Declare Statement
Istruzione Delegate
Istruzione Dim
Istruzione Enum
Istruzione Event
Istruzione Function
Istruzione Interface
Istruzione Module
Operator Statement
Property Statement
Istruzione Structure
Istruzione Sub

Vedi anche
Protetto
Friend
Privata
Privato protetto
Protected Friend
Livelli di accesso in Visual Basic
Procedure
Strutture
Oggetti e classi
ReadOnly (Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

Specifica che una variabile o una proprietà può essere letta ma non scritta.

Commenti
Regole
Contesto della dichiarazione. Si può usare ReadOnly solo a livello di modulo. Ciò significa che il
contesto di dichiarazione per un ReadOnly elemento deve essere una classe, una struttura o un modulo e
non può essere un file di origine, uno spazio dei nomi o una procedura.
Modificatori combinati. Non è possibile specificare ReadOnly insieme Static a nella stessa
dichiarazione.
Assegnazione di un valore. Il codice che utilizza una ReadOnly proprietà non può impostarne il valore.
Il codice che ha accesso all'archiviazione sottostante può tuttavia assegnare o modificare il valore in
qualsiasi momento.
È possibile assegnare un valore a una ReadOnly variabile solo nella relativa dichiarazione o nel
costruttore di una classe o struttura in cui è definito.

Quando usare una variabile di sola lettura


In alcune situazioni non è possibile utilizzare un' istruzione Const per dichiarare e assegnare un valore costante.
Ad esempio, l' Const istruzione potrebbe non accettare il tipo di dati che si desidera assegnare oppure potrebbe
non essere possibile calcolare il valore in fase di compilazione con un'espressione costante. Il valore potrebbe
non essere ancora noto in fase di compilazione. In questi casi, è possibile usare una ReadOnly variabile per
mantenere un valore costante.

IMPORTANT
Se il tipo di dati della variabile è un tipo di riferimento, ad esempio una matrice o un'istanza di classe, i relativi membri
possono essere modificati anche se la variabile stessa è ReadOnly . Questa condizione è illustrata nell'esempio seguente.

ReadOnly characterArray() As Char = {"x"c, "y"c, "z"c}


Sub ChangeArrayElement()
characterArray(1) = "M"c
End Sub

Quando viene inizializzato, la matrice a cui fa riferimento characterArray() include "x", "y" e "z". Poiché la
variabile characterArray è ReadOnly , non è possibile modificarne il valore dopo l'inizializzazione, ovvero non è
possibile assegnarvi una nuova matrice. Tuttavia, è possibile modificare i valori di uno o più membri della
matrice. In seguito a una chiamata alla routine ChangeArrayElement , la matrice a cui fa riferimento
characterArray() include "x", "M" e "z".

Si noti che questo comportamento è simile alla dichiarazione di un parametro di routine come ByVal, che
impedisce alla routine di modificare l'argomento chiamante stesso ma ne consente la modifica dei membri.
Esempio
Nell'esempio seguente viene definita una ReadOnly proprietà per la data di assunzione di un dipendente. La
classe archivia il valore della proprietà internamente come Private variabile e solo il codice all'interno della
classe può modificare tale valore. Tuttavia, la proprietà è Public e qualsiasi codice in grado di accedere alla
classe può leggere la proprietà.

Class employee
' Only code inside class employee can change the value of hireDateValue.
Private hireDateValue As Date
' Any code that can access class employee can read property dateHired.
Public ReadOnly Property dateHired() As Date
Get
Return hireDateValue
End Get
End Property
End Class

Il modificatore ReadOnly può essere usato nei contesti seguenti:


Istruzione Dim
Property Statement

Vedi anche
WriteOnly
Parole chiave
Shadows (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Specifica che un elemento di programmazione dichiarato ridichiara e nasconde un elemento con nome identico
o un set di elementi in overload in una classe base.

Commenti
Lo scopo principale dello shadowing, noto anche come nascondiglio per nome, è quello di mantenere la
definizione dei membri della classe. La classe base può subire una modifica che crea un elemento con lo stesso
nome di uno già definito. In tal caso, il Shadows modificatore impone la risoluzione dei riferimenti attraverso la
classe al membro definito, anziché al nuovo elemento della classe di base.
Sebbene lo shadowing e l'override ridefiniscano entrambi un elemento ereditato, tra i due metodi esistono
differenze sostanziali. Per ulteriori informazioni, vedere shadowing in Visual Basic.

Regole
Contesto della dichiarazione. È possibile usare Shadows solo a livello di classe. Ciò significa che il
contesto di dichiarazione per un Shadows elemento deve essere una classe e non può essere un file di
origine, uno spazio dei nomi, un'interfaccia, un modulo, una struttura o una procedura.
In una singola istruzione di dichiarazione è possibile dichiarare un solo elemento shadowing.
Modificatori combinati. Non è possibile specificare Shadows insieme a Overloads , Overrides o
Static nella stessa dichiarazione.

Tipi di elemento. È possibile nascondere qualsiasi tipo di elemento dichiarato con qualsiasi altro tipo.
Se si nasconde una proprietà o una routine con un'altra proprietà o routine, i parametri e il tipo restituito
non devono corrispondere a quelli della routine o della proprietà della classe base.
Accesso. L'elemento ombreggiato nella classe base non è in genere disponibile all'interno della classe
derivata che lo nasconde. Tuttavia, si applicano le considerazioni seguenti.
Se l'elemento shadowing non è accessibile dal codice che vi fa riferimento, il riferimento viene
risolto nell'elemento ombreggiato. Se, ad esempio, un Private elemento nasconde un elemento
della classe base, il codice che non dispone dell'autorizzazione per accedere all'elemento Private
accede all'elemento della classe di base.
Se si nasconde un elemento, è comunque possibile accedere all'elemento ombreggiato tramite un
oggetto dichiarato con il tipo della classe di base. È anche possibile accedervi tramite MyBase .
Il modificatore Shadows può essere usato nei contesti seguenti:
Istruzione Class
Istruzione Const
Declare Statement
Istruzione Delegate
Istruzione Dim
Istruzione Enum
Istruzione Event
Istruzione Function
Istruzione Interface
Property Statement
Istruzione Structure
Istruzione Sub

Vedi anche
Condivisa
Statico
Privata
Me, My, MyBase e MyClass
Nozioni fondamentali sull'ereditarietà
MustOverride
NotOverridable
Overload
Overridable
Override
Shadowing in Visual Basic
Shared (Visual Basic)
05/03/2021 • 6 minutes to read • Edit Online

Specifica che uno o più elementi di programmazione dichiarati sono associati a una classe o a una struttura di
grandi dimensioni e non a un'istanza specifica della classe o della struttura.

Quando usare Shared


La condivisione di un membro di una classe o di una struttura lo rende disponibile per ogni istanza, anziché non
condivisa, in cui ogni istanza mantiene la propria copia. La condivisione è utile, ad esempio, se il valore di una
variabile viene applicato all'intera applicazione. Se si dichiara tale variabile come Shared , tutte le istanze
accedono allo stesso percorso di archiviazione e se un'istanza modifica il valore della variabile, tutte le istanze
accedono al valore aggiornato.
La condivisione non modifica il livello di accesso di un membro. Un membro di una classe, ad esempio, può
essere condiviso e privato (accessibile solo dall'interno della classe) o non condiviso e pubblico. Per altre
informazioni, vedere livelli di accesso in Visual Basic.

Regole
Contesto della dichiarazione. Si può usare Shared solo a livello di modulo. Ciò significa che il
contesto di dichiarazione per un Shared elemento deve essere una classe o una struttura e non può
essere un file di origine, uno spazio dei nomi o una procedura.
Modificatori combinati. Non è possibile specificare Shared insieme a override, Overridable,
NotOverridable, MustOverrideo static nella stessa dichiarazione.
Accesso. Per accedere a un elemento condiviso, è necessario qualificarlo con il nome della classe o della
struttura, non con il nome della variabile di un'istanza specifica della classe o della struttura. Non è
nemmeno necessario creare un'istanza di una classe o di una struttura per accedere ai relativi membri
condivisi.
Nell'esempio seguente viene chiamata la procedura condivisa IsNaN esposta dalla Double struttura.

If Double.IsNaN(result) Then Console.WriteLine("Result is mathematically undefined.")

Condivisione implicita. Non è possibile usare il Shared modificatore in un' istruzione Const, ma le
costanti sono implicitamente condivise. Analogamente, non è possibile dichiarare un membro di un
modulo o un'interfaccia come Shared , ma sono implicitamente condivisi.

Comportamento
Archiviazione. Una variabile o un evento condiviso viene archiviato in memoria una sola volta,
indipendentemente dal numero di istanze create dalla classe o dalla struttura. Analogamente, una routine
o una proprietà condivisa include un solo set di variabili locali.
Accesso tramite una variabile di istanza. È possibile accedere a un elemento condiviso qualificando
il nome di una variabile che contiene un'istanza specifica della classe o della struttura. Sebbene questo in
genere funzioni come previsto, il compilatore genera un messaggio di avviso e rende l'accesso tramite la
classe o il nome della struttura anziché la variabile.
Accesso tramite un'espressione di istanza. Se si accede a un elemento condiviso tramite
un'espressione che restituisce un'istanza della relativa classe o struttura, il compilatore consente di
accedere tramite il nome della classe o della struttura anziché di valutare l'espressione. Questo accesso
produce risultati imprevisti se si desidera che l'espressione esegua altre azioni, oltre a restituire l'istanza.
Nell'esempio seguente viene illustrata questa situazione.

Sub Main()
' The following line is the preferred way to access Total.
ShareTotal.Total = 10

' The following line generates a compiler warning message and


' accesses total through class ShareTotal instead of through
' the variable instanceVar. This works as expected and adds
' 100 to Total.
Dim instanceVar As New ShareTotal
instanceVar.Total += 100

' The following line generates a compiler warning message and


' accesses total through class ShareTotal instead of calling
' ReturnClass(). This adds 1000 to total but does not work as
' expected, because the WriteLine in ReturnClass() does not run.
Console.WriteLine("Value of total is " & CStr(ShareTotal.Total))
ReturnClass().Total += 1000
End Sub

Public Function ReturnClass() As ShareTotal


Console.WriteLine("Function ReturnClass() called")
Return New ShareTotal
End Function

Public Class ShareTotal


Public Shared Property Total As Integer
End Class

Nell'esempio precedente, il compilatore genera un messaggio di avviso entrambe le volte che il codice
accede alla proprietà condivisa Total tramite un'istanza. In ogni caso, consente di accedere direttamente
alla classe e non ShareTotal usa alcuna istanza. Nel caso della chiamata prevista alla procedura
ReturnClass , ciò significa che non viene anche generata una chiamata a ReturnClass , quindi non viene
eseguita l'azione aggiuntiva di visualizzazione della funzione "ReturnClass () chiamata".
Il modificatore Shared può essere usato nei contesti seguenti:
Istruzione Dim
Istruzione Event
Istruzione Function
Operator Statement
Property Statement
Istruzione Sub

Vedi anche
Ombreggiature
Statico
Durata in Visual Basic
Procedure
Strutture
Oggetti e classi
Static (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Specifica che una o più variabili locali dichiarate devono continuare a esistere e mantenere i valori più recenti
dopo la terminazione della routine in cui sono dichiarate.

Commenti
In genere, una variabile locale di una routine cessa di esistere non appena la procedura viene arrestata. Una
variabile statica continua a esistere e mantiene il valore più recente. Alla successiva chiamata della stored
procedure da parte del codice, la variabile non viene reinizializzata e continua a contenere l'ultimo valore
assegnato. Una variabile statica continua a esistere per la durata della classe o del modulo in cui è definita.

Regole
Contesto della dichiarazione. È possibile utilizzare Static solo su variabili locali. Ciò significa che il
contesto di dichiarazione per una Static variabile deve essere una routine o un blocco in una routine e
non può essere un file di origine, uno spazio dei nomi, una classe, una struttura o un modulo.
Non è possibile utilizzare Static all'interno di una routine della struttura.
Static Non è possibile dedurre i tipi di dati delle variabili locali. Per altre informazioni, vedere inferenza
dei tipi locali.
Modificatori combinati. Non è possibile specificare Static insieme a ReadOnly , Shadows o Shared
nella stessa dichiarazione.

Comportamento
Quando si dichiara una variabile statica in una Shared routine, solo una copia della variabile statica è
disponibile per l'intera applicazione. È possibile chiamare una Shared stored procedure usando il nome della
classe, non una variabile che punta a un'istanza della classe.
Quando si dichiara una variabile statica in una routine che non è Shared , solo una copia della variabile è
disponibile per ogni istanza della classe. Una routine non condivisa viene chiamata utilizzando una variabile che
punta a un'istanza specifica della classe.

Esempio
L'esempio seguente illustra l'uso di Static .

Function updateSales(ByVal thisSale As Decimal) As Decimal


Static totalSales As Decimal = 0
totalSales += thisSale
Return totalSales
End Function

La variabile totalSales viene inizializzata su 0 solo una volta. Ogni volta che si immette
Static updateSales ,
totalSales dispone ancora del valore più recente calcolato.

Il Static modificatore può essere usato in questo contesto:


Istruzione Dim

Vedi anche
Ombreggiature
Condivisa
Durata in Visual Basic
Dichiarazione di variabile
Strutture
Inferenza del tipo di variabile locale
Oggetti e classi
Unicode (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica che Visual Basic deve effettuare il marshalling di tutte le stringhe in valori Unicode indipendentemente
dal nome della procedura esterna dichiarata.
Quando si chiama una routine definita all'esterno del progetto, il compilatore Visual Basic non ha accesso alle
informazioni necessarie per chiamare correttamente la stored procedure. Queste informazioni includono la
posizione in cui si trova la stored procedure, la modalità di identificazione, la sequenza chiamante e il tipo
restituito e il set di caratteri stringa utilizzato. L' istruzione Declare crea un riferimento a una procedura esterna e
fornisce le informazioni necessarie.
La charsetmodifier parte nell' Declare istruzione fornisce le informazioni sul set di caratteri per il marshalling
delle stringhe durante una chiamata alla procedura esterna. Influiscono inoltre sul modo in cui Visual Basic
Cerca nel file esterno il nome della procedura esterna. Il Unicode modificatore specifica che Visual Basic
necessario effettuare il marshalling di tutte le stringhe in valori Unicode e cercare la routine senza modificarne il
nome durante la ricerca.
Se non viene specificato alcun modificatore del set di caratteri, Ansi è il valore predefinito.

Commenti
Il Unicode modificatore può essere usato in questo contesto:
Declare Statement

Note per gli sviluppatori di Smart Device


Questa parola chiave non è supportata.

Vedi anche
ANSI
Auto
Parole chiave
Widening (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Indica che un operatore di conversione ( CType ) converte una classe o una struttura in un tipo che può
conservare tutti i valori possibili della classe o della struttura originale.

Conversione con la parola chiave Widen


La procedura di conversione deve specificare Public Shared oltre a Widening .
Le conversioni verso un tipo di dati più ampio hanno sempre esito positivo in fase di esecuzione e non
subiscono mai Gli esempi Single sono Double , Char a String e un tipo derivato al relativo tipo di base.
Questa ultima conversione viene ampliata perché il tipo derivato contiene tutti i membri del tipo di base e
pertanto è un'istanza del tipo di base.
Il codice consumer non deve usare per le conversioni verso un tipo di oggetto più CType ampio, anche se
Option Strict è On .

La Widening parola chiave può essere usata in questo contesto:


Operator Statement
Per le definizioni di operatori di conversione verso un tipo di informazioni più piccolo e più piccolo, vedere
procedura: definire un operatore di conversione.

Vedi anche
Operator Statement
Narrowing
Widening and Narrowing Conversions
Procedura: definire un operatore
CType Function
Option Strict Statement
Procedura: Definire un operatore di conversione
WithEvents (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica che una o più variabili membro dichiarate fanno riferimento a un'istanza di una classe che può
generare eventi.

Commenti
Quando una variabile viene definita tramite WithEvents , è possibile specificare in modo dichiarativo che un
metodo gestisce gli eventi della variabile utilizzando la Handles parola chiave.
È possibile usare WithEvents solo a livello di classe o di modulo. Ciò significa che il contesto di dichiarazione per
una WithEvents variabile deve essere una classe o un modulo e non può essere un file di origine, uno spazio dei
nomi, una struttura o una procedura.
Non è possibile usare WithEvents in un membro di struttura.
È possibile dichiarare solo singole variabili, non matrici, con WithEvents .

Regole
Tipi di elemento. È necessario dichiarare le WithEvents variabili come variabili oggetto in modo che possano
accettare istanze di classe. Tuttavia, non è possibile dichiararli come Object . È necessario dichiararli come la
classe specifica che può generare gli eventi.
Il WithEvents modificatore può essere usato in questo contesto: istruzione Dim

Esempio
Dim WithEvents app As Application

Vedere anche
Selettori
Parole chiave
Eventi
WriteOnly (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Specifica che una proprietà può essere scritta ma non letta.

Commenti
Regole
Contesto della dichiarazione. Si può usare WriteOnly solo a livello di modulo. Ciò significa che il contesto di
dichiarazione per una WriteOnly proprietà deve essere una classe, una struttura o un modulo e non può essere
un file di origine, uno spazio dei nomi o una procedura.
È possibile dichiarare una proprietà come WriteOnly , ma non come variabile.

Quando usare WriteOnly


In alcuni casi si vuole che il codice consumer sia in grado di impostare un valore, ma non di individuarne lo
stato. Ad esempio, i dati sensibili, ad esempio un numero di registrazione sociale o una password, devono essere
protetti dall'accesso da parte di qualsiasi componente che non lo ha impostato. In questi casi, è possibile usare
una WriteOnly proprietà per impostare il valore.

IMPORTANT
Quando si definisce e si usa una WriteOnly proprietà, tenere presenti le misure di protezione aggiuntive seguenti:

Override. Se la proprietà è un membro di una classe, consentire l'impostazione predefinita di


NotOverridablee non dichiararla Overridable o MustOverride . In questo modo si impedisce a una classe
derivata di effettuare l'accesso indesiderato tramite una sostituzione.
Livello di accesso. Se si mantengono i dati sensibili della proprietà in una o più variabili, dichiararli
privati in modo che nessun altro codice possa accedervi.
Crittografia. Archiviare tutti i dati sensibili in formato crittografato anziché in testo normale. Se il codice
dannoso in qualche modo può accedere a tale area della memoria, è più difficile usare i dati. La
crittografia è utile anche se è necessario serializzare i dati sensibili.
Ripristino. Quando la classe, la struttura o il modulo che definisce la proprietà viene terminato,
reimpostare i dati sensibili sui valori predefiniti o su altri valori non significativi. Questo garantisce una
protezione aggiuntiva quando l'area di memoria viene liberata per l'accesso generale.
Persistenza. Non rende permanente i dati sensibili, ad esempio su disco, se è possibile evitarli. Inoltre,
non scrivere dati sensibili negli Appunti.
Il WriteOnly modificatore può essere usato in questo contesto:
Property Statement

Vedi anche
ReadOnly
Privata
Parole chiave
Moduli (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Visual Basic offre diversi moduli che consentono di semplificare le attività comuni nel codice, tra cui la
manipolazione delle stringhe, l'esecuzione di calcoli matematici, l'ottenimento di informazioni sul sistema,
l'esecuzione di operazioni su file e directory e così via. La tabella seguente elenca i moduli forniti da Visual Basic.

Constants Contiene costanti varie. Queste costanti possono essere


inserite in qualsiasi punto del codice.

ControlChars Contiene caratteri di controllo costanti per la stampa e la


visualizzazione di testo.

Conversion Contiene membri che convertono i numeri decimali in altre


basi, numeri in stringhe, stringhe in numeri e un tipo di dati
in un altro.

DateAndTime Contiene i membri che ottengono la data o l'ora corrente,


eseguono calcoli di data, restituiscono una data o un'ora,
impostano la data o l'ora o l'ora della durata di un processo.

ErrObject Contiene informazioni sugli errori di run-time e sui metodi


per generare o cancellare un errore.

FileSystem Contiene membri che eseguono operazioni di file, directory o


cartelle e di sistema.

Financial Contiene le procedure utilizzate per eseguire calcoli finanziari.

Globals Contiene informazioni sulla versione corrente del motore di


scripting.

Information Contiene i membri che restituiscono, testano o verificano


informazioni quali le dimensioni della matrice, i nomi dei tipi
e così via.

Interaction Contiene membri che interagiscono con oggetti, applicazioni


e sistemi.

Strings Contiene membri che eseguono operazioni di stringa, ad


esempio la riformattazione di stringhe, la ricerca di una
stringa, il recupero della lunghezza di una stringa e così via.

VBMath Contiene i membri che eseguono operazioni matematiche.

Vedi anche
Riferimenti al linguaggio Visual Basic
Parola chiave Nothing (Visual Basic)
05/03/2021 • 6 minutes to read • Edit Online

Rappresenta il valore predefinito di qualsiasi tipo di dati. Per i tipi di riferimento, il valore predefinito è il null
riferimento. Per i tipi di valore, il valore predefinito dipende dal tipo di valore che ammette valori null.

NOTE
Per i tipi di valore non nullable, Nothing in Visual Basic differisce da null in C#. In Visual Basic, se si imposta una
variabile di un tipo di valore non nullable su Nothing , la variabile viene impostata sul valore predefinito per il tipo
dichiarato. In C#, se si assegna una variabile di un tipo di valore non nullable a null , si verifica un errore in fase di
compilazione.

Commenti
Nothing rappresenta il valore predefinito di un tipo di dati. Il valore predefinito dipende dal fatto che la variabile
sia di un tipo di valore o di un tipo di riferimento.
Una variabile di un tipo di valore contiene direttamente il relativo valore. I tipi di valore includono tutti i tipi di
dati numerici,,, Boolean Char Date , tutte le strutture e tutte le enumerazioni. Una variabile di un tipo
riferimento archivia un riferimento a un'istanza dell'oggetto in memoria. I tipi di riferimento includono classi,
matrici, delegati e stringhe. Per altre informazioni, vedere Value Types and Reference Types.
Se una variabile è di un tipo valore, il comportamento di Nothing varia a seconda che la variabile sia di un tipo
di dati nullable. Per rappresentare un tipo di valore Nullable, aggiungere un ? modificatore al nome del tipo. Se
Nothing si assegna a una variabile nullable, il valore viene impostato su null . Per ulteriori informazioni ed
esempi, vedere tipi di valore Nullable.
Se una variabile è di un tipo valore che non ammette valori null, l'assegnazione a tale variabile lo Nothing
imposta sul valore predefinito per il tipo dichiarato. Se il tipo contiene membri variabili, vengono impostati tutti
sui rispettivi valori predefiniti. Nell'esempio seguente viene illustrato questo per i tipi scalari.
Module Module1

Sub Main()
Dim ts As TestStruct
Dim i As Integer
Dim b As Boolean

' The following statement sets ts.Name to null and ts.Number to 0.


ts = Nothing

' The following statements set i to 0 and b to False.


i = Nothing
b = Nothing

Console.WriteLine($"ts.Name: {ts.Name}")
Console.WriteLine($"ts.Number: {ts.Number}")
Console.WriteLine($"i: {i}")
Console.WriteLine($"b: {b}")

Console.ReadKey()
End Sub

Public Structure TestStruct


Public Name As String
Public Number As Integer
End Structure
End Module

Se una variabile è di un tipo riferimento, l'assegnazione Nothing alla variabile lo imposta su un null
riferimento del tipo della variabile. Una variabile impostata su un null riferimento non è associata ad alcun
oggetto. Questo concetto è illustrato nell'esempio seguente:

Module Module1

Sub Main()

Dim testObject As Object


' The following statement sets testObject so that it does not refer to
' any instance.
testObject = Nothing

Dim tc As New TestClass


tc = Nothing
' The fields of tc cannot be accessed. The following statement causes
' a NullReferenceException at run time. (Compare to the assignment of
' Nothing to structure ts in the previous example.)
'Console.WriteLine(tc.Field1)

End Sub

Class TestClass
Public Field1 As Integer
' . . .
End Class
End Module

Quando si verifica se una variabile di riferimento (o tipo di valore Nullable) è null , non usare = Nothing o
<> Nothing . Usare sempre Is Nothing o IsNot Nothing .

Per le stringhe in Visual Basic, la stringa vuota è uguale a Nothing . Pertanto, "" = Nothing è true.
Nell'esempio seguente vengono illustrati i confronti che utilizzano gli Is IsNot operatori e:
Module Module1
Sub Main()

Dim testObject As Object


testObject = Nothing
Console.WriteLine(testObject Is Nothing)
' Output: True

Dim tc As New TestClass


tc = Nothing
Console.WriteLine(tc IsNot Nothing)
' Output: False

' Declare a nullable value type.


Dim n? As Integer
Console.WriteLine(n Is Nothing)
' Output: True

n = 4
Console.WriteLine(n Is Nothing)
' Output: False

n = Nothing
Console.WriteLine(n IsNot Nothing)
' Output: False

Console.ReadKey()
End Sub

Class TestClass
Public Field1 As Integer
Private field2 As Boolean
End Class
End Module

Se si dichiara una variabile senza usare una As clausola e la si imposta su Nothing , la variabile ha un tipo di
Object . Un esempio è Dim something = Nothing . In questo caso si verifica un errore in fase di compilazione
quando Option Strict è Option Infer attivo ed è disattivato.
Quando si assegna Nothing a una variabile oggetto, non fa più riferimento a un'istanza dell'oggetto. Se la
variabile ha precedentemente fatto riferimento a un'istanza, impostarla su Nothing non termina l'istanza stessa.
L'istanza viene terminata e le risorse di memoria e di sistema associate vengono rilasciate, solo dopo che il
Garbage Collector (GC) rileva che non sono presenti riferimenti attivi rimanenti.
Nothing differisce dall' DBNull oggetto, che rappresenta una variante non inizializzata o una colonna di
database non esistente.

Vedi anche
Istruzione Dim
Durata degli oggetti: come creare e distruggere oggetti
Durata in Visual Basic
Operatore Is
Operatore IsNot
Tipi di valore Nullable
Oggetti (Visual Basic)
05/03/2021 • 5 minutes to read • Edit Online

Questo argomento contiene collegamenti ad altri argomenti che illustrano gli oggetti runtime di Visual Basic e
contengono tabelle di procedure, proprietà ed eventi dei relativi membri.

Oggetti runtime di Visual Basic

Collection Rappresenta un modo pratico di visualizzare un gruppo


correlato di elementi come un singolo oggetto.

Err Contiene informazioni sugli errori di runtime.

L'oggetto My.Application è costituito dalle classi seguenti: Specifica i dati associati solo all'applicazione o DLL corrente.
Nessuna informazione a livello di sistema può essere
ApplicationBase specifica i membri disponibili in tutti i modificata con My.Application .
progetti.
Alcuni membri sono disponibili solo per le applicazioni
WindowsFormsApplicationBase specifica i membri disponibili console o Windows Form.
nelle applicazioni Windows Form.

ConsoleApplicationBase specifica i membri disponibili nelle


applicazioni console.

My.Application.Info (Info) Specifica le proprietà necessarie per ottenere le informazioni


relative a un'applicazione, ad esempio il numero di versione,
la descrizione, gli assembly caricati e così via.

My.Application.Log (Log) Fornisce una proprietà e i metodi per scrivere le informazioni


relative a eventi ed eccezioni nei listener di log
dell'applicazione.

My.Computer (Computer) Specifica le proprietà per la modifica dei componenti del


computer, ad esempio audio, orologio, tastiera, file system e
così via.

My.Computer.Audio (Audio) Specifica i metodi per la riproduzione di suoni.

My.Computer.Clipboard (Clipboard) Specifica i metodi per la modifica degli Appunti.

My.Computer.Clock (Clock) Offre proprietà che consentono di accedere all'ora locale


corrente e all'ora UTC (Universal Coordinated Time),
equivalente all'ora di Greenwich, dal clock di sistema.

My.Computer.FileSystem (FileSystem) Specifica proprietà e metodi per l'uso di unità, file e directory.

My.Computer.FileSystem.SpecialDirectories Specifica le proprietà per l'accesso alle directory a cui si fa


(SpecialDirectories) comunemente riferimento.
My.Computer.Info (ComputerInfo) Offre proprietà che consentono di ottenere informazioni su
memoria del computer, assembly caricati, nome e sistema
operativo.

My.Computer.Keyboard (Keyboard) Offre proprietà che consentono di accedere allo stato


corrente della tastiera, per sapere ad esempio quali tasti
vengono attualmente premuti, e un metodo per inviare le
sequenze di tasti alla finestra attiva.

My.Computer.Mouse (Mouse) Offre proprietà che consentono di ottenere informazioni sul


formato e sulla configurazione del mouse installato nel
computer locale.

My.Computer.Network (Network) Specifica una proprietà, un evento e i metodi per


l'interazione con la rete a cui è connesso il computer.

My.Computer.Ports (Ports) Specifica una proprietà e un metodo per l'accesso alle porte
seriali del computer.

My.Computer.Registry (RegistryProxy) Specifica proprietà e metodi per la modifica del Registro di


sistema.

Oggetto My.Forms Offre proprietà per l'accesso a un'istanza di ogni Windows


Form dichiarato nel progetto corrente.

My.Log (AspLog) Specifica una proprietà e i metodi per la scrittura di


informazioni relative a eventi ed eccezioni nei listener di log
dell'applicazione per le applicazioni Web.

Oggetto My.Request Ottiene l'oggetto HttpRequest per la pagina richiesta.


L'oggetto My.Request contiene informazioni sulla richiesta
HTTP corrente.

L'oggetto My.Request è disponibile solo per le applicazioni


ASP.NET.

Oggetto My.Resources Specifica proprietà e classi per l'accesso alle risorse di


un'applicazione.

Oggetto My.Response Ottiene l'oggetto HttpResponse associato a Page. Questo


oggetto consente di inviare dati di risposta HTTP a un client
e contiene informazioni su tale risposta.

L'oggetto My.Response è disponibile solo per le


applicazioni ASP.NET.

Oggetto My.Settings Specifica proprietà e metodi per l'accesso alle impostazioni di


un'applicazione.

My.User (User) Offre l'accesso alle informazioni sull'utente corrente.

Oggetto My.WebServices Specifica le proprietà per la creazione e l'accesso a una


singola istanza di ogni servizio Web a cui fa riferimento il
progetto corrente.
TextFieldParser Fornisce i metodi e le proprietà per l'analisi dei file di testo
strutturati.

Vedi anche
Riferimenti al linguaggio Visual Basic
Oggetto My.Application
05/03/2021 • 2 minutes to read • Edit Online

Fornisce proprietà, metodi ed eventi correlati all'applicazione corrente.

Commenti
Per informazioni sui metodi e sulle proprietà dell' My.Application oggetto, vedere le risorse seguenti:
ApplicationBase per i membri disponibili in tutti i progetti.
WindowsFormsApplicationBase per i membri disponibili nelle applicazioni Windows Form.
ConsoleApplicationBase per i membri disponibili nelle applicazioni console.

Requisiti
Spazio dei nomi: Microsoft.VisualBasic.ApplicationServices
Classe: WindowsFormsApplicationBase la classe base ConsoleApplicationBase fornisce i membri disponibili
nelle applicazioni console e la relativa classe di base ApplicationBase fornisce i membri disponibili in tutti i
progetti.
Assembly: Libreria di runtime Visual Basic (in Microsoft.VisualBasic.dll)

Vedi anche
Oggetto My.Application.Info
My.Application.Log (oggetto)
Oggetto My.Application.Info
05/03/2021 • 2 minutes to read • Edit Online

Fornisce le proprietà per ottenere le informazioni sull'applicazione, ad esempio il numero di versione, la


descrizione, gli assembly caricati e così via.

Commenti
Per informazioni sui metodi e le proprietà dell'oggetto My.Application.Info , vedere AssemblyInfo.

NOTE
È possibile utilizzare le proprietà della System.Diagnostics.FileVersionInfo classe per ottenere informazioni su un file su
disco.

Requisiti
Spazio dei nomi: Microsoft.VisualBasic.ApplicationServices
Classe:AssemblyInfo
Assembly: Libreria di runtime Visual Basic (in Microsoft.VisualBasic.dll)

Vedi anche
Oggetto My.Application
My.Application.Log (oggetto)
05/03/2021 • 2 minutes to read • Edit Online

Fornisce una proprietà e i metodi per scrivere le informazioni relative a eventi ed eccezioni nei listener di log
dell'applicazione.

Commenti
Per informazioni sui metodi e le proprietà dell'oggetto My.Application.Log , vedere Log.
Per ulteriori informazioni, vedere registrazione di informazioni dall'applicazione.

NOTE
È anche possibile usare le classi in .NET Framework per registrare informazioni dall'applicazione. Per altre informazioni,
vedere Tracing and Instrumenting Applications.

Requisiti
Spazio dei nomi: Microsoft.VisualBasic.Logging
Classe:Log
Assembly: Libreria di runtime Visual Basic (in Microsoft.VisualBasic.dll)

Vedi anche
Oggetto My.Application
Oggetto My.Computer
05/03/2021 • 2 minutes to read • Edit Online

Specifica le proprietà per la modifica dei componenti del computer, ad esempio audio, orologio, tastiera, file
system e così via.

Commenti
Per informazioni sui metodi e le proprietà dell'oggetto My.Computer , vedere Computer. La classe base
ServerComputer fornisce i membri disponibili in tutti i progetti.

Requisiti
Spazio dei nomi: Microsoft.VisualBasic.Devices
Classe: Computer la classe base ServerComputer fornisce i membri disponibili in tutti i progetti.
Assembly: Libreria di runtime Visual Basic (in Microsoft.VisualBasic.dll)

Vedi anche
Oggetto My.Computer.Audio
Oggetto My.Computer.Clipboard
Oggetto My.Computer.Clock
Oggetto My.Computer.FileSystem
Oggetto My.Computer.FileSystem.SpecialDirectories
Oggetto My.Computer.Info
Oggetto My.Computer.Keyboard
Oggetto My.Computer.Mouse
Oggetto My.Computer.Network
Oggetto My.Computer.Ports
Oggetto My.Computer.Registry
Oggetto My.Computer.Audio
05/03/2021 • 2 minutes to read • Edit Online

Specifica i metodi per la riproduzione di suoni.

Commenti
Per informazioni sui metodi e le proprietà dell'oggetto My.Computer.Audio , vedere Audio.
Per ulteriori informazioni, vedere riproduzione di suoni.

Requisiti
Spazio dei nomi: Microsoft.VisualBasic.Devices
Classe:Audio
Assembly: Libreria di runtime Visual Basic (in Microsoft.VisualBasic.dll)

Vedi anche
Oggetto My.Computer
Oggetto My.Computer.Clipboard
05/03/2021 • 2 minutes to read • Edit Online

Specifica i metodi per la modifica degli Appunti.

Commenti
Per informazioni sui metodi e le proprietà dell'oggetto My.Computer.Clipboard , vedere ClipboardProxy.
Per ulteriori informazioni, vedere archiviazione e lettura di dati negli Appunti.

NOTE
È anche possibile usare i metodi della System.Windows.Forms.Clipboard classe per modificare gli Appunti.

Requisiti
Spazio dei nomi: Microsoft.VisualBasic.MyServices
Classe: ClipboardProxy (fornisce l'accesso a Clipboard )
Assembly: Libreria di runtime Visual Basic (in Microsoft.VisualBasic.dll)

Vedi anche
Clipboard
Oggetto My.Computer
Oggetto My.Computer.Clock
05/03/2021 • 2 minutes to read • Edit Online

Offre proprietà che consentono di accedere all'ora locale corrente e all'ora UTC (Universal Coordinated Time),
equivalente all'ora di Greenwich, dal clock di sistema.

Commenti
Per informazioni sui metodi e le proprietà dell'oggetto My.Computer.Clock , vedere Clock.

Requisiti
Spazio dei nomi: Microsoft.VisualBasic.Devices
Classe:Clock
Assembly: Libreria di runtime Visual Basic (in Microsoft.VisualBasic.dll)

Vedi anche
Oggetto My.Computer
Oggetto My.Computer.FileSystem
05/03/2021 • 2 minutes to read • Edit Online

Specifica proprietà e metodi per l'uso di unità, file e directory.

Commenti
Per informazioni sui metodi e le proprietà dell'oggetto My.Computer.FileSystem , vedere FileSystem.
Per ulteriori informazioni, vedere accesso ai file con Visual Basic.

NOTE
È anche possibile usare le classi nello System.IO spazio dei nomi per lavorare con unità, file e directory.

Requisiti
Spazio dei nomi: Microsoft.VisualBasic.MyServices
Classe: FileSystemProxy (fornisce l'accesso a FileSystem )
Assembly: Libreria di runtime Visual Basic (in Microsoft.VisualBasic.dll)

Vedi anche
Oggetto My.Computer.FileSystem.SpecialDirectories
Oggetto My.Computer
Oggetto My.Computer.FileSystem.SpecialDirectories
05/03/2021 • 2 minutes to read • Edit Online

Specifica le proprietà per l'accesso alle directory a cui si fa comunemente riferimento.

Commenti
Per informazioni sui metodi e le proprietà dell'oggetto My.Computer.FileSystem.SpecialDirectories , vedere
SpecialDirectories.
Per ulteriori informazioni, vedere procedura: recuperare il contenuto della directory documenti.

Requisiti
Spazio dei nomi: Microsoft.VisualBasic.MyServices
Classe: SpecialDirectoriesProxy (fornisce l'accesso a SpecialDirectories )
Assembly: Libreria di runtime Visual Basic (in Microsoft.VisualBasic.dll)

Vedi anche
Oggetto My.Computer.FileSystem
Oggetto My.Computer
Oggetto My.Computer.Info
05/03/2021 • 2 minutes to read • Edit Online

Offre proprietà che consentono di ottenere informazioni su memoria del computer, assembly caricati, nome e
sistema operativo.

Commenti
Per informazioni sulle proprietà dell' My.Computer.Info oggetto, vedere ComputerInfo .

Requisiti
Spazio dei nomi: Microsoft.VisualBasic.Devices
Classe:ComputerInfo
Assembly: Libreria di runtime Visual Basic (in Microsoft.VisualBasic.dll)

Vedi anche
Oggetto My.Computer
Oggetto My.Computer.Keyboard
05/03/2021 • 2 minutes to read • Edit Online

Offre proprietà che consentono di accedere allo stato corrente della tastiera, per sapere ad esempio quali tasti
vengono attualmente premuti, e un metodo per inviare le sequenze di tasti alla finestra attiva.

Commenti
Per informazioni sui metodi e le proprietà dell'oggetto My.Computer.Keyword , vedere Keyboard.
Per altre informazioni, vedere Accesso alla tastiera.

Requisiti
Spazio dei nomi: Microsoft.VisualBasic.Devices
Classe:Keyboard
Assembly: Libreria di runtime Visual Basic (in Microsoft.VisualBasic.dll)

Vedi anche
Oggetto My.Computer
Oggetto My.Computer.Mouse
05/03/2021 • 2 minutes to read • Edit Online

Fornisce le proprietà per il recupero delle informazioni relative al formato e alla configurazione del mouse
installato sul computer locale.

Commenti
Per informazioni sui metodi e le proprietà dell'oggetto My.Computer.Mouse , vedere Mouse.
Per ulteriori informazioni, vedere accesso al mouse.

Requisiti
Spazio dei nomi: Microsoft.VisualBasic.Devices
Classe:Mouse
Assembly: Libreria di runtime Visual Basic (in Microsoft.VisualBasic.dll)

Vedi anche
Oggetto My.Computer
Oggetto My.Computer.Network
05/03/2021 • 2 minutes to read • Edit Online

Fornisce una proprietà, un evento e i metodi per l'interazione con la rete a cui è connesso il computer.

Commenti
Per informazioni sui metodi e le proprietà dell'oggetto My.Computer.Network , vedere Network.
Per ulteriori informazioni, vedere esecuzione di operazioni di rete.

Requisiti
Spazio dei nomi: Microsoft.VisualBasic.Devices
Classe:Network
Assembly: Libreria di runtime Visual Basic (in Microsoft.VisualBasic.dll)

Vedi anche
Oggetto My.Computer
Oggetto My.Computer.Ports
05/03/2021 • 2 minutes to read • Edit Online

Specifica una proprietà e un metodo per l'accesso alle porte seriali del computer.

Commenti
Per informazioni sui metodi e le proprietà dell'oggetto My.Computer.Ports , vedere Ports.
Per ulteriori informazioni, vedere accesso alle porte del computer.

NOTE
È inoltre possibile utilizzare le proprietà e i metodi della System.IO.Ports.SerialPort classe per accedere alle porte seriali del
computer.

Requisiti
Spazio dei nomi: Microsoft.VisualBasic.Devices
Classe:Ports
Assembly: Libreria di runtime Visual Basic (in Microsoft.VisualBasic.dll)

Vedi anche
Oggetto My.Computer
Oggetto My.Computer.Registry
05/03/2021 • 2 minutes to read • Edit Online

Specifica proprietà e metodi per la modifica del Registro di sistema.

Commenti
Per informazioni sui metodi e le proprietà dell'oggetto My.Computer.Registry , vedere RegistryProxy.
Per ulteriori informazioni, vedere lettura e scrittura nel registro di sistema.

NOTE
È anche possibile modificare il registro di sistema usando i metodi della Microsoft.Win32.Registry classe.

Requisiti
Spazio dei nomi: Microsoft.VisualBasic.MyServices
Classe: RegistryProxy (fornisce l'accesso a Registry )
Assembly: Libreria di runtime Visual Basic (in Microsoft.VisualBasic.dll)

Vedi anche
Oggetto My.Computer
Oggetto My.Forms
05/03/2021 • 5 minutes to read • Edit Online

Fornisce le proprietà per l'accesso a un'istanza di ogni Windows Form dichiarato nel progetto corrente.

Commenti
L' My.Forms oggetto fornisce un'istanza di ogni form nel progetto corrente. Il nome della proprietà è uguale al
nome del modulo a cui accede la proprietà.
È possibile accedere ai moduli forniti dall' My.Forms oggetto utilizzando il nome del form, senza qualifica. Poiché
il nome della proprietà è uguale al nome del tipo del form, questo consente di accedere a un form come se
disponesse di un'istanza predefinita. Ad esempio, My.Forms.Form1.Show equivale a Form1.Show .
L' My.Forms oggetto espone solo i form associati al progetto corrente. Non fornisce l'accesso ai moduli
dichiarati in dll a cui si fa riferimento. Per accedere a un modulo fornito da una DLL, è necessario utilizzare il
nome completo del modulo, scritto come dllname. FormName.
È possibile usare la OpenForms proprietà per ottenere una raccolta di tutti i form aperti dell'applicazione.
L'oggetto e le relative proprietà sono disponibili solo per le applicazioni Windows.

Proprietà
Ogni proprietà dell' My.Forms oggetto fornisce l'accesso a un'istanza di un form nel progetto corrente. Il nome
della proprietà è uguale al nome del modulo a cui accede la proprietà e il tipo della proprietà è uguale al tipo del
form.

NOTE
Se si verifica un conflitto di nomi, il nome della proprietà per accedere a un modulo è RootNamespace _ spazio dei nomi _
FormName. Si considerino, ad esempio, due moduli denominati Form1. se uno di questi moduli è nello spazio dei nomi
radice WindowsApplication1 e nello spazio dei nomi Namespace1 , si accederà a tale modulo tramite
My.Forms.WindowsApplication1_Namespace1_Form1 .

L' My.Forms oggetto consente di accedere all'istanza del modulo principale dell'applicazione creato all'avvio. Per
tutti gli altri form, l' My.Forms oggetto crea una nuova istanza del form quando vi si accede e la archivia. I
tentativi successivi di accesso a tale proprietà restituiscono tale istanza del form.
È possibile eliminare un form assegnando Nothing alla proprietà per il form. Il setter della proprietà chiama il
Close metodo del form, quindi assegna il Nothing valore archiviato. Se si assegna un valore diverso Nothing da
alla proprietà, il setter genera un' ArgumentException eccezione.
È possibile verificare se una proprietà dell' My.Forms oggetto archivia un'istanza del form utilizzando l' Is
IsNot operatore OR. È possibile utilizzare gli operatori per verificare se il valore della proprietà è Nothing .
NOTE
In genere, Is l' IsNot operatore o deve leggere il valore della proprietà per eseguire il confronto. Tuttavia, se la
proprietà è attualmente archiviata Nothing , la proprietà crea una nuova istanza del form e quindi restituisce tale istanza.
Tuttavia, il compilatore Visual Basic considera le proprietà dell' My.Forms oggetto in modo diverso e consente Is all'
IsNot operatore OR di controllare lo stato della proprietà senza modificarne il valore.

Esempio
In questo esempio viene modificato il titolo del SidebarMenu modulo predefinito.

Sub ShowSidebarMenu(ByVal newTitle As String)


If My.Forms.SidebarMenu IsNot Nothing Then
My.Forms.SidebarMenu.Text = newTitle
End If
End Sub

Per il corretto funzionamento di questo esempio, il progetto deve avere un formato denominato SidebarMenu .
Questo codice funzionerà solo in un progetto di applicazione Windows.

Requisiti
Disponibilità per tipo di progetto
T IP O DI P RO GET TO DISP O N IB IL E

Applicazione Windows Sì

Libreria di classi No

Applicazione console No

Libreria di controlli Windows No

Libreria di controlli Web No

Servizio Windows No

Sito Web No

Vedere anche
OpenForms
Form
Close
Oggetti
Operatore Is
Operatore IsNot
Accesso ai moduli dell'applicazione
Oggetto My.Log
05/03/2021 • 2 minutes to read • Edit Online

Fornisce la proprietà e i metodi per la scrittura dell'evento e delle informazioni sulle eccezioni nei listener del log
dell'applicazione.

Commenti
Per informazioni sui metodi e le proprietà dell'oggetto My.Log , vedere AspLog.
L' My.Log oggetto è disponibile solo per le applicazioni ASP.NET. Per le applicazioni client, usare l'oggetto My.
Application. log.

Requisiti
Spazio dei nomi: Microsoft.VisualBasic.Logging
Classe:AspLog
Assembly: Libreria di runtime Visual Basic (in Microsoft.VisualBasic.dll)
Oggetto My.Request
05/03/2021 • 2 minutes to read • Edit Online

Ottiene l'oggetto HttpRequest per la pagina richiesta.

Commenti
L'oggetto My.Request contiene informazioni sulla richiesta HTTP corrente.
L'oggetto My.Request è disponibile solo per le applicazioni ASP.NET.

Esempio
Nell'esempio seguente viene ottenuta la raccolta di intestazioni dall' My.Request oggetto e viene utilizzato l'
My.Response oggetto per scriverlo nella pagina ASP.NET.

<script runat="server">
Public Sub ShowHeaders()
' Load the header collection from the Request object.
Dim coll As System.Collections.Specialized.NameValueCollection
coll = My.Request.Headers

' Put the names of all keys into a string array.


For Each key As String In coll.AllKeys
My.Response.Write("Key: " & key & "<br>")

' Get all values under this key.


For Each value As String In coll.GetValues(key)
My.Response.Write("Value: " & _
Server.HtmlEncode(value) & "<br>")
Next
Next
End Sub
</script>

Vedi anche
HttpRequest
Oggetto My.Response
Oggetto My.Response
05/03/2021 • 2 minutes to read • Edit Online

Ottiene l' HttpResponse oggetto associato all'oggetto Page . Questo oggetto consente di inviare dati di risposta
HTTP a un client e contiene informazioni su tale risposta.

Commenti
L' My.Response oggetto contiene l' HttpResponse oggetto corrente associato alla pagina.
L' My.Response oggetto è disponibile solo per le applicazioni ASP.NET.

Esempio
Nell'esempio seguente viene ottenuta la raccolta di intestazioni dall' My.Request oggetto e viene utilizzato l'
My.Response oggetto per scriverlo nella pagina ASP.NET.

<script runat="server">
Public Sub ShowHeaders()
' Load the header collection from the Request object.
Dim coll As System.Collections.Specialized.NameValueCollection
coll = My.Request.Headers

' Put the names of all keys into a string array.


For Each key As String In coll.AllKeys
My.Response.Write("Key: " & key & "<br>")

' Get all values under this key.


For Each value As String In coll.GetValues(key)
My.Response.Write("Value: " & _
Server.HtmlEncode(value) & "<br>")
Next
Next
End Sub
</script>

Vedi anche
HttpResponse
Oggetto My.Request
Oggetto My.Resources
05/03/2021 • 6 minutes to read • Edit Online

Fornisce le proprietà e le classi per l'accesso alle risorse dell'applicazione.

Commenti
L' My.Resources oggetto fornisce l'accesso alle risorse dell'applicazione e consente di recuperare
dinamicamente le risorse per l'applicazione. Per ulteriori informazioni, vedere gestione delle risorse
dell'applicazione (.NET).
L' My.Resources oggetto espone solo le risorse globali. Non fornisce l'accesso ai file di risorse associati ai
moduli. È necessario accedere alle risorse del modulo dal form.
È possibile accedere ai file di risorse specifici delle impostazioni cultura dell'applicazione dall' My.Resources
oggetto. Per impostazione predefinita, l' My.Resources oggetto cerca le risorse dal file di risorse che corrisponde
alle impostazioni cultura nella UICulture Proprietà. Tuttavia, è possibile eseguire l'override di questo
comportamento e specificare impostazioni cultura specifiche da usare per le risorse. Per altre informazioni,
vedere Risorse nelle applicazioni desktop.

Proprietà
Le proprietà dell' My.Resources oggetto forniscono l'accesso in sola lettura alle risorse dell'applicazione. Per
aggiungere o rimuovere risorse, utilizzare Progettazione progetti . È possibile accedere alle risorse aggiunte
tramite la finestra di progettazione progetti usando My.Resources. resourceName.
È anche possibile aggiungere o rimuovere file di risorse selezionando il progetto in Esplora soluzioni e
facendo clic su Aggiungi nuovo elemento o Aggiungi elemento esistente dal menu progetto . È possibile
accedere alle risorse aggiunte in questo modo utilizzando My.Resources. resourceFileName . resourceName.
Ogni risorsa ha un nome, una categoria e un valore e queste impostazioni delle risorse determinano il modo in
cui la proprietà per accedere alla risorsa viene visualizzata nell' My.Resources oggetto. Per le risorse aggiunte in
Progettazione progetti :
Il nome determina il nome della proprietà.
I dati della risorsa corrispondono al valore della proprietà.
La categoria determina il tipo della proprietà:

C AT EGO RY T IP O DI DAT I P RO P RIETÀ

Stringhe Stringa

Immagini Bitmap

Icone Icon
C AT EGO RY T IP O DI DAT I P RO P RIETÀ

Audio UnmanagedMemoryStream

La UnmanagedMemoryStream classe deriva dalla Stream


classe, quindi può essere usata con metodi che accettano
flussi, ad esempio il Play metodo.

File - Stringa per i file di testo.


- Bitmap per i file di immagine.
- Icon per i file di icona.
- UnmanagedMemoryStream per i file audio.

Altri Determinato dalle informazioni nella colonna di tipo della


finestra di progettazione.

Classi
L' My.Resources oggetto espone ogni file di risorse come classe con proprietà condivise. Il nome della classe
corrisponde al nome del file di risorse. Come descritto nella sezione precedente, le risorse in un file di risorse
vengono esposte come proprietà nella classe.

Esempio
Questo esempio Mostra come impostare il titolo di un form sulla risorsa stringa denominata Form1Title nel file
di risorse dell'applicazione. Per il corretto funzionamento dell'esempio, l'applicazione deve avere una stringa
denominata Form1Title nel relativo file di risorse.

Sub SetFormTitle()
Me.Text = My.Resources.Form1Title
End Sub

Esempio
Questo esempio Mostra come impostare l'icona del form sull'icona denominata Form1Icon archiviata nel file di
risorse dell'applicazione. Per il corretto funzionamento dell'esempio, l'applicazione deve avere un'icona
denominata Form1Icon nel relativo file di risorse.

Sub SetFormIcon()
Me.Icon = My.Resources.Form1Icon
End Sub

Esempio
Questo esempio Mostra come impostare l'immagine di sfondo di un form sulla risorsa immagine denominata
Form1Background , che si trova nel file di risorse dell'applicazione. Per il corretto funzionamento di questo
esempio, l'applicazione deve avere una risorsa immagine denominata Form1Background nel file di risorse.

Sub SetFormBackgroundImage()
Me.BackgroundImage = My.Resources.Form1Background
End Sub
Esempio
Questo esempio riproduce il suono archiviato come risorsa audio denominata Form1Greeting nel file di risorse
dell'applicazione. Per il corretto funzionamento dell'esempio, l'applicazione deve avere una risorsa audio
denominata Form1Greeting nel file di risorse. Il My.Computer.Audio.Play metodo è disponibile solo per le
applicazioni Windows Form.

Sub PlayFormGreeting()
My.Computer.Audio.Play(My.Resources.Form1Greeting,
AudioPlayMode.Background)
End Sub

Esempio
In questo esempio viene recuperata la versione della lingua francese di una risorsa di stringa dell'applicazione.
La risorsa è denominata Message . Per modificare le impostazioni cultura My.Resources utilizzate dall'oggetto,
nell'esempio viene utilizzato ChangeUICulture .
Per il corretto funzionamento di questo esempio, l'applicazione deve avere una stringa denominata Message nel
relativo file di risorse e l'applicazione deve avere la versione in lingua francese del file di risorse, resources.fr-fr.
resx. Se per l'applicazione non è presente la versione in lingua francese del file di risorse, l' My.Resource oggetto
recupera la risorsa dal file di risorse delle impostazioni cultura predefinite.

Sub ShowLocalizedMessage()
Dim culture As String = My.Application.UICulture.Name
My.Application.ChangeUICulture("fr-FR")
MsgBox(My.Resources.Message)
My.Application.ChangeUICulture(culture)
End Sub

Vedi anche
Gestione delle risorse delle applicazioni (.NET)
Risorse nelle applicazioni desktop
Oggetto My.Settings
05/03/2021 • 3 minutes to read • Edit Online

Fornisce le proprietà e i metodi per l'accesso alle impostazioni dell'applicazione.

Commenti
L' My.Settings oggetto fornisce l'accesso alle impostazioni dell'applicazione e consente di archiviare e
recuperare dinamicamente le impostazioni delle proprietà e altre informazioni per l'applicazione. Per altre
informazioni, vedere Gestione delle impostazioni di un'applicazione (.NET).

Proprietà
Le proprietà dell'oggetto My.Settings offrono accesso alle impostazioni dell'applicazione. Per aggiungere o
rimuovere le impostazioni, utilizzare la finestra di progettazione impostazioni .
Ogni impostazione ha un nome , un tipo , un ambito e un valore e queste impostazioni determinano il modo in
cui la proprietà per accedere a ogni impostazione viene visualizzata nell' My.Settings oggetto:
Nome determina il nome della proprietà.
Il tipo determina il tipo della proprietà.
Scope indica se la proprietà è di sola lettura. Se il valore è Application , la proprietà è di sola lettura. Se il
valore è User , la proprietà è di lettura/scrittura.
Value è il valore predefinito della proprietà.

Metodi
M ETO DO DESC RIZ IO N E

Reload Ricarica le impostazioni utente dagli ultimi valori salvati.

Save Salva le impostazioni dell'utente corrente.

L' My.Settings oggetto fornisce anche proprietà e metodi avanzati, ereditati dalla ApplicationSettingsBase
classe.

Attività
Nella tabella seguente sono elencati esempi di attività relative all' My.Settings oggetto.

A VEDERE

Leggi un'impostazione dell'applicazione Procedura: Leggere le impostazioni dell'applicazione in Visual


Basic

Modificare un'impostazione utente Procedura: modificare le impostazioni dell'utente in Visual


Basic
A VEDERE

Mantieni impostazioni utente Procedura: Mantenere le impostazioni dell'utente in Visual


Basic

Creare una griglia di proprietà per le impostazioni utente Procedura: Creare griglie di proprietà per impostazioni
utente in Visual Basic

Esempio
Nell'esempio riportato di seguito viene mostrato il valore dell'impostazione Nickname .

Sub ShowNickname()
MsgBox("Nickname is " & My.Settings.Nickname)
End Sub

Affinché l'esempio funzioni, l'applicazione deve contenere un'impostazione Nickname di tipo String .

Vedi anche
ApplicationSettingsBase
Procedura: Leggere le impostazioni dell'applicazione in Visual Basic
Procedura: modificare le impostazioni dell'utente in Visual Basic
Procedura: Mantenere le impostazioni dell'utente in Visual Basic
Procedura: Creare griglie di proprietà per impostazioni utente in Visual Basic
Gestione delle impostazioni di un'applicazione (.NET)
Oggetto My.User
05/03/2021 • 2 minutes to read • Edit Online

Offre l'accesso alle informazioni sull'utente corrente.

Commenti
Per informazioni sui metodi e le proprietà dell'oggetto My.User , vedere
Microsoft.VisualBasic.ApplicationServices.User.
Per ulteriori informazioni, vedere accesso ai dati utente.

Requisiti
Assembly: Libreria di runtime Visual Basic (in Microsoft.VisualBasic.dll)

Vedere anche
IPrincipal
CurrentPrincipal
User
Current
Oggetto My.WebServices
05/03/2021 • 5 minutes to read • Edit Online

Fornisce le proprietà per la creazione e l'accesso a una singola istanza di ogni servizio Web XML a cui fa
riferimento il progetto corrente.

Commenti
L'oggetto My.WebServices fornisce un'istanza di ogni servizio Web a cui si fa riferimento nel progetto corrente.
Ogni istanza viene creata su richiesta. È possibile accedere a questi servizi Web tramite le proprietà dell'oggetto
My.WebServices . Il nome della proprietà è uguale al nome del servizio Web a cui la proprietà accede. Qualsiasi
classe che eredita da SoapHttpClientProtocol è un servizio Web. Per informazioni sull'aggiunta di servizi Web a
un progetto, vedere accesso ai servizi Web dell'applicazione.
L' My.WebServices oggetto espone solo i servizi Web associati al progetto corrente. Non fornisce l'accesso ai
servizi Web dichiarati in dll a cui si fa riferimento. Per accedere a un servizio Web fornito da una DLL, è
necessario utilizzare il nome completo del servizio Web nel formato dllname. WebServiceName. Per ulteriori
informazioni, vedere accesso ai servizi Web dell'applicazione.
L'oggetto e le relative proprietà non sono disponibili per le applicazioni Web.

Proprietà
Ogni proprietà dell' My.WebServices oggetto fornisce l'accesso a un'istanza di un servizio Web a cui fa
riferimento il progetto corrente. Il nome della proprietà è uguale al nome del servizio Web a cui accede la
proprietà e il tipo della proprietà è uguale al tipo del servizio Web.

NOTE
Se si verifica un conflitto di nomi, il nome della proprietà per accedere a un servizio Web è RootNamespace _ namespace _
ServiceName. Si considerino, ad esempio, due servizi Web denominati Service1 . Se uno di questi servizi si trova nello
spazio dei nomi radice WindowsApplication1 e nello spazio dei nomi Namespace1 , si accederà a tale servizio
utilizzando My.WebServices.WindowsApplication1_Namespace1_Service1 .

Quando si accede per la prima volta a una delle My.WebServices proprietà dell'oggetto, viene creata una nuova
istanza del servizio Web che viene archiviata. Gli accessi successivi di tale proprietà restituiscono l'istanza del
servizio Web.
È possibile eliminare un servizio Web assegnando Nothing alla proprietà per il servizio Web. Il metodo di
impostazione della proprietà viene assegnato Nothing al valore archiviato. Se si assegna un valore diverso
Nothing da alla proprietà, il setter genera un' ArgumentException eccezione.

È possibile verificare se una proprietà dell' My.WebServices oggetto archivia un'istanza del servizio Web
utilizzando l' Is IsNot operatore OR. È possibile utilizzare gli operatori per verificare se il valore della
proprietà è Nothing .
NOTE
In genere, Is l' IsNot operatore o deve leggere il valore della proprietà per eseguire il confronto. Tuttavia, se la
proprietà è attualmente archiviata Nothing , la proprietà crea una nuova istanza del servizio Web e quindi restituisce tale
istanza. Tuttavia, il compilatore Visual Basic considera le proprietà dell' My.WebServices oggetto in modo specifico e
consente all' Is IsNot operatore OR di controllare lo stato della proprietà senza modificarne il valore.

Esempio
In questo esempio viene chiamato il FahrenheitToCelsius metodo del TemperatureConverter servizio Web XML
e viene restituito il risultato.

Function ConvertFromFahrenheitToCelsius(
ByVal dFahrenheit As Double) As Double

Return My.WebServices.TemperatureConverter.FahrenheitToCelsius(dFahrenheit)
End Function

Per il corretto funzionamento di questo esempio, il progetto deve fare riferimento a un servizio Web
denominato Converter e il servizio Web deve esporre il ConvertTemperature metodo. Per ulteriori informazioni,
vedere accesso ai servizi Web dell'applicazione.
Questo codice non funziona in un progetto di applicazione Web.

Requisiti
Disponibilità per tipo di progetto
T IP O DI P RO GET TO DISP O N IB IL E

Applicazione Windows Sì

Libreria di classi Sì

Applicazione console Sì

Libreria di controlli Windows Sì

Libreria di controlli Web Sì

Servizio Windows Sì

Sito Web No

Vedere anche
SoapHttpClientProtocol
ArgumentException
Accesso ai servizi Web dell'applicazione
TextFieldParser Object
05/03/2021 • 2 minutes to read • Edit Online

Fornisce i metodi e le proprietà per l'analisi dei file di testo strutturati.

Sintassi
Public Class TextFieldParser

Osservazioni
Per informazioni sui metodi e le proprietà dell'oggetto TextFieldParser , vedere TextFieldParser.
Per ulteriori informazioni, vedere lettura da file.

Requisiti
Spazio dei nomi: Microsoft.VisualBasic.FileIO
Classe:TextFieldParser
Assembly: Libreria di runtime Visual Basic (in Microsoft.VisualBasic.dll)
Operatori (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Contenuto della sezione


Precedenza tra gli operatori in Visual Basic
Operatori elencati per funzionalità
Tipi di dati dei risultati degli operatori
Operatore DirectCast
Operatore TryCast
Operatore NameOf
Nuovo operatore
Operatori condizionali null
Operatori aritmetici
Operatori di assegnazione
Operatori di spostamento bit
Operatori di confronto
Operatori di concatenazione
Operatori logici/bit per bit
Operatori vari

Sezioni correlate
Riferimenti al linguaggio Visual Basic
Precedenza tra gli operatori in Visual Basic
05/03/2021 • 5 minutes to read • Edit Online

Quando più operazioni si verificano in un'espressione, ogni parte viene valutata e risolta in base a un ordine
predeterminato denominato precedenza degli operatori.

Regole di precedenza
Quando le espressioni contengono operatori di più di una categoria, vengono valutate in base alle regole
seguenti:
Gli operatori aritmetici e di concatenazione hanno l'ordine di precedenza descritto nella sezione seguente
e hanno tutti una maggiore precedenza rispetto agli operatori di confronto, logici e bit per bit.
Tutti gli operatori di confronto hanno uguale precedenza e hanno una precedenza maggiore rispetto agli
operatori logici e bit per bit, ma con precedenza più bassa rispetto agli operatori aritmetici e di
concatenazione.
Gli operatori logici e bit per bit hanno l'ordine di precedenza descritto nella sezione seguente e hanno
una precedenza più bassa rispetto agli operatori aritmetici, di concatenazione e di confronto.
Gli operatori con uguale precedenza vengono valutati da sinistra a destra nell'ordine in cui sono
visualizzati nell'espressione.

Ordine di precedenza
Gli operatori vengono valutati nel seguente ordine di precedenza:
Operatore Await
Attendono
Operatori aritmetici e di concatenazione
Elevamento a potenza ( ^ )
Identità e negazione unari ( + , – )
Moltiplicazione e divisione a virgola mobile ( * , / )
Divisione di interi ( \ )
Aritmetica modulare ( Mod )
Addizione e sottrazione ( + , – )
Concatenazione di stringhe ( & )
Spostamento di bit aritmetico ( << , >> )
Operatori di confronto
Tutti gli operatori di confronto ( = , <> , < , <= , > , >= , Is , IsNot , Like , TypeOf ... Is )
Operatori logici e bit per bit
Negazione ( Not )
Congiunzione ( And , AndAlso )
Disgiunzione inclusiva ( Or , OrElse )
Disgiunzione esclusiva ( Xor )
Commenti
L' = operatore è solo l'operatore di confronto di uguaglianza, non l'operatore di assegnazione.
L'operatore di concatenazione & di stringhe () non è un operatore aritmetico, ma in precedenza è raggruppato
con gli operatori aritmetici.
Gli Is IsNot operatori e sono operatori di confronto dei riferimenti agli oggetti. Non confrontano i valori di
due oggetti; controllano solo per determinare se due variabili oggetto fanno riferimento alla stessa istanza
dell'oggetto.

Associatività
Quando gli operatori con la stessa precedenza vengono visualizzati insieme in un'espressione, ad esempio
moltiplicazione e divisione, il compilatore valuta ogni operazione quando viene rilevata da sinistra verso destra.
Questa condizione è illustrata nell'esempio seguente.

Dim n1 As Integer = 96 / 8 / 4
Dim n2 As Integer = (96 / 8) / 4
Dim n3 As Integer = 96 / (8 / 4)

La prima espressione valuta la divisione 96/8 (che restituisce 12), quindi la divisione 12/4, che produce tre.
Poiché il compilatore valuta le operazioni per n1 da sinistra a destra, la valutazione è la stessa quando tale
ordine è indicato in modo esplicito per n2 . n1 E n2 hanno un risultato di tre. Al contrario, n3 ha un risultato
di 48, perché le parentesi forzano il compilatore a valutare prima 8/4.
A causa di questo comportamento, gli operatori vengono definiti associativi a sinistra in Visual Basic.

Override della precedenza e dell'associatività


È possibile utilizzare le parentesi per forzare la valutazione di alcune parti di un'espressione prima di altre.
Questo può sostituire l'ordine di precedenza e l'associatività a sinistra. Visual Basic esegue sempre le operazioni
racchiuse tra parentesi prima di quelle esterne a. Tuttavia, tra parentesi, gestisce la precedenza e l'associatività
ordinarie, a meno che non si utilizzino le parentesi all'interno delle parentesi. Questa condizione è illustrata
nell'esempio seguente.

Dim a, b, c, d, e, f, g As Double
a = 8.0
b = 3.0
c = 4.0
d = 2.0
e = 1.0
f = a - b + c / d * e
' The preceding line sets f to 7.0. Because of natural operator
' precedence and associativity, it is exactly equivalent to the
' following line.
f = (a - b) + ((c / d) * e)
' The following line overrides the natural operator precedence
' and left associativity.
g = (a - (b + c)) / (d * e)
' The preceding line sets g to 0.5.

Vedi anche
= (Operatore)
Operatore Is
Operatore IsNot
Operatore Like
Operatore TypeOf
Operatore await
Elenco degli operatori per funzionalità
Operatori ed espressioni
Tipi di dati dei risultati degli operatori (Visual Basic)
05/03/2021 • 16 minutes to read • Edit Online

Visual Basic determina il tipo di dati del risultato di un'operazione in base ai tipi di dati degli operandi. In alcuni
casi potrebbe trattarsi di un tipo di dati con un intervallo maggiore rispetto a quello di uno degli operandi.

Intervalli dei tipi di dati


Gli intervalli dei tipi di dati rilevanti, in ordine dal più piccolo al più grande, sono i seguenti:
Booleano : due valori possibili
SByte, byte -256 possibili valori integrali
Short, ushort -65.536 (6.5... E + 4) possibili valori integrali
Integer, UInteger -4.294.967.296 (4.2... E + 9) possibili valori integrali
Long, ULONG -18.446.744.073.709.551.615 (1.8... E + 19) possibili valori integrali
Decimal : 1.5... E + 29 possibili valori integrali, intervallo massimo 7.9... E + 28 (valore assoluto)
Singolo : intervallo massimo 3.4... E + 38 (valore assoluto)
Double : intervallo massimo 1.7... E + 308 (valore assoluto)
Per ulteriori informazioni sui tipi di dati Visual Basic, vedere tipi di dati.
Se un operando non restituisce nulla, gli operatori aritmetici Visual Basic lo considerano come zero.

Aritmetica decimale
Si noti che il tipo di dati Decimal non è né a virgola mobile né intero.
Se uno degli operandi di + un' – operazione,,, * / o Mod è Decimal e l'altro non è Single o Double ,
Visual Basic amplia l'altro operando a Decimal . Esegue l'operazione in Decimal e il tipo di dati del risultato è
Decimal .

Floating-Point aritmetico
Visual Basic esegue la maggior parte delle operazioni aritmetiche a virgola mobile in Double, che rappresenta il
tipo di dati più efficiente per tali operazioni. Tuttavia, se un operando è Single e l'altro non lo è Double , Visual
Basic esegue l'operazione in Single . Ogni operando viene ampliato in base al tipo di dati appropriato prima
dell'operazione e il risultato ha tale tipo di dati.
Operatori/e ^
L' / operatore viene definito solo per i tipi di dati Decimal, Singlee Double . Visual Basic allarga ogni operando
in base al tipo di dati appropriato prima dell'operazione e il risultato ha tale tipo di dati.
Nella tabella seguente vengono illustrati i tipi di dati dei risultati per l' / operatore. Si noti che questa tabella è
simmetrica. per una determinata combinazione di tipi di dati degli operandi, il tipo di dati del risultato è lo stesso
indipendentemente dall'ordine degli operandi.
Decimal Single Double Qualsiasi tipo Integer

Decimal Decimal Single Double Decimal

Single Single Single Double Single

Double Double Double Double Double

Qualsiasi tipo Integer Decimal Single Double Double

L' operatore viene definito solo per il Double tipo di dati. Visual Basic estende ogni operando in modo che
^
Double sia necessario prima dell'operazione e il tipo di dati del risultato è sempre Double .

Aritmetica Integer
Il tipo di dati del risultato di un'operazione Integer dipende dai tipi di dati degli operandi. In generale, Visual
Basic utilizza i criteri seguenti per determinare il tipo di dati del risultato:
Se entrambi gli operandi di un operatore binario hanno lo stesso tipo di dati, il risultato ha tale tipo di
dati. Un'eccezione è Boolean , che viene forzata a Short .
Se un operando non firmato partecipa a un operando firmato, il risultato ha un tipo firmato con almeno
un valore di grandi dimensioni come operando.
In caso contrario, il risultato è in genere il più grande dei due tipi di dati dell'operando.
Si noti che il tipo di dati del risultato potrebbe non corrispondere al tipo di dati dell'operando.

NOTE
Il tipo di dati del risultato non è sempre sufficiente per mantenere tutti i valori possibili risultante dall'operazione.
OverflowExceptionSe il valore è troppo grande per il tipo di dati del risultato, è possibile che si verifichi un'eccezione.

Operatore unario + e -
Nella tabella seguente vengono illustrati i tipi di dati dei risultati per i due operatori unari, + e – .

Boolean SByte Byte Short UShort Integer UInteger Long ULong

Unario Short SByte Byte Short UShort Integer UIntege long ULong
+ r

Unario Short SByte Short Short Integer Integer long long Decimal

<< and > Operatori di>


Nella tabella seguente vengono illustrati i tipi di dati dei risultati per i due operatori di spostamento di bit, << e
>> . Visual Basic considera ogni operatore di spostamento di bit come operatore unario sull'operando sinistro,
ovvero lo schema di bit da spostare.
Boolean SByte Byte Short UShort Integer UInteger Long ULong

<< , Short SByte Byte Short UShort Integer UIntege long ULong
>> r

Se l'operando sinistro è Decimal ,, Single Double o String , Visual Basic tenta di convertirlo in Long prima
dell'operazione e il tipo di dati del risultato è Long . L'operando destro (il numero di posizioni di bit da spostare)
deve essere Integer o un tipo che si allarga a Integer .
Operatori binari +,-, * e mod
Nella tabella seguente vengono illustrati i tipi di dati dei risultati per gli operatori e binari e + – gli * Mod
operatori e. Si noti che questa tabella è simmetrica. per una determinata combinazione di tipi di dati degli
operandi, il tipo di dati del risultato è lo stesso indipendentemente dall'ordine degli operandi.

Boolean SByte Byte Short UShort Integer UInteger Long ULong

Boolean Short SByte Short Short Integer Integer long long Decimal

SByte SByte SByte Short Short Integer Integer long long Decimal

Byte Short Short Byte Short UShort Integer UIntege long ULong
r

Short Short Short Short Short Integer Integer long long Decimal

UShort Integer Integer UShort Integer UShort Integer UIntege long ULong
r

Integer Integer Integer Integer Integer Integer Integer long long Decimal

UInteger long long UIntege long UIntege long UIntege long ULong
r r r

Long long long long long long long long long Decimal

ULong Decimal Decimal ULong Decimal ULong Decimal ULong Decimal ULong

Operatore \
Nella tabella seguente vengono illustrati i tipi di dati dei risultati per l' \ operatore. Si noti che questa tabella è
simmetrica. per una determinata combinazione di tipi di dati degli operandi, il tipo di dati del risultato è lo stesso
indipendentemente dall'ordine degli operandi.

Boolean SByte Byte Short UShort Integer UInteger Long ULong

Boolean Short SByte Short Short Integer Integer long long long

SByte SByte SByte Short Short Integer Integer long long long
Byte Short Short Byte Short UShort Integer UIntege long ULong
r

Short Short Short Short Short Integer Integer long long long

UShort Integer Integer UShort Integer UShort Integer UIntege long ULong
r

Integer Integer Integer Integer Integer Integer Integer long long long

UInteger long long UIntege long UIntege long UIntege long ULong
r r r

Long long long long long long long long long long

ULong long long ULong long ULong long ULong long ULong

Se uno degli operandi dell' \ operatore è Decimal, Singleo Double, Visual Basic tenta di convertirlo in Long
prima dell'operazione e il tipo di dati result è Long .

Confronti relazionali e bit per bit


Il tipo di dati del risultato di un'operazione relazionale ( = ,, <> < , > , <= , >= ) è sempre un Boolean tipo
di dati Boolean. Lo stesso vale per le operazioni logiche ( And , AndAlso , Not , Or , OrElse , Xor ) negli
Boolean operandi.

Il tipo di dati del risultato di un'operazione logica bit per bit dipende dai tipi di dati degli operandi. Si noti che
AndAlso e OrElse sono definiti solo per Boolean e Visual Basic converte ogni operando come necessario in
prima di Boolean eseguire l'operazione.
Operatori =, <>, <, > , <=, and > =
Se entrambi gli operandi sono Boolean , Visual Basic considera True minore di False . Se un tipo numerico
viene confrontato con un oggetto String , Visual Basic tenta di convertire l'oggetto String in Double prima
dell'operazione. Un Char Date operando o può essere confrontato solo con un altro operando dello stesso
tipo di dati. Il tipo di dati del risultato è sempre Boolean .
Operatore NOT bit per bit
Nella tabella seguente vengono illustrati i tipi di dati dei risultati per l'operatore bit per bit Not .

Boolean SByte Byte Short UShort Integer UInteger Long ULong

Not Boolean SByte Byte Short UShort Integer UIntege long ULong
r

Se l'operando è Decimal ,, Single Double o String , Visual Basic tenta di convertirlo in Long prima
dell'operazione e il tipo di dati del risultato è Long .
Operatori and, or e XOR bit per bit
Nella tabella seguente vengono illustrati i tipi di dati dei risultati per gli And operatori, e bit per bit Or Xor . Si
noti che questa tabella è simmetrica. per una determinata combinazione di tipi di dati degli operandi, il tipo di
dati del risultato è lo stesso indipendentemente dall'ordine degli operandi.
Boolean SByte Byte Short UShort Integer UInteger Long ULong

Boolean Boolean SByte Short Short Integer Integer long long long

SByte SByte SByte Short Short Integer Integer long long long

Byte Short Short Byte Short UShort Integer UIntege long ULong
r

Short Short Short Short Short Integer Integer long long long

UShort Integer Integer UShort Integer UShort Integer UIntege long ULong
r

Integer Integer Integer Integer Integer Integer Integer long long long

UInteger long long UIntege long UIntege long UIntege long ULong
r r r

Long long long long long long long long long long

ULong long long ULong long ULong long ULong long ULong

Se un operando è Decimal ,, Single Double o String , Visual Basic tenta di convertirlo in Long prima
dell'operazione e il tipo di dati del risultato è identico a quello dell'operando che era già stato Long .

Operatori vari
L' & operatore viene definito solo per la concatenazione degli String operandi. Visual Basic converte ogni
operando in modo necessario String prima dell'operazione e il tipo di dati del risultato è sempre String . Per
gli scopi dell' & operatore, tutte le conversioni a String vengono considerate più larghe, anche se
Option Strict è On .

Gli Is IsNot operatori e richiedono che entrambi gli operandi siano di un tipo riferimento. L' TypeOf
espressione... Is richiede che il primo operando sia di un tipo di riferimento e che il secondo operando sia il
nome di un tipo di dati. In tutti questi casi il tipo di dati del risultato è Boolean .
L' Like operatore viene definito solo per i criteri di ricerca degli String operandi. Visual Basic tenta di
convertire ogni operando in modo necessario String prima dell'operazione. Il tipo di dati del risultato è
sempre Boolean .

Vedi anche
Tipi di dati
Operatori ed espressioni
Operatori aritmetici in Visual Basic
Comparison Operators in Visual Basic
Operatori
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Operatori aritmetici
Operatori di confronto
Option Strict Statement
Elenco degli operatori per funzionalità (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Vedere una delle categorie elencate di seguito o aprire questa parte del sommario della Guida per visualizzare
un elenco in ordine alfabetico degli operatori Visual Basic.

Categorie di operatori
O P ERATO RI DESC RIZ IO N E

Operatori aritmetici Questi operatori eseguono calcoli matematici.

Operatori di assegnazione Questi operatori eseguono operazioni di assegnazione.

Operatori di confronto Questi operatori eseguono confronti.

Operatori di concatenazione Questi operatori combinano le stringhe.

Operatori logici/bit per bit Questi operatori eseguono operazioni logiche.

Operatori di spostamento bit Questi operatori eseguono turni aritmetici sugli schemi di
bit.

Operatori vari Questi operatori eseguono operazioni varie.

Vedi anche
Operatori ed espressioni
Precedenza tra gli operatori in Visual Basic
Operatori aritmetici (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Di seguito sono riportati gli operatori aritmetici definiti in Visual Basic.


Operatore ^
Operatore *
Operatore/
Operatore </span>
Operatore Mod
Operatore + (unario e binario)
Operatore- (unario e binario)

Vedi anche
Precedenza tra gli operatori in Visual Basic
Operatori aritmetici in Visual Basic
Operatori di assegnazione (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Di seguito sono riportati gli operatori di assegnazione definiti in Visual Basic.


= (Operatore)
^ = (Operatore)
Operatore * =
Operatore/=
\= (Operatore)
Operatore + =
Operatore-=
<<= (Operatore)
Operatore>>=
Operatore&=

Vedi anche
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Istruzioni
Operatori di scorrimento bit (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Di seguito sono riportati gli operatori di spostamento bit definiti in Visual Basic.
<< Operatore
Operatore>>

Vedi anche
Elenco degli operatori per funzionalità
Operatori di confronto (Visual Basic)
05/03/2021 • 9 minutes to read • Edit Online

Di seguito sono riportati gli operatori di confronto definiti in Visual Basic.


< operatore
<= operatore
> operatore
>= operatore
= operatore
<> operatore
Operatore Is
Operatore IsNot
Operatore Like
Questi operatori confrontano due espressioni per determinare se sono uguali e, in caso contrario, come si
differenziano. Is , IsNot e Like vengono descritti in dettaglio nelle pagine della guida separate. Gli operatori
di confronto relazionali vengono descritti in dettaglio in questa pagina.

Sintassi
result = expression1 comparisonoperator expression2
result = object1 [Is | IsNot] object2
result = string Like pattern

Parti
result
Obbligatorio. Boolean Valore che rappresenta il risultato del confronto.
expression1 , expression2
Obbligatorio. Qualsiasi espressione.
comparisonoperator
Obbligatorio. Qualsiasi operatore di confronto relazionale.
object1 , object2
Obbligatorio. Qualsiasi nome di oggetto di riferimento.
string
Obbligatorio. Qualsiasi espressione String .
pattern
Obbligatorio. Qualsiasi String espressione o intervallo di caratteri.
Commenti
La tabella seguente contiene un elenco degli operatori di confronto relazionale e le condizioni che determinano
se result è True o False .

O P ERATO RE TRUE SE FALSE SE

< (Minore di) expression1 < expression2 expression1 >= expression2

<= (Minore o uguale a) expression1 <= expression2 expression1 > expression2

> (Maggiore di) expression1 > expression2 expression1 <= expression2

>= (Maggiore o uguale a) expression1 >= expression2 expression1 < expression2

= (Uguale a) expression1 = expression2 expression1 <> expression2

<> (Diverso da) expression1 <> expression2 expression1 = expression2

NOTE
L' operatore = viene utilizzato anche come operatore di assegnazione.

L'operatore Is , l'operatore IsNot e l' Like operatore hanno funzionalità di confronto specifiche che
differiscono dagli operatori della tabella precedente.

Confronto di numeri
Quando si confronta un'espressione di tipo Single con una di tipo Double , l' Single espressione viene
convertita in Double . Questo comportamento è opposto al comportamento trovato nella Visual Basic 6.
Analogamente, quando si confronta un'espressione di tipo Decimal con un'espressione di tipo Single o
Double , l' Decimal espressione viene convertita in Single o Double . Per Decimal le espressioni, qualsiasi
valore frazionario minore di 1E-28 potrebbe andare perduto. Tale perdita di valori frazionari può causare il
confronto di due valori come uguali quando non lo sono. Per questo motivo, è necessario prestare attenzione
quando si usa l'uguaglianza ( = ) per confrontare due variabili a virgola mobile. È più sicuro verificare se il
valore assoluto della differenza tra i due numeri è inferiore a una piccola tolleranza accettabile.
Imprecisione a virgola mobile
Quando si utilizzano numeri a virgola mobile, tenere presente che non sempre hanno una rappresentazione
precisa in memoria. Questo può causare risultati imprevisti di determinate operazioni, ad esempio il confronto
dei valori e l' operatore mod. Per ulteriori informazioni, vedere risoluzione dei problemirelativi ai tipi di dati.

Confronto di stringhe
Quando si confrontano le stringhe, le espressioni stringa vengono valutate in base al relativo ordinamento
alfabetico, che dipende dall' Option Compare impostazione.
Option Compare Binary basa i confronti tra stringhe in base a un ordinamento derivato dalle rappresentazioni
binarie interne dei caratteri. Il tipo di ordinamento è determinato dalla tabella codici. Nell'esempio seguente
viene illustrato un tipico ordinamento binario.
A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø
Option Compare Text basa i confronti tra stringhe in base a un ordinamento testuale senza distinzione tra
maiuscole e minuscole determinato dalle impostazioni locali dell'applicazione. Quando si impostano
Option Compare Text e ordinano i caratteri nell'esempio precedente, viene applicato l'ordinamento del testo
seguente:
(A=a) < (À= à) < (B=b) < (E=e) < (Ê= ê) < (Ø = ø) < (Z=z)

Dipendenza dalle impostazioni locali


Quando si imposta Option Compare Text , il risultato di un confronto tra stringhe può dipendere dalle
impostazioni locali in cui l'applicazione è in esecuzione. Due caratteri possono essere paragonati come uguali in
un'unica impostazione locale ma non in un'altra. Se si utilizza un confronto tra stringhe per prendere decisioni
importanti, ad esempio se si desidera accettare un tentativo di accesso, è necessario ricevere un avviso per la
riservatezza delle impostazioni locali. Prendere in considerazione Option Compare Binary l'impostazione o la
chiamata di StrComp , che prende in considerazione le impostazioni locali.

Programmazione senza tipo con operatori di confronto relazionali


L'utilizzo di operatori di confronto relazionali con Object espressioni non è consentito in Option Strict On .
Quando Option Strict è Off e expression1 o expression2 è un' Object espressione, i tipi in fase di
esecuzione determinano il modo in cui vengono confrontati. Nella tabella seguente viene illustrata la modalità di
confronto delle espressioni e il risultato del confronto, a seconda del tipo di runtime degli operandi.

SE GL I O P ERA N DI SO N O IL C O N F RO N TO È

Sia String Confronto di ordinamento basato sulle caratteristiche di


ordinamento delle stringhe.

Entrambi numerici Oggetti convertiti in Double , confronto numerico.

Uno numerico e uno String String Viene convertito in un oggetto Double e il


confronto numerico viene eseguito. Se String non è
possibile convertire in Double , InvalidCastException viene
generata un'eccezione.

Uno o entrambi sono tipi di riferimento diversi da String Viene generato un tipo InvalidCastException.

I confronti numerici considerano Nothing come 0. I confronti di stringhe considerano Nothing come "" (una
stringa vuota).

Overload
Operatori di confronto relazionale ( < . <= , > , >= , = , <> ) può essere sottoposto a Overload, il che
significa che una classe o una struttura può ridefinire il comportamento quando un operando ha il tipo della
classe o della struttura. Se il codice usa uno di questi operatori in una classe o una struttura di questo tipo,
assicurarsi di comprendere il comportamento ridefinito. Per altre informazioni, vedere Operator Procedures.
Si noti che è possibile eseguire l'overload dell' operatore = solo come operatore di confronto relazionale, non
come operatore di assegnazione.

Esempio
Nell'esempio seguente vengono illustrati diversi utilizzi degli operatori di confronto relazionali, utilizzati per
confrontare le espressioni. Gli operatori di confronto relazionale restituiscono un Boolean risultato che indica se
l'espressione specificata restituisce o meno True . Quando si applicano > gli < operatori e alle stringhe, il
confronto viene eseguito usando il normale ordinamento alfabetico delle stringhe. Questo ordine può dipendere
dalle impostazioni locali. Indica se l'ordinamento fa distinzione tra maiuscole e minuscole o non dipende
dall'impostazione Option Compare .

Dim x As testClass
Dim y As New testClass()
x = y
If x Is y Then
' Insert code to run if x and y point to the same instance.
End If

Nell'esempio precedente, il primo confronto restituisce False e i restanti confronti restituiscono True .

Vedi anche
InvalidCastException
= (Operatore)
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Risoluzione dei problemi relativi ai tipi di dati
Comparison Operators in Visual Basic
Operatori di concatenazione (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Di seguito sono riportati gli operatori di concatenazione definiti in Visual Basic.


Operatore&
Operatore +

Vedi anche
System.Text
StringBuilder
Precedenza tra gli operatori in Visual Basic
Operatori di concatenazione in Visual Basic
Operatori logici e bit per bit (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Di seguito sono riportati gli operatori logici/bit per bit definiti in Visual Basic.
Operatore And
Operatore Not
Operatore Or
Operatore Xor
Operatore AndAlso
Operatore OrElse
Operatore IsFalse
Operatore IsTrue

Vedi anche
Precedenza tra gli operatori in Visual Basic
Operatori logici e bit per bit in Visual Basic
Operatori vari (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Di seguito sono riportati gli operatori vari definiti in Visual Basic.


?. operatore condizionale null
? () (operatore condizionale null)
Operatore AddressOf
Operatore await
Operatore GetType
Espressione di funzione
Operatore If
Operatore TypeOf

Vedi anche
Operatori elencati per funzionalità
& Operatore (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Genera una concatenazione di stringhe di due espressioni.

Sintassi
result = expression1 & expression2

Parti
result
Obbligatorio. Qualsiasi String Object variabile o.
expression1
Obbligatorio. Qualsiasi espressione con un tipo di dati che si allarga a String .
expression2
Obbligatorio. Qualsiasi espressione con un tipo di dati che si allarga a String .

Commenti
Se il tipo di dati di expression1 o expression2 non è String ma si allarga a String , viene convertito in
String . Se uno dei tipi di dati non viene ampliato a String , il compilatore genera un errore.

Il tipo di dati di result è String . Se una o entrambe le espressioni restituiscono Nothing o hanno un valore
DBNull.Value , vengono considerate come una stringa con un valore di "".

NOTE
L' & operatore può essere sottoposto a Overload, il che significa che una classe o una struttura può ridefinire il
comportamento quando un operando ha il tipo della classe o della struttura. Se il codice usa questo operatore su una
classe o una struttura di questo tipo, assicurarsi di comprendere il comportamento ridefinito. Per altre informazioni,
vedere Operator Procedures.

NOTE
Il carattere e commerciale (&) può essere usato anche per identificare le variabili come tipo Long . Per ulteriori
informazioni, vedere caratteri di tipo.

Esempio
In questo esempio viene usato l' & operatore per forzare la concatenazione di stringhe. Il risultato è un valore
stringa che rappresenta la concatenazione dei due operandi di stringa.
Dim sampleStr As String
sampleStr = "Hello" & " World"
' The preceding statement sets sampleStr to "Hello World".

Vedi anche
Operatore&=
Operatori di concatenazione
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Operatori di concatenazione in Visual Basic
&Operatore = (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Concatena un' String espressione a una String variabile o a una proprietà e assegna il risultato alla variabile
o alla proprietà.

Sintassi
variableorproperty &= expression

Parti
variableorproperty
Obbligatorio. Qualsiasi String variabile o proprietà.
expression
Obbligatorio. Qualsiasi espressione String .

Commenti
L'elemento sul lato sinistro dell' &= operatore può essere una variabile scalare semplice, una proprietà o un
elemento di una matrice. La variabile o la proprietà non può essere di sola lettura. L' &= operatore concatena l'
String espressione a destra della String variabile o della proprietà a sinistra e assegna il risultato alla
variabile o alla proprietà a sinistra.

Overload
L' operatore& può essere sottoposto a Overload, il che significa che una classe o una struttura può ridefinire il
comportamento quando un operando ha il tipo della classe o della struttura. L'overload dell' & operatore
influiscono sul comportamento dell' &= operatore. Se il codice usa &= su una classe o una struttura che
esegue l'overload di & , assicurarsi di comprendere il comportamento ridefinito. Per altre informazioni, vedere
Operator Procedures.

Esempio
Nell'esempio seguente viene usato l' &= operatore per concatenare due String variabili e assegnare il
risultato alla prima variabile.

Dim var1 As String = "Hello "


Dim var2 As String = "World!"
var1 &= var2
' The value of var1 is now "Hello World!".

Vedi anche
Operatore&
Operatore + =
Operatori di assegnazione
Operatori di concatenazione
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Istruzioni
Operatore * (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Moltiplica due numeri.

Sintassi
number1 * number2

Parti
T ERM IN E DEF IN IZ IO N E

number1 Obbligatorio. Qualsiasi espressione numerica.

number2 Obbligatorio. Qualsiasi espressione numerica.

Risultato
Il risultato è il prodotto di number1 e number2 .

Tipi supportati
Tutti i tipi numerici, inclusi i tipi senza segno e a virgola mobile e Decimal .

Commenti
Il tipo di dati del risultato dipende dai tipi degli operandi. Nella tabella seguente viene illustrato il modo in cui
viene determinato il tipo di dati del risultato.

T IP I DI DAT I DEGL I O P ERA N DI T IP O DI DAT I RESULT

Entrambe le espressioni sono tipi di dati integrali (SByte, Tipo di dati numerico appropriato per i tipi di dati di
byte, short, ushort, Integer, UInteger, Long, ULONG) number1 e number2 . Vedere le tabelle "aritmetiche di
interi" nei tipi di dati dei risultati dell'operatore.

Entrambe le espressioni sono decimali Decimal

Entrambe le espressioni sono singole Single

Expression è un tipo di dati a virgola mobile ( Single o Double


Double), ma non entrambi Single (Nota Decimal non è
un tipo di dati a virgola mobile)

Se un'espressione restituisce Nothing, viene considerata come zero.

Overload
L' * operatore può essere sottoposto a Overload, il che significa che una classe o una struttura può ridefinire il
comportamento quando un operando ha il tipo della classe o della struttura. Se il codice usa questo operatore
su una classe o una struttura di questo tipo, assicurarsi di comprendere il comportamento ridefinito. Per altre
informazioni, vedere Operator Procedures.

Esempio
In questo esempio viene usato l' * operatore per moltiplicare due numeri. Il risultato è il prodotto dei due
operandi.

Dim testValue As Double


testValue = 2 * 2
' The preceding statement sets testValue to 4.
testValue = 459.35 * 334.9
' The preceding statement sets testValue to 153836.315.

Vedi anche
Operatore * =
Operatori aritmetici
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Operatori aritmetici in Visual Basic
Operatore *= (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Moltiplica il valore di una variabile o di una proprietà in base al valore di un'espressione e assegna il risultato
alla variabile o alla proprietà.

Sintassi
variableorproperty *= expression

Parti
variableorproperty
Obbligatorio. Qualsiasi variabile o proprietà numerica.
expression
Obbligatorio. Qualsiasi espressione numerica.

Commenti
L'elemento sul lato sinistro dell' *= operatore può essere una variabile scalare semplice, una proprietà o un
elemento di una matrice. La variabile o la proprietà non può essere di sola lettura.
L' *= operatore moltiplica innanzitutto il valore dell'espressione (sul lato destro dell'operatore) in base al
valore della variabile o della proprietà (sul lato sinistro dell'operatore). L'operatore assegna quindi il risultato
dell'operazione alla variabile o alla proprietà.

Overload
L' operatore * può essere sottoposto a Overload, il che significa che una classe o una struttura può ridefinire il
comportamento quando un operando ha il tipo della classe o della struttura. L'overload dell' * operatore
influiscono sul comportamento dell' *= operatore. Se il codice usa *= su una classe o una struttura che
esegue l'overload di * , assicurarsi di comprendere il comportamento ridefinito. Per altre informazioni, vedere
Operator Procedures.

Esempio
Nell'esempio seguente viene usato l' *= operatore per moltiplicare una Integer variabile per secondo e
assegnare il risultato alla prima variabile.

Dim var1 As Integer = 10


Dim var2 As Integer = 3
var1 *= var2
' The value of var1 is now 30.

Vedi anche
Operatore *
Operatori di assegnazione
Operatori aritmetici
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Istruzioni
Operatore + (Visual Basic)
05/03/2021 • 9 minutes to read • Edit Online

Somma due numeri o restituisce il valore positivo di un'espressione numerica. Può essere usato anche per
concatenare due espressioni stringa.

Sintassi
expression1 + expression2

oppure

+expression1

Parti
T ERM IN E DEF IN IZ IO N E

expression1 Obbligatorio. Qualsiasi espressione numerica o stringa.

expression2 Obbligatorio a meno che l' + operatore non calcoli un


valore negativo. Qualsiasi espressione numerica o stringa.

Risultato
Se expression1 e expression2 sono entrambi numerici, il risultato è la somma aritmetica.
Se expression2 è assente, l' + operatore è l'operatore di identità unario per il valore non modificato di
un'espressione. In questo senso, l'operazione consiste nel mantenere il segno di expression1 , pertanto il
risultato è negativo se expression1 è negativo.
Se expression1 e expression2 sono entrambe stringhe, il risultato è la concatenazione dei relativi valori.
Se expression1 e expression2 sono di tipi misti, l'azione eseguita dipende dai relativi tipi, dal relativo
contenuto e dall'impostazione dell' istruzione Option Strict. Per ulteriori informazioni, vedere le tabelle in
"osservazioni".

Tipi supportati
Tutti i tipi numerici, inclusi i tipi senza segno e a virgola mobile e Decimal ,e String .

Commenti
In generale, + se possibile, esegue l'aggiunta aritmetica e concatena solo quando entrambe le espressioni sono
stringhe.
Se nessuna delle due espressioni è un Object , Visual Basic esegue le azioni seguenti.
T IP I DI DAT I DEL L E ESP RESSIO N I A Z IO N E P ER C O M P IL ATO RE

Entrambe le espressioni sono tipi di dati numerici ( SByte ,, Aggiungi. Il tipo di dati del risultato è un tipo numerico
Byte Short , UShort , Integer , UInteger , Long , appropriato per i tipi di dati di expression1 e
ULong , Decimal , Single o Double ) expression2 . Vedere le tabelle "aritmetiche di interi" nei
tipi di dati dei risultati dell'operatore.

Entrambe le espressioni sono di tipo String Concatenare.

Un'espressione è un tipo di dati numerico e l'altra è una Se Option Strict è On , genera un errore del
stringa compilatore.

Se Option Strict è Off , convertire in modo implicito


String in Double e aggiungere.

Se String non può essere convertito in Double , viene


generata un' InvalidCastException eccezione.

Un'espressione è un tipo di dati numerico e l'altra non è Aggiungere, con Nothing valore pari a zero.
nulla

Un'espressione è una stringa e l'altra è Nothing Concatenate, con Nothing valore "".

Se un'espressione è un' Object espressione, Visual Basic esegue le azioni seguenti.

T IP I DI DAT I DEL L E ESP RESSIO N I A Z IO N E P ER C O M P IL ATO RE

Object l'espressione include un valore numerico e l'altro è Se Option Strict è On , genera un errore del
un tipo di dati numerico compilatore.

Se Option Strict è Off , aggiungere.

Object l'espressione include un valore numerico e l'altro è Se Option Strict è On , genera un errore del
di tipo String compilatore.

Se Option Strict è Off , convertire in modo implicito


String in Double e aggiungere.

Se String non può essere convertito in Double , viene


generata un' InvalidCastException eccezione.

Object l'espressione include una stringa e l'altra è un tipo Se Option Strict è On , genera un errore del
di dati numerico compilatore.

Se Option Strict è Off , convertire in modo implicito la


stringa Object in Double e aggiungere.

Se la stringa Object non può essere convertita in Double


, viene generata un' InvalidCastException eccezione.

Object l'espressione include una stringa e l'altra è di tipo Se Option Strict è On , genera un errore del
String compilatore.

Se Option Strict è Off , convertire in modo implicito


Object in String e concatenare.

Se entrambe le espressioni sono Object espressioni, Visual Basic esegue le azioni seguenti ( Option Strict Off
solo).

T IP I DI DAT I DEL L E ESP RESSIO N I A Z IO N E P ER C O M P IL ATO RE

Entrambe le Object espressioni contengono valori Aggiungi.


numerici

Entrambe Object le espressioni sono di tipo String Concatenare.

Un' Object espressione include un valore numerico e l'altra Converte in modo implicito la stringa Object in Double e
include una stringa Aggiungi.

Se la stringa Object non può essere convertita in un valore


numerico, viene generata un' InvalidCastException eccezione.

Se una Object delle due espressioni restituisce Nothing o DBNull , l' + operatore lo considera come String
con un valore di "".

NOTE
Quando si utilizza l' + operatore, potrebbe non essere possibile determinare se si verificherà l'aggiunta o la
concatenazione di stringhe. Usare l' & operatore per la concatenazione per eliminare l'ambiguità e per fornire codice
autodocumentato.

Overload
L' + operatore può essere sottoposto a Overload, il che significa che una classe o una struttura può ridefinire il
comportamento quando un operando ha il tipo della classe o della struttura. Se il codice usa questo operatore
su una classe o una struttura di questo tipo, assicurarsi di comprendere il comportamento ridefinito. Per altre
informazioni, vedere Operator Procedures.

Esempio
Nell'esempio seguente viene usato l' + operatore per aggiungere numeri. Se gli operandi sono entrambi
numerici, Visual Basic calcola il risultato aritmetico. Il risultato aritmetico rappresenta la somma dei due
operandi.

Dim sumNumber As Integer


sumNumber = 2 + 2
sumNumber = 4257.04 + 98112
' The preceding statements set sumNumber to 4 and 102369.

È anche possibile usare l' + operatore per concatenare le stringhe. Se gli operandi sono entrambe stringhe,
Visual Basic li concatena. Il risultato della concatenazione rappresenta una singola stringa costituita dal
contenuto dei due operandi uno dopo l'altro.
Se gli operandi sono di tipo misto, il risultato dipende dall'impostazione dell' istruzione Option Strict.
Nell'esempio seguente viene illustrato il risultato quando Option Strict è On .

Option Strict On
Dim var1 As String = "34"
Dim var2 As Integer = 6
Dim concatenatedNumber As Integer = var1 + var2

' The preceding statement generates a COMPILER ERROR.

Nell'esempio seguente viene illustrato il risultato quando Option Strict è Off .

Option Strict Off

Dim var1 As String = "34"


Dim var2 As Integer = 6
Dim concatenatedNumber As Integer = var1 + var2

' The preceding statement returns 40 after the string in var1 is


' converted to a numeric value. This might be an unexpected result.
' We do not recommend use of Option Strict Off for these operations.

Per eliminare l'ambiguità, è consigliabile utilizzare l' & operatore anziché + per la concatenazione.

Vedi anche
Operatore&
Operatori di concatenazione
Operatori aritmetici
Elenco degli operatori per funzionalità
Precedenza tra gli operatori in Visual Basic
Operatori aritmetici in Visual Basic
Option Strict Statement
Operatore += (Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

Aggiunge il valore di un'espressione numerica al valore di una variabile o di una proprietà numerica e assegna il
risultato alla variabile o alla proprietà. Può essere usato anche per concatenare un' String espressione a una
String variabile o a una proprietà e assegnare il risultato alla variabile o alla proprietà.

Sintassi
variableorproperty += expression

Parti
variableorproperty
Obbligatorio. Qualsiasi String proprietà o variabile numerica.
expression
Obbligatorio. Qualsiasi espressione o numerica String .

Commenti
L'elemento sul lato sinistro dell' += operatore può essere una variabile scalare semplice, una proprietà o un
elemento di una matrice. La variabile o la proprietà non può essere di sola lettura.
L' += operatore aggiunge il valore a destra alla variabile o alla proprietà a sinistra e assegna il risultato alla
variabile o alla proprietà a sinistra. L' += operatore può essere usato anche per concatenare l' String
espressione a destra della String variabile o della proprietà a sinistra e assegnare il risultato alla variabile o alla
proprietà a sinistra.

NOTE
Quando si utilizza l' += operatore, potrebbe non essere possibile determinare se si verificherà l'aggiunta o la
concatenazione di stringhe. Usare l' &= operatore per la concatenazione per eliminare l'ambiguità e per fornire codice
autodocumentato.

Questo operatore di assegnazione esegue in modo implicito le conversioni verso un tipo di ingrandimento ma
non di restringimento se l'ambiente di compilazione impone una semantica rigida. Per ulteriori informazioni su
queste conversioni, vedere la pagina relativa alle conversioniverso un tipo di dati più piccolo. Per ulteriori
informazioni sulla semantica restrittiva e permissiva, vedere istruzione Option Strict.
Se sono consentite semantiche permissive, l' += operatore esegue in modo implicito una serie di conversioni di
stringa e numeriche identiche a quelle eseguite dall' + operatore. Per informazioni dettagliate su queste
conversioni, vedere operatore +.

Overload
L' + operatore può essere sottoposto a Overload, il che significa che una classe o una struttura può ridefinire il
comportamento quando un operando ha il tipo della classe o della struttura. L'overload dell' + operatore
influiscono sul comportamento dell' += operatore. Se il codice usa += su una classe o una struttura che
esegue l'overload di + , assicurarsi di comprendere il comportamento ridefinito. Per altre informazioni, vedere
Operator Procedures.

Esempio
Nell'esempio seguente viene usato l' += operatore per combinare il valore di una variabile con un'altra. La
prima parte USA += con le variabili numeriche per aggiungere un valore a un altro. La seconda parte USA +=
con le String variabili per concatenare un valore con un altro. In entrambi i casi, il risultato viene assegnato alla
prima variabile.

' This part uses numeric variables.


Dim num1 As Integer = 10
Dim num2 As Integer = 3
num1 += num2

' This part uses string variables.


Dim str1 As String = "10"
Dim str2 As String = "3"
str1 += str2

Il valore di num1 è ora 13 e il valore di str1 è ora "103".

Vedi anche
Operatore +
Operatori di assegnazione
Operatori aritmetici
Operatori di concatenazione
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Istruzioni
Operatore = (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Assegna un valore a una variabile o a una proprietà.

Sintassi
variableorproperty = value

Parti
variableorproperty
Qualsiasi variabile scrivibile o qualsiasi proprietà.
value
Qualsiasi valore letterale, costante o espressione.

Commenti
L'elemento sul lato sinistro del segno di uguale ( = ) può essere una variabile scalare semplice, una proprietà o
un elemento di una matrice. La variabile o la proprietà non può essere di sola lettura. L' = operatore assegna il
valore a destra alla variabile o alla proprietà a sinistra.

NOTE
L' = operatore viene utilizzato anche come operatore di confronto. Per informazioni dettagliate, vedere operatori di
confronto.

Overload
= È possibile eseguire l'overload dell'operatore solo come operatore di confronto relazionale, non come
operatore di assegnazione. Per altre informazioni, vedere Operator Procedures.

Esempio
Nell'esempio seguente viene illustrato l'operatore di assegnazione. Il valore a destra viene assegnato alla
variabile a sinistra.

Dim testInt As Integer


Dim testString As String
Dim testButton As System.Windows.Forms.Button
Dim testObject As Object
testInt = 42
testString = "This is an example of a string literal."
testButton = New System.Windows.Forms.Button()
testObject = testInt
testObject = testString
testObject = testButton
Vedi anche
Operatore&=
Operatore * =
Operatore + =
Operatore-= (Visual Basic)
Operatore/= (Visual Basic)
\= (Operatore)
^ = (Operatore)
Istruzioni
Operatori di confronto
ReadOnly
Inferenza del tipo di variabile locale
Operatore - (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Restituisce la differenza tra due espressioni numeriche o il valore negativo di un'espressione numerica.

Sintassi
expression1 – expression2

oppure

–expression1

Parti
expression1
Obbligatorio. Qualsiasi espressione numerica.
expression2
Obbligatorio a meno che l' – operatore non calcoli un valore negativo. Qualsiasi espressione numerica.

Risultato
Il risultato è la differenza tra expression1 e expression2 o il valore negato di expression1 .
Il tipo di dati del risultato è un tipo numerico appropriato per i tipi di dati di expression1 e expression2 . Vedere
le tabelle "aritmetiche di interi" nei tipi di dati dei risultati dell'operatore.

Tipi supportati
tutti i tipi numerici. Sono inclusi i tipi a virgola mobile e non firmati e Decimal .

Commenti
Nel primo utilizzo illustrato nella sintassi illustrata in precedenza, l' – operatore è l'operatore di sottrazione
aritmetica binario per la differenza tra due espressioni numeriche.
Nel secondo utilizzo illustrato nella sintassi illustrata in precedenza, l' – operatore è l'operatore di negazione
unario per il valore negativo di un'espressione. In questo senso, la negazione consiste nell'inversione del segno
di in expression1 modo che il risultato sia positivo se expression1 è negativo.
Se una delle due espressioni restituisce Nothing, l' – operatore lo considera come zero.

NOTE
L' – operatore può essere sottoposto a Overload, il che significa che una classe o una struttura può ridefinire il
comportamento quando un operando ha il tipo della classe o della struttura. Se il codice usa questo operatore su una
classe o una struttura di questo tipo, verificare di aver compreso il comportamento ridefinito. Per altre informazioni,
vedere Operator Procedures.
Esempio
Nell'esempio seguente viene usato l' – operatore per calcolare e restituire la differenza tra due numeri e quindi
per negare un numero.

Dim binaryResult As Double = 459.35 - 334.9


Dim unaryResult As Double = -334.9

Dopo l'esecuzione di queste istruzioni, binaryResult contiene 124,45 e unaryResult contiene – 334,90.

Vedi anche
Operatore-= (Visual Basic)
Operatori aritmetici
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Operatori aritmetici in Visual Basic
Operatore -= (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Sottrae il valore di un'espressione dal valore di una variabile o di una proprietà e assegna il risultato alla
variabile o alla proprietà.

Sintassi
variableorproperty -= expression

Parti
variableorproperty
Obbligatorio. Qualsiasi variabile o proprietà numerica.
expression
Obbligatorio. Qualsiasi espressione numerica.

Commenti
L'elemento sul lato sinistro dell' -= operatore può essere una variabile scalare semplice, una proprietà o un
elemento di una matrice. La variabile o la proprietà non può essere di sola lettura.
L' -= operatore sottrae prima di tutto il valore dell'espressione (sul lato destro dell'operatore) dal valore della
variabile o della proprietà (sul lato sinistro dell'operatore). L'operatore assegna quindi il risultato dell'operazione
alla variabile o alla proprietà.

Overload
L' operatore-(Visual Basic) può essere sottoposto a Overload, il che significa che una classe o una struttura può
ridefinire il comportamento quando un operando ha il tipo della classe o della struttura. L'overload dell' -
operatore influiscono sul comportamento dell' -= operatore. Se il codice usa -= su una classe o una struttura
che esegue l'overload di - , assicurarsi di comprendere il comportamento ridefinito. Per altre informazioni,
vedere Operator Procedures.

Esempio
Nell'esempio seguente viene usato l' -= operatore per sottrarre una Integer variabile da un'altra e assegnare
il risultato alla seconda variabile.

Dim var1 As Integer = 10


Dim var2 As Integer = 3
var1 -= var2
' The value of var1 is now 7.

Vedi anche
Operatore - (Visual Basic)
Operatori di assegnazione
Operatori aritmetici
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Istruzioni
Operatori di confronto (Visual Basic)
05/03/2021 • 9 minutes to read • Edit Online

Di seguito sono riportati gli operatori di confronto definiti in Visual Basic.


< operatore
<= operatore
> operatore
>= operatore
= operatore
<> operatore
Operatore Is
Operatore IsNot
Operatore Like
Questi operatori confrontano due espressioni per determinare se sono uguali e, in caso contrario, come si
differenziano. Is , IsNot e Like vengono descritti in dettaglio nelle pagine della guida separate. Gli operatori
di confronto relazionali vengono descritti in dettaglio in questa pagina.

Sintassi
result = expression1 comparisonoperator expression2
result = object1 [Is | IsNot] object2
result = string Like pattern

Parti
result
Obbligatorio. Boolean Valore che rappresenta il risultato del confronto.
expression1 , expression2
Obbligatorio. Qualsiasi espressione.
comparisonoperator
Obbligatorio. Qualsiasi operatore di confronto relazionale.
object1 , object2
Obbligatorio. Qualsiasi nome di oggetto di riferimento.
string
Obbligatorio. Qualsiasi espressione String .
pattern
Obbligatorio. Qualsiasi String espressione o intervallo di caratteri.
Commenti
La tabella seguente contiene un elenco degli operatori di confronto relazionale e le condizioni che determinano
se result è True o False .

O P ERATO RE TRUE SE FALSE SE

< (Minore di) expression1 < expression2 expression1 >= expression2

<= (Minore o uguale a) expression1 <= expression2 expression1 > expression2

> (Maggiore di) expression1 > expression2 expression1 <= expression2

>= (Maggiore o uguale a) expression1 >= expression2 expression1 < expression2

= (Uguale a) expression1 = expression2 expression1 <> expression2

<> (Diverso da) expression1 <> expression2 expression1 = expression2

NOTE
L' operatore = viene utilizzato anche come operatore di assegnazione.

L'operatore Is , l'operatore IsNot e l' Like operatore hanno funzionalità di confronto specifiche che
differiscono dagli operatori della tabella precedente.

Confronto di numeri
Quando si confronta un'espressione di tipo Single con una di tipo Double , l' Single espressione viene
convertita in Double . Questo comportamento è opposto al comportamento trovato nella Visual Basic 6.
Analogamente, quando si confronta un'espressione di tipo Decimal con un'espressione di tipo Single o
Double , l' Decimal espressione viene convertita in Single o Double . Per Decimal le espressioni, qualsiasi
valore frazionario minore di 1E-28 potrebbe andare perduto. Tale perdita di valori frazionari può causare il
confronto di due valori come uguali quando non lo sono. Per questo motivo, è necessario prestare attenzione
quando si usa l'uguaglianza ( = ) per confrontare due variabili a virgola mobile. È più sicuro verificare se il
valore assoluto della differenza tra i due numeri è inferiore a una piccola tolleranza accettabile.
Imprecisione a virgola mobile
Quando si utilizzano numeri a virgola mobile, tenere presente che non sempre hanno una rappresentazione
precisa in memoria. Questo può causare risultati imprevisti di determinate operazioni, ad esempio il confronto
dei valori e l' operatore mod. Per ulteriori informazioni, vedere risoluzione dei problemirelativi ai tipi di dati.

Confronto di stringhe
Quando si confrontano le stringhe, le espressioni stringa vengono valutate in base al relativo ordinamento
alfabetico, che dipende dall' Option Compare impostazione.
Option Compare Binary basa i confronti tra stringhe in base a un ordinamento derivato dalle rappresentazioni
binarie interne dei caratteri. Il tipo di ordinamento è determinato dalla tabella codici. Nell'esempio seguente
viene illustrato un tipico ordinamento binario.
A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø
Option Compare Text basa i confronti tra stringhe in base a un ordinamento testuale senza distinzione tra
maiuscole e minuscole determinato dalle impostazioni locali dell'applicazione. Quando si impostano
Option Compare Text e ordinano i caratteri nell'esempio precedente, viene applicato l'ordinamento del testo
seguente:
(A=a) < (À= à) < (B=b) < (E=e) < (Ê= ê) < (Ø = ø) < (Z=z)

Dipendenza dalle impostazioni locali


Quando si imposta Option Compare Text , il risultato di un confronto tra stringhe può dipendere dalle
impostazioni locali in cui l'applicazione è in esecuzione. Due caratteri possono essere paragonati come uguali in
un'unica impostazione locale ma non in un'altra. Se si utilizza un confronto tra stringhe per prendere decisioni
importanti, ad esempio se si desidera accettare un tentativo di accesso, è necessario ricevere un avviso per la
riservatezza delle impostazioni locali. Prendere in considerazione Option Compare Binary l'impostazione o la
chiamata di StrComp , che prende in considerazione le impostazioni locali.

Programmazione senza tipo con operatori di confronto relazionali


L'utilizzo di operatori di confronto relazionali con Object espressioni non è consentito in Option Strict On .
Quando Option Strict è Off e expression1 o expression2 è un' Object espressione, i tipi in fase di
esecuzione determinano il modo in cui vengono confrontati. Nella tabella seguente viene illustrata la modalità di
confronto delle espressioni e il risultato del confronto, a seconda del tipo di runtime degli operandi.

SE GL I O P ERA N DI SO N O IL C O N F RO N TO È

Sia String Confronto di ordinamento basato sulle caratteristiche di


ordinamento delle stringhe.

Entrambi numerici Oggetti convertiti in Double , confronto numerico.

Uno numerico e uno String String Viene convertito in un oggetto Double e il


confronto numerico viene eseguito. Se String non è
possibile convertire in Double , InvalidCastException viene
generata un'eccezione.

Uno o entrambi sono tipi di riferimento diversi da String Viene generato un tipo InvalidCastException.

I confronti numerici considerano Nothing come 0. I confronti di stringhe considerano Nothing come "" (una
stringa vuota).

Overload
Operatori di confronto relazionale ( < . <= , > , >= , = , <> ) può essere sottoposto a Overload, il che
significa che una classe o una struttura può ridefinire il comportamento quando un operando ha il tipo della
classe o della struttura. Se il codice usa uno di questi operatori in una classe o una struttura di questo tipo,
assicurarsi di comprendere il comportamento ridefinito. Per altre informazioni, vedere Operator Procedures.
Si noti che è possibile eseguire l'overload dell' operatore = solo come operatore di confronto relazionale, non
come operatore di assegnazione.

Esempio
Nell'esempio seguente vengono illustrati diversi utilizzi degli operatori di confronto relazionali, utilizzati per
confrontare le espressioni. Gli operatori di confronto relazionale restituiscono un Boolean risultato che indica se
l'espressione specificata restituisce o meno True . Quando si applicano > gli < operatori e alle stringhe, il
confronto viene eseguito usando il normale ordinamento alfabetico delle stringhe. Questo ordine può dipendere
dalle impostazioni locali. Indica se l'ordinamento fa distinzione tra maiuscole e minuscole o non dipende
dall'impostazione Option Compare .

Dim x As testClass
Dim y As New testClass()
x = y
If x Is y Then
' Insert code to run if x and y point to the same instance.
End If

Nell'esempio precedente, il primo confronto restituisce False e i restanti confronti restituiscono True .

Vedi anche
InvalidCastException
= (Operatore)
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Risoluzione dei problemi relativi ai tipi di dati
Comparison Operators in Visual Basic
Operatori di confronto (Visual Basic)
05/03/2021 • 9 minutes to read • Edit Online

Di seguito sono riportati gli operatori di confronto definiti in Visual Basic.


< operatore
<= operatore
> operatore
>= operatore
= operatore
<> operatore
Operatore Is
Operatore IsNot
Operatore Like
Questi operatori confrontano due espressioni per determinare se sono uguali e, in caso contrario, come si
differenziano. Is , IsNot e Like vengono descritti in dettaglio nelle pagine della guida separate. Gli operatori
di confronto relazionali vengono descritti in dettaglio in questa pagina.

Sintassi
result = expression1 comparisonoperator expression2
result = object1 [Is | IsNot] object2
result = string Like pattern

Parti
result
Obbligatorio. Boolean Valore che rappresenta il risultato del confronto.
expression1 , expression2
Obbligatorio. Qualsiasi espressione.
comparisonoperator
Obbligatorio. Qualsiasi operatore di confronto relazionale.
object1 , object2
Obbligatorio. Qualsiasi nome di oggetto di riferimento.
string
Obbligatorio. Qualsiasi espressione String .
pattern
Obbligatorio. Qualsiasi String espressione o intervallo di caratteri.
Commenti
La tabella seguente contiene un elenco degli operatori di confronto relazionale e le condizioni che determinano
se result è True o False .

O P ERATO RE TRUE SE FALSE SE

< (Minore di) expression1 < expression2 expression1 >= expression2

<= (Minore o uguale a) expression1 <= expression2 expression1 > expression2

> (Maggiore di) expression1 > expression2 expression1 <= expression2

>= (Maggiore o uguale a) expression1 >= expression2 expression1 < expression2

= (Uguale a) expression1 = expression2 expression1 <> expression2

<> (Diverso da) expression1 <> expression2 expression1 = expression2

NOTE
L' operatore = viene utilizzato anche come operatore di assegnazione.

L'operatore Is , l'operatore IsNot e l' Like operatore hanno funzionalità di confronto specifiche che
differiscono dagli operatori della tabella precedente.

Confronto di numeri
Quando si confronta un'espressione di tipo Single con una di tipo Double , l' Single espressione viene
convertita in Double . Questo comportamento è opposto al comportamento trovato nella Visual Basic 6.
Analogamente, quando si confronta un'espressione di tipo Decimal con un'espressione di tipo Single o
Double , l' Decimal espressione viene convertita in Single o Double . Per Decimal le espressioni, qualsiasi
valore frazionario minore di 1E-28 potrebbe andare perduto. Tale perdita di valori frazionari può causare il
confronto di due valori come uguali quando non lo sono. Per questo motivo, è necessario prestare attenzione
quando si usa l'uguaglianza ( = ) per confrontare due variabili a virgola mobile. È più sicuro verificare se il
valore assoluto della differenza tra i due numeri è inferiore a una piccola tolleranza accettabile.
Imprecisione a virgola mobile
Quando si utilizzano numeri a virgola mobile, tenere presente che non sempre hanno una rappresentazione
precisa in memoria. Questo può causare risultati imprevisti di determinate operazioni, ad esempio il confronto
dei valori e l' operatore mod. Per ulteriori informazioni, vedere risoluzione dei problemirelativi ai tipi di dati.

Confronto di stringhe
Quando si confrontano le stringhe, le espressioni stringa vengono valutate in base al relativo ordinamento
alfabetico, che dipende dall' Option Compare impostazione.
Option Compare Binary basa i confronti tra stringhe in base a un ordinamento derivato dalle rappresentazioni
binarie interne dei caratteri. Il tipo di ordinamento è determinato dalla tabella codici. Nell'esempio seguente
viene illustrato un tipico ordinamento binario.
A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø
Option Compare Text basa i confronti tra stringhe in base a un ordinamento testuale senza distinzione tra
maiuscole e minuscole determinato dalle impostazioni locali dell'applicazione. Quando si impostano
Option Compare Text e ordinano i caratteri nell'esempio precedente, viene applicato l'ordinamento del testo
seguente:
(A=a) < (À= à) < (B=b) < (E=e) < (Ê= ê) < (Ø = ø) < (Z=z)

Dipendenza dalle impostazioni locali


Quando si imposta Option Compare Text , il risultato di un confronto tra stringhe può dipendere dalle
impostazioni locali in cui l'applicazione è in esecuzione. Due caratteri possono essere paragonati come uguali in
un'unica impostazione locale ma non in un'altra. Se si utilizza un confronto tra stringhe per prendere decisioni
importanti, ad esempio se si desidera accettare un tentativo di accesso, è necessario ricevere un avviso per la
riservatezza delle impostazioni locali. Prendere in considerazione Option Compare Binary l'impostazione o la
chiamata di StrComp , che prende in considerazione le impostazioni locali.

Programmazione senza tipo con operatori di confronto relazionali


L'utilizzo di operatori di confronto relazionali con Object espressioni non è consentito in Option Strict On .
Quando Option Strict è Off e expression1 o expression2 è un' Object espressione, i tipi in fase di
esecuzione determinano il modo in cui vengono confrontati. Nella tabella seguente viene illustrata la modalità di
confronto delle espressioni e il risultato del confronto, a seconda del tipo di runtime degli operandi.

SE GL I O P ERA N DI SO N O IL C O N F RO N TO È

Sia String Confronto di ordinamento basato sulle caratteristiche di


ordinamento delle stringhe.

Entrambi numerici Oggetti convertiti in Double , confronto numerico.

Uno numerico e uno String String Viene convertito in un oggetto Double e il


confronto numerico viene eseguito. Se String non è
possibile convertire in Double , InvalidCastException viene
generata un'eccezione.

Uno o entrambi sono tipi di riferimento diversi da String Viene generato un tipo InvalidCastException.

I confronti numerici considerano Nothing come 0. I confronti di stringhe considerano Nothing come "" (una
stringa vuota).

Overload
Operatori di confronto relazionale ( < . <= , > , >= , = , <> ) può essere sottoposto a Overload, il che
significa che una classe o una struttura può ridefinire il comportamento quando un operando ha il tipo della
classe o della struttura. Se il codice usa uno di questi operatori in una classe o una struttura di questo tipo,
assicurarsi di comprendere il comportamento ridefinito. Per altre informazioni, vedere Operator Procedures.
Si noti che è possibile eseguire l'overload dell' operatore = solo come operatore di confronto relazionale, non
come operatore di assegnazione.

Esempio
Nell'esempio seguente vengono illustrati diversi utilizzi degli operatori di confronto relazionali, utilizzati per
confrontare le espressioni. Gli operatori di confronto relazionale restituiscono un Boolean risultato che indica se
l'espressione specificata restituisce o meno True . Quando si applicano > gli < operatori e alle stringhe, il
confronto viene eseguito usando il normale ordinamento alfabetico delle stringhe. Questo ordine può dipendere
dalle impostazioni locali. Indica se l'ordinamento fa distinzione tra maiuscole e minuscole o non dipende
dall'impostazione Option Compare .

Dim x As testClass
Dim y As New testClass()
x = y
If x Is y Then
' Insert code to run if x and y point to the same instance.
End If

Nell'esempio precedente, il primo confronto restituisce False e i restanti confronti restituiscono True .

Vedi anche
InvalidCastException
= (Operatore)
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Risoluzione dei problemi relativi ai tipi di dati
Comparison Operators in Visual Basic
Operatori di confronto (Visual Basic)
05/03/2021 • 9 minutes to read • Edit Online

Di seguito sono riportati gli operatori di confronto definiti in Visual Basic.


< operatore
<= operatore
> operatore
>= operatore
= operatore
<> operatore
Operatore Is
Operatore IsNot
Operatore Like
Questi operatori confrontano due espressioni per determinare se sono uguali e, in caso contrario, come si
differenziano. Is , IsNot e Like vengono descritti in dettaglio nelle pagine della guida separate. Gli operatori
di confronto relazionali vengono descritti in dettaglio in questa pagina.

Sintassi
result = expression1 comparisonoperator expression2
result = object1 [Is | IsNot] object2
result = string Like pattern

Parti
result
Obbligatorio. Boolean Valore che rappresenta il risultato del confronto.
expression1 , expression2
Obbligatorio. Qualsiasi espressione.
comparisonoperator
Obbligatorio. Qualsiasi operatore di confronto relazionale.
object1 , object2
Obbligatorio. Qualsiasi nome di oggetto di riferimento.
string
Obbligatorio. Qualsiasi espressione String .
pattern
Obbligatorio. Qualsiasi String espressione o intervallo di caratteri.
Commenti
La tabella seguente contiene un elenco degli operatori di confronto relazionale e le condizioni che determinano
se result è True o False .

O P ERATO RE TRUE SE FALSE SE

< (Minore di) expression1 < expression2 expression1 >= expression2

<= (Minore o uguale a) expression1 <= expression2 expression1 > expression2

> (Maggiore di) expression1 > expression2 expression1 <= expression2

>= (Maggiore o uguale a) expression1 >= expression2 expression1 < expression2

= (Uguale a) expression1 = expression2 expression1 <> expression2

<> (Diverso da) expression1 <> expression2 expression1 = expression2

NOTE
L' operatore = viene utilizzato anche come operatore di assegnazione.

L'operatore Is , l'operatore IsNot e l' Like operatore hanno funzionalità di confronto specifiche che
differiscono dagli operatori della tabella precedente.

Confronto di numeri
Quando si confronta un'espressione di tipo Single con una di tipo Double , l' Single espressione viene
convertita in Double . Questo comportamento è opposto al comportamento trovato nella Visual Basic 6.
Analogamente, quando si confronta un'espressione di tipo Decimal con un'espressione di tipo Single o
Double , l' Decimal espressione viene convertita in Single o Double . Per Decimal le espressioni, qualsiasi
valore frazionario minore di 1E-28 potrebbe andare perduto. Tale perdita di valori frazionari può causare il
confronto di due valori come uguali quando non lo sono. Per questo motivo, è necessario prestare attenzione
quando si usa l'uguaglianza ( = ) per confrontare due variabili a virgola mobile. È più sicuro verificare se il
valore assoluto della differenza tra i due numeri è inferiore a una piccola tolleranza accettabile.
Imprecisione a virgola mobile
Quando si utilizzano numeri a virgola mobile, tenere presente che non sempre hanno una rappresentazione
precisa in memoria. Questo può causare risultati imprevisti di determinate operazioni, ad esempio il confronto
dei valori e l' operatore mod. Per ulteriori informazioni, vedere risoluzione dei problemirelativi ai tipi di dati.

Confronto di stringhe
Quando si confrontano le stringhe, le espressioni stringa vengono valutate in base al relativo ordinamento
alfabetico, che dipende dall' Option Compare impostazione.
Option Compare Binary basa i confronti tra stringhe in base a un ordinamento derivato dalle rappresentazioni
binarie interne dei caratteri. Il tipo di ordinamento è determinato dalla tabella codici. Nell'esempio seguente
viene illustrato un tipico ordinamento binario.
A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø
Option Compare Text basa i confronti tra stringhe in base a un ordinamento testuale senza distinzione tra
maiuscole e minuscole determinato dalle impostazioni locali dell'applicazione. Quando si impostano
Option Compare Text e ordinano i caratteri nell'esempio precedente, viene applicato l'ordinamento del testo
seguente:
(A=a) < (À= à) < (B=b) < (E=e) < (Ê= ê) < (Ø = ø) < (Z=z)

Dipendenza dalle impostazioni locali


Quando si imposta Option Compare Text , il risultato di un confronto tra stringhe può dipendere dalle
impostazioni locali in cui l'applicazione è in esecuzione. Due caratteri possono essere paragonati come uguali in
un'unica impostazione locale ma non in un'altra. Se si utilizza un confronto tra stringhe per prendere decisioni
importanti, ad esempio se si desidera accettare un tentativo di accesso, è necessario ricevere un avviso per la
riservatezza delle impostazioni locali. Prendere in considerazione Option Compare Binary l'impostazione o la
chiamata di StrComp , che prende in considerazione le impostazioni locali.

Programmazione senza tipo con operatori di confronto relazionali


L'utilizzo di operatori di confronto relazionali con Object espressioni non è consentito in Option Strict On .
Quando Option Strict è Off e expression1 o expression2 è un' Object espressione, i tipi in fase di
esecuzione determinano il modo in cui vengono confrontati. Nella tabella seguente viene illustrata la modalità di
confronto delle espressioni e il risultato del confronto, a seconda del tipo di runtime degli operandi.

SE GL I O P ERA N DI SO N O IL C O N F RO N TO È

Sia String Confronto di ordinamento basato sulle caratteristiche di


ordinamento delle stringhe.

Entrambi numerici Oggetti convertiti in Double , confronto numerico.

Uno numerico e uno String String Viene convertito in un oggetto Double e il


confronto numerico viene eseguito. Se String non è
possibile convertire in Double , InvalidCastException viene
generata un'eccezione.

Uno o entrambi sono tipi di riferimento diversi da String Viene generato un tipo InvalidCastException.

I confronti numerici considerano Nothing come 0. I confronti di stringhe considerano Nothing come "" (una
stringa vuota).

Overload
Operatori di confronto relazionale ( < . <= , > , >= , = , <> ) può essere sottoposto a Overload, il che
significa che una classe o una struttura può ridefinire il comportamento quando un operando ha il tipo della
classe o della struttura. Se il codice usa uno di questi operatori in una classe o una struttura di questo tipo,
assicurarsi di comprendere il comportamento ridefinito. Per altre informazioni, vedere Operator Procedures.
Si noti che è possibile eseguire l'overload dell' operatore = solo come operatore di confronto relazionale, non
come operatore di assegnazione.

Esempio
Nell'esempio seguente vengono illustrati diversi utilizzi degli operatori di confronto relazionali, utilizzati per
confrontare le espressioni. Gli operatori di confronto relazionale restituiscono un Boolean risultato che indica se
l'espressione specificata restituisce o meno True . Quando si applicano > gli < operatori e alle stringhe, il
confronto viene eseguito usando il normale ordinamento alfabetico delle stringhe. Questo ordine può dipendere
dalle impostazioni locali. Indica se l'ordinamento fa distinzione tra maiuscole e minuscole o non dipende
dall'impostazione Option Compare .

Dim x As testClass
Dim y As New testClass()
x = y
If x Is y Then
' Insert code to run if x and y point to the same instance.
End If

Nell'esempio precedente, il primo confronto restituisce False e i restanti confronti restituiscono True .

Vedi anche
InvalidCastException
= (Operatore)
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Risoluzione dei problemi relativi ai tipi di dati
Comparison Operators in Visual Basic
Operatori di confronto (Visual Basic)
05/03/2021 • 9 minutes to read • Edit Online

Di seguito sono riportati gli operatori di confronto definiti in Visual Basic.


< operatore
<= operatore
> operatore
>= operatore
= operatore
<> operatore
Operatore Is
Operatore IsNot
Operatore Like
Questi operatori confrontano due espressioni per determinare se sono uguali e, in caso contrario, come si
differenziano. Is , IsNot e Like vengono descritti in dettaglio nelle pagine della guida separate. Gli operatori
di confronto relazionali vengono descritti in dettaglio in questa pagina.

Sintassi
result = expression1 comparisonoperator expression2
result = object1 [Is | IsNot] object2
result = string Like pattern

Parti
result
Obbligatorio. Boolean Valore che rappresenta il risultato del confronto.
expression1 , expression2
Obbligatorio. Qualsiasi espressione.
comparisonoperator
Obbligatorio. Qualsiasi operatore di confronto relazionale.
object1 , object2
Obbligatorio. Qualsiasi nome di oggetto di riferimento.
string
Obbligatorio. Qualsiasi espressione String .
pattern
Obbligatorio. Qualsiasi String espressione o intervallo di caratteri.
Commenti
La tabella seguente contiene un elenco degli operatori di confronto relazionale e le condizioni che determinano
se result è True o False .

O P ERATO RE TRUE SE FALSE SE

< (Minore di) expression1 < expression2 expression1 >= expression2

<= (Minore o uguale a) expression1 <= expression2 expression1 > expression2

> (Maggiore di) expression1 > expression2 expression1 <= expression2

>= (Maggiore o uguale a) expression1 >= expression2 expression1 < expression2

= (Uguale a) expression1 = expression2 expression1 <> expression2

<> (Diverso da) expression1 <> expression2 expression1 = expression2

NOTE
L' operatore = viene utilizzato anche come operatore di assegnazione.

L'operatore Is , l'operatore IsNot e l' Like operatore hanno funzionalità di confronto specifiche che
differiscono dagli operatori della tabella precedente.

Confronto di numeri
Quando si confronta un'espressione di tipo Single con una di tipo Double , l' Single espressione viene
convertita in Double . Questo comportamento è opposto al comportamento trovato nella Visual Basic 6.
Analogamente, quando si confronta un'espressione di tipo Decimal con un'espressione di tipo Single o
Double , l' Decimal espressione viene convertita in Single o Double . Per Decimal le espressioni, qualsiasi
valore frazionario minore di 1E-28 potrebbe andare perduto. Tale perdita di valori frazionari può causare il
confronto di due valori come uguali quando non lo sono. Per questo motivo, è necessario prestare attenzione
quando si usa l'uguaglianza ( = ) per confrontare due variabili a virgola mobile. È più sicuro verificare se il
valore assoluto della differenza tra i due numeri è inferiore a una piccola tolleranza accettabile.
Imprecisione a virgola mobile
Quando si utilizzano numeri a virgola mobile, tenere presente che non sempre hanno una rappresentazione
precisa in memoria. Questo può causare risultati imprevisti di determinate operazioni, ad esempio il confronto
dei valori e l' operatore mod. Per ulteriori informazioni, vedere risoluzione dei problemirelativi ai tipi di dati.

Confronto di stringhe
Quando si confrontano le stringhe, le espressioni stringa vengono valutate in base al relativo ordinamento
alfabetico, che dipende dall' Option Compare impostazione.
Option Compare Binary basa i confronti tra stringhe in base a un ordinamento derivato dalle rappresentazioni
binarie interne dei caratteri. Il tipo di ordinamento è determinato dalla tabella codici. Nell'esempio seguente
viene illustrato un tipico ordinamento binario.
A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø
Option Compare Text basa i confronti tra stringhe in base a un ordinamento testuale senza distinzione tra
maiuscole e minuscole determinato dalle impostazioni locali dell'applicazione. Quando si impostano
Option Compare Text e ordinano i caratteri nell'esempio precedente, viene applicato l'ordinamento del testo
seguente:
(A=a) < (À= à) < (B=b) < (E=e) < (Ê= ê) < (Ø = ø) < (Z=z)

Dipendenza dalle impostazioni locali


Quando si imposta Option Compare Text , il risultato di un confronto tra stringhe può dipendere dalle
impostazioni locali in cui l'applicazione è in esecuzione. Due caratteri possono essere paragonati come uguali in
un'unica impostazione locale ma non in un'altra. Se si utilizza un confronto tra stringhe per prendere decisioni
importanti, ad esempio se si desidera accettare un tentativo di accesso, è necessario ricevere un avviso per la
riservatezza delle impostazioni locali. Prendere in considerazione Option Compare Binary l'impostazione o la
chiamata di StrComp , che prende in considerazione le impostazioni locali.

Programmazione senza tipo con operatori di confronto relazionali


L'utilizzo di operatori di confronto relazionali con Object espressioni non è consentito in Option Strict On .
Quando Option Strict è Off e expression1 o expression2 è un' Object espressione, i tipi in fase di
esecuzione determinano il modo in cui vengono confrontati. Nella tabella seguente viene illustrata la modalità di
confronto delle espressioni e il risultato del confronto, a seconda del tipo di runtime degli operandi.

SE GL I O P ERA N DI SO N O IL C O N F RO N TO È

Sia String Confronto di ordinamento basato sulle caratteristiche di


ordinamento delle stringhe.

Entrambi numerici Oggetti convertiti in Double , confronto numerico.

Uno numerico e uno String String Viene convertito in un oggetto Double e il


confronto numerico viene eseguito. Se String non è
possibile convertire in Double , InvalidCastException viene
generata un'eccezione.

Uno o entrambi sono tipi di riferimento diversi da String Viene generato un tipo InvalidCastException.

I confronti numerici considerano Nothing come 0. I confronti di stringhe considerano Nothing come "" (una
stringa vuota).

Overload
Operatori di confronto relazionale ( < . <= , > , >= , = , <> ) può essere sottoposto a Overload, il che
significa che una classe o una struttura può ridefinire il comportamento quando un operando ha il tipo della
classe o della struttura. Se il codice usa uno di questi operatori in una classe o una struttura di questo tipo,
assicurarsi di comprendere il comportamento ridefinito. Per altre informazioni, vedere Operator Procedures.
Si noti che è possibile eseguire l'overload dell' operatore = solo come operatore di confronto relazionale, non
come operatore di assegnazione.

Esempio
Nell'esempio seguente vengono illustrati diversi utilizzi degli operatori di confronto relazionali, utilizzati per
confrontare le espressioni. Gli operatori di confronto relazionale restituiscono un Boolean risultato che indica se
l'espressione specificata restituisce o meno True . Quando si applicano > gli < operatori e alle stringhe, il
confronto viene eseguito usando il normale ordinamento alfabetico delle stringhe. Questo ordine può dipendere
dalle impostazioni locali. Indica se l'ordinamento fa distinzione tra maiuscole e minuscole o non dipende
dall'impostazione Option Compare .

Dim x As testClass
Dim y As New testClass()
x = y
If x Is y Then
' Insert code to run if x and y point to the same instance.
End If

Nell'esempio precedente, il primo confronto restituisce False e i restanti confronti restituiscono True .

Vedi anche
InvalidCastException
= (Operatore)
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Risoluzione dei problemi relativi ai tipi di dati
Comparison Operators in Visual Basic
<< Operatore (Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

Esegue uno scorrimento a sinistra aritmetico in uno schema di bit.

Sintassi
result = pattern << amount

Parti
result
Obbligatorio. Valore numerico integrale. Risultato dello spostamento dello schema di bit. Il tipo di dati
corrisponde a quello di pattern .
pattern
Obbligatorio. Espressione numerica integrale. Schema di bit da spostare. Il tipo di dati deve essere integrale (
SByte , Byte , Short , UShort , Integer , UInteger , Long o ULong ).

amount
Obbligatorio. Espressione numerica. Numero di bit per spostare lo schema di bit. Il tipo di dati deve essere
Integer o ampliato a Integer .

Commenti
I turni aritmetici non sono circolari, il che significa che i bit spostati da un'estremità del risultato non vengono
reintrodotti nell'altra estremità. In uno scorrimento a sinistra aritmetico, i bit spostati oltre l'intervallo del tipo di
dati del risultato vengono rimossi e le posizioni dei bit sgomberate a destra vengono impostate su zero.
Per evitare uno spostamento di più bit rispetto al risultato, Visual Basic maschera il valore di amount con una
maschera di dimensioni che corrisponde al tipo di dati di pattern . Il file binario e di questi valori viene
utilizzato per l'importo dello spostamento. Le maschere delle dimensioni sono le seguenti:

M A SC H ERA DIM EN SIO N I


T IP O DI DAT I DI PATTERN M A SC H ERA DIM EN SIO N I ( DEC IM A L E) ( ESA DEC IM A L E)

SByte , Byte 7 &H00000007

Short , UShort 15 &H0000000F

Integer , UInteger 31 &H0000001F

Long , ULong 63 &H0000003F

Se amount è zero, il valore di result è identico al valore di pattern . Se amount è negativo, viene considerato
come un valore senza segno e mascherato con la maschera di dimensioni appropriata.
I turni aritmetici non generano mai eccezioni di overflow.
NOTE
L' << operatore può essere sottoposto a Overload, il che significa che una classe o una struttura può ridefinire il
comportamento quando un operando ha il tipo della classe o della struttura. Se il codice usa questo operatore su una
classe o una struttura di questo tipo, assicurarsi di comprendere il comportamento ridefinito. Per altre informazioni,
vedere Operator Procedures.

Esempio
Nell'esempio seguente viene utilizzato l' << operatore per eseguire turni aritmetici a sinistra sui valori integrali.
Il risultato ha sempre lo stesso tipo di dati dell'espressione spostata.

Dim pattern As Short = 192


' The bit pattern is 0000 0000 1100 0000.
Dim result1, result2, result3, result4, result5 As Short
result1 = pattern << 0
result2 = pattern << 4
result3 = pattern << 9
result4 = pattern << 17
result5 = pattern << -1

I risultati dell'esempio precedente sono i seguenti:


result1 è 192 (0000 0000 1100 0000).
result2 è 3072 (0000 1100 0000 0000).
result3 is-32768 (1000 0000 0000 0000).
result4 è 384 (0000 0001 1000 0000).
result5 è 0 (spostato di 15 posizioni a sinistra).
Il valore Shift per result4 viene calcolato come 17 e 15, che è uguale a 1.

Vedi anche
Operatori di spostamento bit
Operatori di assegnazione
Operatore<<=
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Operatori aritmetici in Visual Basic
<<Operatore = (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Esegue uno scorrimento a sinistra aritmetico sul valore di una variabile o di una proprietà e assegna il risultato
alla variabile o alla proprietà.

Sintassi
variableorproperty <<= amount

Parti
variableorproperty
Obbligatorio. Variabile o proprietà di un tipo integrale ( SByte , Byte , Short , UShort , Integer , UInteger ,
Long o ULong ).

amount
Obbligatorio. Espressione numerica di un tipo di dati che viene ampliato a Integer .

Commenti
L'elemento sul lato sinistro dell' <<= operatore può essere una variabile scalare semplice, una proprietà o un
elemento di una matrice. La variabile o la proprietà non può essere di sola lettura.
L' <<= operatore esegue prima uno spostamento aritmetico a sinistra sul valore della variabile o della
proprietà. L'operatore assegna quindi il risultato dell'operazione alla variabile o alla proprietà.
I turni aritmetici non sono circolari, il che significa che i bit spostati da un'estremità del risultato non vengono
reintrodotti nell'altra estremità. In uno scorrimento a sinistra aritmetico, i bit spostati oltre l'intervallo del tipo di
dati del risultato vengono rimossi e le posizioni dei bit sgomberate a destra vengono impostate su zero.

Overload
L' operatore<< può essere sottoposto a Overload, il che significa che una classe o una struttura può ridefinire il
comportamento quando un operando ha il tipo della classe o della struttura. L'overload dell' << operatore
influiscono sul comportamento dell' <<= operatore. Se il codice usa <<= su una classe o una struttura che
esegue l'overload di << , assicurarsi di comprendere il comportamento ridefinito. Per altre informazioni, vedere
Operator Procedures.

Esempio
Nell'esempio seguente viene usato l' <<= operatore per spostare lo schema di bit di una Integer variabile a
sinistra della quantità specificata e assegnare il risultato alla variabile.

Dim var As Integer = 10


Dim shift As Integer = 3
var <<= shift
' The value of var is now 80.
Vedi anche
Operatore<<
Operatori di assegnazione
Operatori di spostamento bit
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Istruzioni
Operatore >> (Visual Basic)
05/03/2021 • 5 minutes to read • Edit Online

Esegue uno spostamento a destra aritmetico in uno schema di bit.

Sintassi
result = pattern >> amount

Parti
result
Obbligatorio. Valore numerico integrale. Risultato dello spostamento dello schema di bit. Il tipo di dati
corrisponde a quello di pattern .
pattern
Obbligatorio. Espressione numerica integrale. Schema di bit da spostare. Il tipo di dati deve essere integrale (
SByte , Byte , Short , UShort , Integer , UInteger , Long o ULong ).

amount
Obbligatorio. Espressione numerica. Numero di bit per spostare lo schema di bit. Il tipo di dati deve essere
Integer o ampliato a Integer .

Commenti
I turni aritmetici non sono circolari, il che significa che i bit spostati da un'estremità del risultato non vengono
reintrodotti nell'altra estremità. In uno spostamento a destra aritmetico i bit spostati oltre la posizione del bit più
a destra vengono eliminati e il bit più a sinistra (segno) viene propagato nelle posizioni dei bit sgomberate a
sinistra. Ciò significa che se pattern ha un valore negativo, le posizioni sgomberate sono impostate su una. in
caso contrario, vengono impostate su zero.
Si noti che i tipi Byte di dati,, UShort UInteger e ULong sono senza segno, quindi non esiste alcun bit di segno
da propagare. Se pattern è di un tipo senza segno, le posizioni sgomberate vengono sempre impostate su
zero.
Per impedire lo spostamento di più bit rispetto al risultato, Visual Basic maschera il valore di amount con una
maschera di dimensioni corrispondente al tipo di dati di pattern . Il file binario e di questi valori viene utilizzato
per l'importo dello spostamento. Le maschere delle dimensioni sono le seguenti:

M A SC H ERA DIM EN SIO N I


T IP O DI DAT I DI PATTERN M A SC H ERA DIM EN SIO N I ( DEC IM A L E) ( ESA DEC IM A L E)

SByte , Byte 7 &H00000007

Short , UShort 15 &H0000000F

Integer , UInteger 31 &H0000001F

Long , ULong 63 &H0000003F


Se amount è zero, il valore di result è identico al valore di pattern . Se amount è negativo, viene considerato
come un valore senza segno e mascherato con la maschera di dimensioni appropriata.
I turni aritmetici non generano mai eccezioni di overflow.

Overload
L' >> operatore può essere sottoposto a Overload, il che significa che una classe o una struttura può ridefinire il
comportamento quando un operando ha il tipo della classe o della struttura. Se il codice usa questo operatore
su una classe o una struttura di questo tipo, assicurarsi di comprendere il comportamento ridefinito. Per altre
informazioni, vedere Operator Procedures.

Esempio
Nell'esempio seguente viene usato l' >> operatore per eseguire turni aritmetici a destra su valori integrali. Il
risultato ha sempre lo stesso tipo di dati dell'espressione spostata.

Dim pattern As Short = 2560


' The bit pattern is 0000 1010 0000 0000.
Dim result1, result2, result3, result4, result5 As Short
result1 = pattern >> 0
result2 = pattern >> 4
result3 = pattern >> 10
result4 = pattern >> 18
result5 = pattern >> -1

I risultati dell'esempio precedente sono i seguenti:


result1 è 2560 (0000 1010 0000 0000).
result2 è 160 (0000 0000 1010 0000).
result3 è 2 (0000 0000 0000 0010).
result4 è 640 (0000 0010 1000 0000).
result5 è 0 (spostato di 15 posizioni a destra).

Il valore Shift per result4 viene calcolato come 18 e 15, che è uguale a 2.
Nell'esempio seguente vengono illustrati i turni aritmetici su un valore negativo.

Dim negPattern As Short = -8192


' The bit pattern is 1110 0000 0000 0000.
Dim negResult1, negResult2 As Short
negResult1 = negPattern >> 4
negResult2 = negPattern >> 13

I risultati dell'esempio precedente sono i seguenti:


negresult1 is-512 (1111 1110 0000 0000).
negresult2 è-1 (il bit di segno viene propagato).

Vedi anche
Operatori di spostamento bit
Operatori di assegnazione
Operatore>>=
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Operatori aritmetici in Visual Basic
Operatore >>= (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Esegue uno spostamento a destra aritmetico sul valore di una variabile o di una proprietà e assegna il risultato
alla variabile o alla proprietà.

Sintassi
variableorproperty >>= amount

Parti
variableorproperty
Obbligatorio. Variabile o proprietà di un tipo integrale ( SByte , Byte , Short , UShort , Integer , UInteger ,
Long o ULong ).

amount
Obbligatorio. Espressione numerica di un tipo di dati che viene ampliato a Integer .

Commenti
L'elemento sul lato sinistro dell' >>= operatore può essere una variabile scalare semplice, una proprietà o un
elemento di una matrice. La variabile o la proprietà non può essere di sola lettura.
L' >>= operatore esegue prima di tutto un spostamento a destra aritmetico sul valore della variabile o della
proprietà. L'operatore assegna quindi il risultato dell'operazione alla variabile o alla proprietà.
I turni aritmetici non sono circolari, il che significa che i bit spostati da un'estremità del risultato non vengono
reintrodotti nell'altra estremità. In uno spostamento a destra aritmetico i bit spostati oltre la posizione del bit più
a destra vengono eliminati e il bit più a sinistra viene propagato nelle posizioni dei bit sgomberate a sinistra. Ciò
significa che se variableorproperty ha un valore negativo, le posizioni sgomberate sono impostate su uno. Se
variableorproperty è positivo o se il tipo di dati è un tipo senza segno, le posizioni sgomberate vengono
impostate su zero.

Overload
L' operatore>> può essere sottoposto a Overload, il che significa che una classe o una struttura può ridefinire il
comportamento quando un operando ha il tipo della classe o della struttura. L'overload dell' >> operatore
influiscono sul comportamento dell' >>= operatore. Se il codice usa >>= su una classe o una struttura che
esegue l'overload di >> , assicurarsi di comprendere il comportamento ridefinito. Per altre informazioni, vedere
Operator Procedures.

Esempio
Nell'esempio seguente viene usato l' >>= operatore per spostare lo schema di bit di una Integer variabile a
destra della quantità specificata e assegnare il risultato alla variabile.
Dim var As Integer = 10
Dim shift As Integer = 2
var >>= shift
' The value of var is now 2 (two bits were lost off the right end).

Vedi anche
Operatore>>
Operatori di assegnazione
Operatori di spostamento bit
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Istruzioni
Operatore / (Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

Divide due numeri e restituisce un risultato a virgola mobile.

Sintassi
expression1 / expression2

Parti
expression1
Obbligatorio. Qualsiasi espressione numerica.
expression2
Obbligatorio. Qualsiasi espressione numerica.

Tipi supportati
Tutti i tipi numerici, inclusi i tipi senza segno e a virgola mobile e Decimal .

Risultato
Il risultato è il quoziente completo di expression1 diviso per expression2 , incluso qualsiasi resto.
L' operatore \ (Visual Basic) restituisce il quoziente integer, che elimina il resto.

Commenti
Il tipo di dati del risultato dipende dai tipi degli operandi. Nella tabella seguente viene illustrato il modo in cui
viene determinato il tipo di dati del risultato.

T IP I DI DAT I DEGL I O P ERA N DI T IP O DI DAT I RESULT

Entrambe le espressioni sono tipi di dati integrali (SByte, Double


byte, short, ushort, Integer, UInteger, Long, ULONG)

Un'espressione è un tipo di dati singolo e l'altra non è un Single


valore Double

Un'espressione è un tipo di dati Decimal e l'altra non è una Decimal


singola o una doppia

Expression è un tipo di dati Double Double

Prima di eseguire la divisione, le espressioni numeriche integrali vengono ampliate a Double . Se il risultato
viene assegnato a un tipo di dati integrale, Visual Basic tenta di convertire il risultato da Double a tale tipo.
Questa operazione può generare un'eccezione se il risultato non rientra in tale tipo. In particolare, vedere
"tentativo di divisione per zero" in questa pagina della guida.
Se expression1 o expression2 restituisce Nothing, viene considerato come zero.

Tentativo di divisione per zero


Se expression2 restituisce zero, l' / operatore si comporta in modo diverso per i diversi tipi di dati degli
operandi. La tabella seguente illustra i possibili comportamenti.

T IP I DI DAT I DEGL I O P ERA N DI C O M P O RTA M EN TO SE EXPRESSION2 È Z ERO

Virgola mobile ( Single o Double ) Restituisce l'infinito ( PositiveInfinity o NegativeInfinity ) o


NaN (non un numero) se expression1 è anche zero

Decimal Genera DivideByZeroException

Integrale (con segno o senza segno) Il tentativo di conversione nel tipo integrale genera
un'eccezione OverflowException perché i tipi integrali non
accettano PositiveInfinity , NegativeInfinity o NaN

NOTE
L' / operatore può essere sottoposto a Overload, il che significa che una classe o una struttura può ridefinire il
comportamento quando un operando ha il tipo della classe o della struttura. Se il codice usa questo operatore su una
classe o una struttura di questo tipo, assicurarsi di comprendere il comportamento ridefinito. Per altre informazioni,
vedere Operator Procedures.

Esempio
Questo esempio usa l' / operatore per eseguire la divisione a virgola mobile. Il risultato è il quoziente dei due
operandi.

Dim resultValue As Double


resultValue = 10 / 4
resultValue = 10 / 3

Le espressioni nell'esempio precedente restituiscono i valori 2,5 e 3,333333. Si noti che il risultato è sempre a
virgola mobile ( Double ), anche se entrambi gli operandi sono costanti integer.

Vedi anche
Operatore/= (Visual Basic)
Operatore \ (Visual Basic)
Tipi di dati dei risultati degli operatori
Operatori aritmetici
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Operatori aritmetici in Visual Basic
Operatore /= (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Divide il valore di una variabile o di una proprietà in base al valore di un'espressione e assegna il risultato a
virgola mobile alla variabile o alla proprietà.

Sintassi
variableorproperty /= expression

Parti
variableorproperty
Obbligatorio. Qualsiasi variabile o proprietà numerica.
expression
Obbligatorio. Qualsiasi espressione numerica.

Commenti
L'elemento sul lato sinistro dell' /= operatore può essere una variabile scalare semplice, una proprietà o un
elemento di una matrice. La variabile o la proprietà non può essere di sola lettura.
L' /= operatore divide prima di tutto il valore della variabile o della proprietà (sul lato sinistro dell'operatore)
per il valore dell'espressione (sul lato destro dell'operatore). L'operatore assegna quindi il risultato a virgola
mobile dell'operazione alla variabile o alla proprietà.
Questa istruzione assegna un Double valore alla variabile o alla proprietà a sinistra. Se Option Strict è On ,
variableorproperty deve essere un Double oggetto. Se Option Strict è Off , Visual Basic esegue una
conversione implicita e assegna il valore risultante a variableorproperty , con un possibile errore in fase di
esecuzione. Per altre informazioni, vedere conversioni verso un tipo di dati più piccolo e istruzioni Option Strict.

Overload
L' operatore/(Visual Basic) può essere sottoposto a Overload, il che significa che una classe o una struttura può
ridefinire il comportamento quando un operando ha il tipo della classe o della struttura. L'overload dell' /
operatore influiscono sul comportamento dell' /= operatore. Se il codice usa /= su una classe o una struttura
che esegue l'overload di / , assicurarsi di comprendere il comportamento ridefinito. Per altre informazioni,
vedere Operator Procedures.

Esempio
Nell'esempio seguente viene usato l' /= operatore per dividere una Integer variabile per secondo e assegnare
il quoziente alla prima variabile.

Dim var1 As Integer = 12


Dim var2 As Integer = 3
var1 /= var2
' The value of var1 is now 4.
Vedi anche
Operatore/(Visual Basic)
\= (Operatore)
Operatori di assegnazione
Operatori aritmetici
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Istruzioni
Operatore \ (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Divide due numeri e restituisce un risultato intero.

Sintassi
expression1 \ expression2

Parti
expression1
Obbligatorio. Qualsiasi espressione numerica.
expression2
Obbligatorio. Qualsiasi espressione numerica.

Tipi supportati
Tutti i tipi numerici, inclusi i tipi senza segno e a virgola mobile e Decimal .

Risultato
Il risultato è il quoziente intero di expression1 diviso per expression2 , che elimina qualsiasi resto e mantiene
solo la parte intera. Questa operazione è nota come troncamento.
Il tipo di dati del risultato è un tipo numerico appropriato per i tipi di dati di expression1 e expression2 . Vedere
le tabelle "aritmetiche di interi" nei tipi di dati dei risultati dell'operatore.
L' operatore/(Visual Basic) restituisce il quoziente completo, che mantiene il resto della parte frazionaria.

Commenti
Prima di eseguire la divisione, Visual Basic tenta di convertire qualsiasi espressione numerica a virgola mobile in
Long . Se Option Strict è On , si verifica un errore del compilatore. Se Option Strict è Off , un
OverflowException è possibile se il valore non è compreso nell'intervallo del tipo di dati Long. La conversione in
Long è anche soggetta all' arrotondamento del banco. Per ulteriori informazioni, vedere "parti frazionarie" nelle
funzioni di conversione dei tipi.
Se expression1 o expression2 restituisce Nothing, viene considerato come zero.

Tentativo di divisione per zero


Se expression2 restituisce zero, l' \ operatore genera un' DivideByZeroException eccezione. Questo vale per
tutti i tipi di dati numerici degli operandi.
NOTE
L' \ operatore può essere sottoposto a Overload, il che significa che una classe o una struttura può ridefinire il
comportamento quando un operando ha il tipo della classe o della struttura. Se il codice usa questo operatore su una
classe o una struttura di questo tipo, assicurarsi di comprendere il comportamento ridefinito. Per altre informazioni,
vedere Operator Procedures.

Esempio
Nell'esempio seguente viene usato l' \ operatore per eseguire la divisione di interi. Il risultato è un numero
intero che rappresenta il quoziente integer dei due operandi, con il resto ignorato.

Dim resultValue As Integer


resultValue = 11 \ 4
resultValue = 9 \ 3
resultValue = 100 \ 3
resultValue = 67 \ -3

Le espressioni nell'esempio precedente restituiscono rispettivamente i valori 2, 3, 33 e-22.

Vedi anche
\= (Operatore)
Operatore/(Visual Basic)
Option Strict Statement
Operatori aritmetici
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Operatori aritmetici in Visual Basic
\= (Operatore)
05/03/2021 • 2 minutes to read • Edit Online

Divide il valore di una variabile o di una proprietà in base al valore di un'espressione e assegna il risultato
Integer alla variabile o alla proprietà.

Sintassi
variableorproperty \= expression

Parti
variableorproperty
Obbligatorio. Qualsiasi variabile o proprietà numerica.
expression
Obbligatorio. Qualsiasi espressione numerica.

Commenti
L'elemento sul lato sinistro dell' \= operatore può essere una variabile scalare semplice, una proprietà o un
elemento di una matrice. La variabile o la proprietà non può essere di sola lettura.
L' \= operatore divide il valore di una variabile o di una proprietà a sinistra del valore a destra e assegna il
risultato Integer alla variabile o alla proprietà a sinistra
Per ulteriori informazioni sulla divisione di interi, vedere \ operator (Visual Basic).

Overload
L' \ operatore può essere sottoposto a Overload, il che significa che una classe o una struttura può ridefinire il
comportamento quando un operando ha il tipo della classe o della struttura. L'overload dell' \ operatore
influiscono sul comportamento dell' \= operatore. Se il codice usa \= su una classe o una struttura che
esegue l'overload di \ , assicurarsi di comprendere il comportamento ridefinito. Per altre informazioni, vedere
Operator Procedures.

Esempio
Nell'esempio seguente viene usato l' \= operatore per dividere una Integer variabile per secondo e assegnare
il risultato Integer alla prima variabile.

Dim var1 As Integer = 10


Dim var2 As Integer = 3
var1 \= var2
' The value of var1 is now 3.

Vedi anche
Operatore \ (Visual Basic)
Operatore/= (Visual Basic)
Operatori di assegnazione
Operatori aritmetici
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Istruzioni
Operatore ^ (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Eleva un numero alla potenza di un altro numero.

Sintassi
number ^ exponent

Parti
number
Obbligatorio. Qualsiasi espressione numerica.
exponent
Obbligatorio. Qualsiasi espressione numerica.

Risultato
Il risultato viene number elevato alla potenza di exponent , sempre come Double valore.

Tipi supportati
Double . Gli operandi di qualsiasi tipo diverso vengono convertiti in Double .

Commenti
Visual Basic esegue sempre l'elevamento a potenza nel tipo di dati Double.
Il valore di exponent può essere frazionario, negativo o entrambi.
Quando in un'unica espressione viene eseguita più di un elevamento a potenza, l' ^ operatore viene valutato in
base a quanto rilevato da sinistra verso destra.

NOTE
L' ^ operatore può essere sottoposto a Overload, il che significa che una classe o una struttura può ridefinire il
comportamento quando un operando ha il tipo della classe o della struttura. Se il codice usa questo operatore su una
classe o una struttura di questo tipo, assicurarsi di comprendere il comportamento ridefinito. Per altre informazioni,
vedere Operator Procedures.

Esempio
Nell'esempio seguente viene usato l' ^ operatore per aumentare un numero alla potenza di un esponente. Il
risultato è il primo operando elevato alla potenza del secondo.
Dim exp1, exp2, exp3, exp4, exp5, exp6 As Double
exp1 = 2 ^ 2
exp2 = 3 ^ 3 ^ 3
exp3 = (-5) ^ 3
exp4 = (-5) ^ 4
exp5 = 8 ^ (1.0 / 3.0)
exp6 = 8 ^ (-1.0 / 3.0)

L'esempio precedente produce i risultati seguenti:


exp1 è impostato su 4 (2 quadrato).
exp2 è impostato su 19683 (3 cubid, quindi il valore Cubed).
exp3 è impostato su-125 (-5 Cubed).
exp4 è impostato su 625 (-5 alla quarta potenza).
exp5 è impostato su 2 (radice cubo di 8).
exp6 è impostato su 0,5 (1,0 diviso per la radice del cubo di 8).
Si noti l'importanza delle parentesi nelle espressioni dell'esempio precedente. A causa della precedenza degli
operatori, Visual Basic esegue normalmente l' ^ operatore prima di qualsiasi altro, anche l'operatore unario –
. Se exp4 e sono exp6 stati calcolati senza parentesi, avrebbero prodotto i risultati seguenti:
exp4 = -5 ^ 4 verrebbe calcolato come – (dal 5 al quarto), il che comporterebbe-625.
verrebbe calcolato come (da 8 a-1 potenza o 0,125) diviso per 3,0, il che comporterebbe
exp6 = 8 ^ -1.0 / 3.0
0.041666666666666666666666666666667.

Vedi anche
^ = (Operatore)
Operatori aritmetici
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Operatori aritmetici in Visual Basic
Operatore ^= (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Genera il valore di una variabile o di una proprietà alla potenza di un'espressione e assegna il risultato alla
variabile o alla proprietà.

Sintassi
variableorproperty ^= expression

Parti
variableorproperty
Obbligatorio. Qualsiasi variabile o proprietà numerica.
expression
Obbligatorio. Qualsiasi espressione numerica.

Commenti
L'elemento sul lato sinistro dell' ^= operatore può essere una variabile scalare semplice, una proprietà o un
elemento di una matrice. La variabile o la proprietà non può essere di sola lettura.
L' ^= operatore eleva prima di tutto il valore della variabile o della proprietà (sul lato sinistro dell'operatore)
alla potenza del valore dell'espressione (sul lato destro dell'operatore). L'operatore assegna quindi il risultato
dell'operazione alla variabile o alla proprietà.
Visual Basic esegue sempre l'elevamento a potenza nel tipo di dati Double. Gli operandi di qualsiasi tipo diverso
vengono convertiti in Double e il risultato è sempre Double .
Il valore di expression può essere frazionario, negativo o entrambi.

Overload
L' operatore ^ può essere sottoposto a Overload, il che significa che una classe o una struttura può ridefinire il
comportamento quando un operando ha il tipo della classe o della struttura. L'overload dell' ^ operatore
influiscono sul comportamento dell' ^= operatore. Se il codice usa ^= su una classe o una struttura che
esegue l'overload di ^ , assicurarsi di comprendere il comportamento ridefinito. Per altre informazioni, vedere
Operator Procedures.

Esempio
Nell'esempio seguente viene usato l' ^= operatore per aumentare il valore di una Integer variabile alla
potenza di una seconda variabile e assegnare il risultato alla prima variabile.

Dim var1 As Integer = 10


Dim var2 As Integer = 3
var1 ^= var2
' The value of var1 is now 1000.
Vedi anche
Operatore ^
Operatori di assegnazione
Operatori aritmetici
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Istruzioni
?. e? () operatori condizionali null (Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

Verifica il valore dell'operando sinistro per null ( Nothing ) prima di eseguire un'operazione di accesso ai
membri ( ?. ) o ?() di indice () Nothing . restituisce se l'operando sinistro restituisce Nothing . Si noti che
nelle espressioni che in genere restituiscono tipi di valore, l'operatore condizionale null restituisce Nullable<T> .
Questi operatori consentono di scrivere meno codice per gestire i controlli null, soprattutto in caso di
decrescente in strutture di dati. Ad esempio:

' Nothing if customers is Nothing


Dim length As Integer? = customers?.Length

' Nothing if customers is Nothing


Dim first As Customer = customers?(0)

' Nothing if customers, the first customer, or Orders is Nothing


Dim count As Integer? = customers?(0)?.Orders?.Count()

Per il confronto, il codice alternativo per la prima di queste espressioni senza un operatore condizionale null è:

Dim length As Integer


If customers IsNot Nothing Then
length = customers.Length
End If

In alcuni casi è necessario eseguire un'azione su un oggetto che può essere null, in base al valore di un membro
booleano su tale oggetto, come la proprietà booleana IsAllowedFreeShipping nell'esempio seguente:

Dim customer = FindCustomerByID(123) 'customer will be Nothing if not found.

If customer IsNot Nothing AndAlso customer.IsAllowedFreeShipping Then


ApplyFreeShippingToOrders(customer)
End If

È possibile abbreviare il codice ed evitare di verificare manualmente la presenza di valori null usando l'operatore
condizionale null come indicato di seguito:

Dim customer = FindCustomerByID(123) 'customer will be Nothing if not found.

If customer?.IsAllowedFreeShipping Then ApplyFreeShippingToOrders(customer)

Gli operatori condizionali Null causano corto circuiti. Se un'operazione in una catena di operazioni di accesso ai
membri condizionali e di indice restituisce Nothing , il resto dell'esecuzione della catena viene arrestato.
Nell'esempio seguente non viene C(E) valutato se A , B o C restituisce Nothing .

A?.B?.C?(E)

Un altro utilizzo per l'accesso ai membri condizionali null consiste nel richiamare i delegati in modo thread-safe
con molto meno codice. Nell'esempio seguente vengono definiti due tipi, NewsBroadcaster e NewsReceiver . Gli
elementi di notizie vengono inviati al destinatario dal NewsBroadcaster.SendNews delegato.

Public Module NewsBroadcaster


Dim SendNews As Action(Of String)

Public Sub Main()


Dim rec As New NewsReceiver()
Dim rec2 As New NewsReceiver()
SendNews?.Invoke("Just in: A newsworthy item...")
End Sub

Public Sub Register(client As Action(Of String))


SendNews = SendNews.Combine({SendNews, client})
End Sub
End Module

Public Class NewsReceiver


Public Sub New()
NewsBroadcaster.Register(AddressOf Me.DisplayNews)
End Sub

Public Sub DisplayNews(newsItem As String)


Console.WriteLine(newsItem)
End Sub
End Class

Se non sono presenti elementi nell' SendNews elenco chiamate, il SendNews delegato genera un'eccezione
NullReferenceException . Prima degli operatori condizionali null, il codice simile al seguente ha assicurato che
l'elenco chiamate del delegato non fosse Nothing :

SendNews = SendNews.Combine({SendNews, client})


If SendNews IsNot Nothing Then
SendNews("Just in...")
End If

Ora tutto è molto più semplice:

SendNews = SendNews.Combine({SendNews, client})


SendNews?.Invoke("Just in...")

Il codice creato in questo modo è thread-safe perché il compilatore genera il codice per valutare SendNews una
sola volta, mantenendo il risultato in una variabile temporanea. È necessario chiamare esplicitamente il metodo
Invoke perché non esiste una sintassi di chiamata dei delegati con condizione Null SendNews?(String) .

Vedi anche
Operatori (Visual Basic)
Guida per programmatori Visual Basic
Riferimenti al linguaggio Visual Basic
?. e? () operatori condizionali null (Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

Verifica il valore dell'operando sinistro per null ( Nothing ) prima di eseguire un'operazione di accesso ai
membri ( ?. ) o ?() di indice () Nothing . restituisce se l'operando sinistro restituisce Nothing . Si noti che
nelle espressioni che in genere restituiscono tipi di valore, l'operatore condizionale null restituisce Nullable<T> .
Questi operatori consentono di scrivere meno codice per gestire i controlli null, soprattutto in caso di
decrescente in strutture di dati. Ad esempio:

' Nothing if customers is Nothing


Dim length As Integer? = customers?.Length

' Nothing if customers is Nothing


Dim first As Customer = customers?(0)

' Nothing if customers, the first customer, or Orders is Nothing


Dim count As Integer? = customers?(0)?.Orders?.Count()

Per il confronto, il codice alternativo per la prima di queste espressioni senza un operatore condizionale null è:

Dim length As Integer


If customers IsNot Nothing Then
length = customers.Length
End If

In alcuni casi è necessario eseguire un'azione su un oggetto che può essere null, in base al valore di un membro
booleano su tale oggetto, come la proprietà booleana IsAllowedFreeShipping nell'esempio seguente:

Dim customer = FindCustomerByID(123) 'customer will be Nothing if not found.

If customer IsNot Nothing AndAlso customer.IsAllowedFreeShipping Then


ApplyFreeShippingToOrders(customer)
End If

È possibile abbreviare il codice ed evitare di verificare manualmente la presenza di valori null usando l'operatore
condizionale null come indicato di seguito:

Dim customer = FindCustomerByID(123) 'customer will be Nothing if not found.

If customer?.IsAllowedFreeShipping Then ApplyFreeShippingToOrders(customer)

Gli operatori condizionali Null causano corto circuiti. Se un'operazione in una catena di operazioni di accesso ai
membri condizionali e di indice restituisce Nothing , il resto dell'esecuzione della catena viene arrestato.
Nell'esempio seguente non viene C(E) valutato se A , B o C restituisce Nothing .

A?.B?.C?(E)

Un altro utilizzo per l'accesso ai membri condizionali null consiste nel richiamare i delegati in modo thread-safe
con molto meno codice. Nell'esempio seguente vengono definiti due tipi, NewsBroadcaster e NewsReceiver . Gli
elementi di notizie vengono inviati al destinatario dal NewsBroadcaster.SendNews delegato.

Public Module NewsBroadcaster


Dim SendNews As Action(Of String)

Public Sub Main()


Dim rec As New NewsReceiver()
Dim rec2 As New NewsReceiver()
SendNews?.Invoke("Just in: A newsworthy item...")
End Sub

Public Sub Register(client As Action(Of String))


SendNews = SendNews.Combine({SendNews, client})
End Sub
End Module

Public Class NewsReceiver


Public Sub New()
NewsBroadcaster.Register(AddressOf Me.DisplayNews)
End Sub

Public Sub DisplayNews(newsItem As String)


Console.WriteLine(newsItem)
End Sub
End Class

Se non sono presenti elementi nell' SendNews elenco chiamate, il SendNews delegato genera un'eccezione
NullReferenceException . Prima degli operatori condizionali null, il codice simile al seguente ha assicurato che
l'elenco chiamate del delegato non fosse Nothing :

SendNews = SendNews.Combine({SendNews, client})


If SendNews IsNot Nothing Then
SendNews("Just in...")
End If

Ora tutto è molto più semplice:

SendNews = SendNews.Combine({SendNews, client})


SendNews?.Invoke("Just in...")

Il codice creato in questo modo è thread-safe perché il compilatore genera il codice per valutare SendNews una
sola volta, mantenendo il risultato in una variabile temporanea. È necessario chiamare esplicitamente il metodo
Invoke perché non esiste una sintassi di chiamata dei delegati con condizione Null SendNews?(String) .

Vedi anche
Operatori (Visual Basic)
Guida per programmatori Visual Basic
Riferimenti al linguaggio Visual Basic
Operatore AddressOf (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Crea un'istanza di delegato che fa riferimento alla procedura specifica.

Sintassi
AddressOf procedurename

Parti
procedurename
Obbligatorio. Specifica la procedura a cui fa riferimento il delegato appena creato.

Commenti
L' AddressOf operatore crea un delegato che punta alla subroutine o alla funzione specificata da procedurename
. Quando la procedura specificata è un metodo di istanza, il delegato fa riferimento sia all'istanza sia al metodo.
Quindi, quando viene richiamato il delegato, viene chiamato il metodo specificato dell'istanza specificata.
L' AddressOf operatore può essere usato come operando di un costruttore di delegato o può essere usato in un
contesto in cui il tipo del delegato può essere determinato dal compilatore.

Esempio
In questo esempio viene usato l' AddressOf operatore per designare un delegato per gestire l' Click evento di
un pulsante.

' Add the following line to Sub Form1_Load().


AddHandler Button1.Click, AddressOf Button1_Click

Esempio
Nell'esempio seguente viene usato l' AddressOf operatore per designare la funzione di avvio per un thread.

Public Sub CountSheep()


Dim i As Integer = 1 ' Sheep do not count from 0.
Do While (True) ' Endless loop.
Console.WriteLine("Sheep " & i & " Baah")
i = i + 1
System.Threading.Thread.Sleep(1000) 'Wait 1 second.
Loop
End Sub

Sub UseThread()
Dim t As New System.Threading.Thread(AddressOf CountSheep)
t.Start()
End Sub
Vedi anche
Declare Statement
Istruzione Function
Istruzione Sub
Delegati
Operatore And (Visual Basic)
05/03/2021 • 5 minutes to read • Edit Online

Esegue una congiunzione logica di due Boolean espressioni o una congiunzione bit per bit di due espressioni
numeriche.

Sintassi
result = expression1 And expression2

Parti
result
Obbligatorio. Qualsiasi espressione Boolean o numerica. Per il confronto booleano, result è la congiunzione
logica di due Boolean valori. Per le operazioni bit per bit, result è un valore numerico che rappresenta la
combinazione bit per bit di due schemi di bit numerici.
expression1
Obbligatorio. Qualsiasi espressione Boolean o numerica.
expression2
Obbligatorio. Qualsiasi espressione Boolean o numerica.

Commenti
Per il confronto booleano, result è True se e solo se expression1 e expression2 restituiscono True . Nella
tabella seguente viene illustrato come result determinare.

SE EXPRESSION1 È E EXPRESSION2 È IL VA LO RE DI RESULT È

True True True

True False False

False True False

False False False

NOTE
In un confronto booleano, l' And operatore valuta sempre entrambe le espressioni, che possono includere l'esecuzione di
chiamate di routine. L' operatore AndAlso esegue un corto circuito, il che significa che se expression1 è False ,
expression2 non viene valutato.

Quando viene applicato a valori numerici, l' And operatore esegue un confronto bit per bit dei bit posizionati in
modo identico in due espressioni numeriche e imposta il bit corrispondente in in result base alla tabella
seguente.
SE IL B IT IN EXPRESSION1 È E B IT IN EXPRESSION2 È IL B IT IN RESULT È

1 1 1

1 0 0

0 1 0

0 0 0

NOTE
Poiché gli operatori logici e bit per bit hanno una precedenza inferiore rispetto ad altri operatori aritmetici e relazionali,
qualsiasi operazione bit per bit deve essere racchiusa tra parentesi per garantire risultati accurati.

Tipi di dati
Se gli operandi sono costituiti da un'espressione e da un' Boolean espressione numerica, Visual Basic converte
l' Boolean espressione in un valore numerico (-1 per True e 0 per False ) ed esegue un'operazione bit per bit.
Per un confronto booleano, il tipo di dati del risultato è Boolean . Per un confronto bit per bit, il tipo di dati result
è un tipo numerico appropriato per i tipi di dati di expression1 e expression2 . Vedere la tabella "confronto
relazionale e bit per bit" in tipi di dati dei risultati dell'operatore.

NOTE
L' And operatore può essere sottoposto a Overload, il che significa che una classe o una struttura può ridefinire il
comportamento quando un operando ha il tipo della classe o della struttura. Se il codice usa questo operatore su una
classe o una struttura di questo tipo, assicurarsi di comprendere il comportamento ridefinito. Per altre informazioni,
vedere Operator Procedures.

Esempio
Nell'esempio seguente viene utilizzato l' And operatore per eseguire una congiunzione logica di due
espressioni. Il risultato è un Boolean valore che indica se entrambe le espressioni sono True .

Dim a As Integer = 10
Dim b As Integer = 8
Dim c As Integer = 6
Dim firstCheck, secondCheck As Boolean
firstCheck = a > b And b > c
secondCheck = b > a And b > c

Nell'esempio precedente vengono restituiti i risultati di True e False , rispettivamente.

Esempio
Nell'esempio seguente viene usato l' And operatore per eseguire congiunzioni logiche sui singoli bit di due
espressioni numeriche. Il bit nel modello di risultato viene impostato se i bit corrispondenti negli operandi sono
entrambi impostati su 1.
Dim a As Integer = 10
Dim b As Integer = 8
Dim c As Integer = 6
Dim firstPattern, secondPattern, thirdPattern As Integer
firstPattern = (a And b)
secondPattern = (a And c)
thirdPattern = (b And c)

Nell'esempio precedente vengono prodotti rispettivamente i risultati 8, 2 e 0.

Vedi anche
Operatori logici e bit per bit (Visual Basic)
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Operatore AndAlso
Operatori logici e bit per bit in Visual Basic
Operatore AndAlso (Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

Esegue una congiunzione logica di corto circuito su due espressioni.

Sintassi
result = expression1 AndAlso expression2

Parti
T ERM IN E DEF IN IZ IO N E

result Obbligatorio. Qualsiasi espressione Boolean . Il risultato è il


Boolean risultato del confronto delle due espressioni.

expression1 Obbligatorio. Qualsiasi espressione Boolean .

expression2 Obbligatorio. Qualsiasi espressione Boolean .

Commenti
Un'operazione logica viene detta corto circuito se il codice compilato può ignorare la valutazione di
un'espressione a seconda del risultato di un'altra espressione. Se il risultato della prima espressione valutata
determina il risultato finale dell'operazione, non è necessario valutare la seconda espressione, perché non è in
grado di modificare il risultato finale. Il cortocircuito può migliorare le prestazioni se l'espressione bypassata è
complessa o se implica chiamate di routine.
Se entrambe le espressioni restituiscono True , result è True . Nella tabella seguente viene illustrato come
result determinare.

SE EXPRESSION1 È E EXPRESSION2 È IL VA LO RE DI RESULT È

True True True

True False False

False (non valutato) False

Tipi di dati
L' AndAlso operatore viene definito solo per il tipo di dati Boolean. Visual Basic converte ogni operando come
necessario in Boolean prima di valutare l'espressione. Se il risultato viene assegnato a un tipo numerico, Visual
Basic lo converte da Boolean a tale tipo, in modo che False diventi 0 e True diventi -1 . Per altre
informazioni, vedere conversioni di tipi booleani.
Overload
È possibile eseguire l' Overload dell' operatore and e dell' operatore false , il che significa che una classe o una
struttura può ridefinire il comportamento quando un operando ha il tipo della classe o della struttura.
L'overload degli And operatori e IsFalse influiscono sul comportamento dell' AndAlso operatore. Se il codice
usa AndAlso su una classe o una struttura che esegue l'overload And di e IsFalse , assicurarsi di comprendere
il comportamento ridefinito. Per altre informazioni, vedere Operator Procedures.

Esempio
Nell'esempio seguente viene utilizzato l' AndAlso operatore per eseguire una congiunzione logica di due
espressioni. Il risultato è un Boolean valore che indica se l'intera espressione conjointa è true. Se la prima
espressione è False , la seconda non viene valutata.

Dim a As Integer = 10
Dim b As Integer = 8
Dim c As Integer = 6
Dim firstCheck, secondCheck, thirdCheck As Boolean
firstCheck = a > b AndAlso b > c
secondCheck = b > a AndAlso b > c
thirdCheck = a > b AndAlso c > b

Nell'esempio precedente vengono prodotti rispettivamente i risultati di True , False e False . Nel calcolo di
secondCheck la seconda espressione non viene valutata perché il primo è già False . Tuttavia, la seconda
espressione viene valutata nel calcolo di thirdCheck .

Esempio
Nell'esempio seguente viene illustrata una Function procedura per la ricerca di un determinato valore tra gli
elementi di una matrice. Se la matrice è vuota o se la lunghezza della matrice è stata superata, l' While
istruzione non testa l'elemento della matrice con il valore di ricerca.

Public Function findValue(ByVal arr() As Double,


ByVal searchValue As Double) As Double
Dim i As Integer = 0
While i <= UBound(arr) AndAlso arr(i) <> searchValue
' If i is greater than UBound(arr), searchValue is not checked.
i += 1
End While
If i > UBound(arr) Then i = -1
Return i
End Function

Vedi anche
Operatori logici e bit per bit (Visual Basic)
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Operatore And
Operatore IsFalse
Operatori logici e bit per bit in Visual Basic
Opertore Await (Visual Basic)
05/03/2021 • 7 minutes to read • Edit Online

Applicare l'operatore Await a un operando in un metodo o in un'espressione lambda asincroni per sospendere
l'esecuzione del metodo finché l'attività di cui si è in attesa non viene completata. L'attività rappresenta il lavoro
attualmente in fase di esecuzione.
Il metodo in cui Await viene usato deve avere un modificatore Async . Tale metodo, definito usando il
modificatore Async e contenente di solito una o più espressioni Await , viene denominato metodo asincrono.

NOTE
Le parole chiave Async e Await sono state introdotte in Visual Studio 2012. Per un'introduzione alla programmazione
asincrona, vedere programmazione asincrona con Async e await.

In genere, l'attività a cui si applica l' Await operatore è il valore restituito da una chiamata a un metodo che
implementa il modello asincrono basato su attività, ovvero un oggetto Task o un oggetto Task<TResult> .
Nel seguente codice, l'elemento HttpClient del metodo GetByteArrayAsync restituisce getContentsTask , un
elemento Task(Of Byte()) . L'attività è una promessa di produrre la matrice di byte effettiva una volta
completata l'operazione. L'operatore Await viene applicato a getContentsTask per sospendere l'esecuzione in
SumPageSizesAsync fino al completamento di getContentsTask . Nel frattempo, il controllo viene restituito al
chiamante di SumPageSizesAsync . Quando getContentsTask termina, l'espressione Await restituisce una matrice
di byte.

Private Async Function SumPageSizesAsync() As Task

' To use the HttpClient type in desktop apps, you must include a using directive and add a
' reference for the System.Net.Http namespace.
Dim client As HttpClient = New HttpClient()
' . . .
Dim getContentsTask As Task(Of Byte()) = client.GetByteArrayAsync(url)
Dim urlContents As Byte() = Await getContentsTask

' Equivalently, now that you see how it works, you can write the same thing in a single line.
'Dim urlContents As Byte() = Await client.GetByteArrayAsync(url)
' . . .
End Function

IMPORTANT
Per l'esempio completo, vedere Procedura dettagliata: accesso al Web con async e await. È possibile scaricare l'esempio da
Developer Code Samples (Esempi di codice per sviluppatori) del sito Web Microsoft. L'esempio è nel progetto
AsyncWalkthrough_HttpClient.

Se Awaitviene applicato al risultato di una chiamata a un metodo che restituisce un elemento


Task(Of TResult) , il tipo dell'espressione Await è TResult. Se Await viene applicato al risultato di una
chiamata a un metodo che restituisce Task , l'espressione Await non restituisce un valore. Nell'esempio che
segue viene illustrata la differenza.
' Await used with a method that returns a Task(Of TResult).
Dim result As TResult = Await AsyncMethodThatReturnsTaskTResult()

' Await used with a method that returns a Task.


Await AsyncMethodThatReturnsTask()

Un'espressione o un'istruzione Await non blocca il thread su cui è in esecuzione. Comporta invece la
registrazione, tramite il compilatore, della parte restante del metodo asincrono, dopo l'espressione Await , come
continuazione dell'attività di cui si è in attesa. Il controllo quindi viene restituito al chiamante del metodo
asincrono. Al termine dell'attività, ne richiama la continuazione e l'esecuzione del metodo asincrono riprende da
dove era stata interrotta.
Un'espressione Await può trovarsi solo nel corpo di un metodo che la contiene o di un'espressione lambda
contrassegnata da un modificatore Async . Il termine await funge da parola chiave solo in tale contesto. Altrove,
viene interpretata come identificatore. All'interno del Async metodo o dell'espressione lambda, un'espressione
Await non può essere presente in un'espressione di query, nel Catch Finally blocco o di un try... Rileva...
Infine, nell'espressione variabile di controllo del ciclo di un For For Each ciclo o oppure nel corpo di
un'istruzione SyncLock .

Eccezioni
La maggior parte dei metodi asincroni restituisce Task o Task<TResult>. Le proprietà dell'attività restituita
contengono informazioni sullo stato e sulla cronologia, ad esempio se l'attività è stata completata, se il metodo
asincrono ha generato un'eccezione o è stato annullato e il risultato finale. L'operatore Await accede a tali
proprietà.
Se si è in attesa di un metodo asincrono che restituisce un'attività che genera un'eccezione, tramite l'operatore
Await viene rigenerata l'eccezione.

Se si è in attesa di un metodo asincrono che restituisce un'attività che è stato annullato, tramite l'operatore
Await viene rigenerata un'eccezione OperationCanceledException.

Una singola attività in uno stato di errore può rispecchiare più eccezioni. Ad esempio, l'attività può essere il
risultato di una chiamata a Task.WhenAll. Quando si attende tale attività, l'operazione await rigenera solo una
delle eccezioni. Tuttavia, non è possibile prevedere quale delle eccezioni verrà rigenerata.
Per esempi di gestione degli errori nei metodi asincroni, vedere try... Rileva... Istruzione finally.

Esempio
Il seguente esempio di Windows Form illustra l'uso di Await in un metodo asincrono, WaitAsynchronouslyAsync .
Contrastare il comportamento di tale metodo con il comportamento di WaitSynchronously . Senza un operatore
Await , WaitSynchronously viene eseguito in modo sincrono nonostante l'uso del modificatore Async nella
definizione e di una chiamata a Thread.Sleep nel corpo.
Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
' Call the method that runs asynchronously.
Dim result As String = Await WaitAsynchronouslyAsync()

' Call the method that runs synchronously.


'Dim result As String = Await WaitSynchronously()

' Display the result.


TextBox1.Text &= result
End Sub

' The following method runs asynchronously. The UI thread is not


' blocked during the delay. You can move or resize the Form1 window
' while Task.Delay is running.
Public Async Function WaitAsynchronouslyAsync() As Task(Of String)
Await Task.Delay(10000)
Return "Finished"
End Function

' The following method runs synchronously, despite the use of Async.
' You cannot move or resize the Form1 window while Thread.Sleep
' is running because the UI thread is blocked.
Public Async Function WaitSynchronously() As Task(Of String)
' Import System.Threading for the Sleep method.
Thread.Sleep(10000)
Return "Finished"
End Function

Vedi anche
Programmazione asincrona con Async e Await
Procedura dettagliata: accesso al Web tramite Async e await
Asincrona
Operatore DirectCast (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Introduce un'operazione di conversione del tipo basata sull'ereditarietà o sull'implementazione.

Commenti
DirectCast non usa le routine di supporto della fase di esecuzione Visual Basic per la conversione, pertanto
può fornire prestazioni leggermente migliori rispetto a quando si esegue la conversione CType da e verso il tipo
di dati Object .
Si usa la DirectCast parola chiave analoga a quella usata per la funzione CType e la parola chiave dell'
operatore TryCast . È possibile specificare un'espressione come primo argomento e un tipo in cui convertirla
come secondo argomento. DirectCast richiede una relazione di ereditarietà o implementazione tra i tipi di dati
dei due argomenti. Ciò significa che un tipo deve ereditare da o implementare l'altro.

Errori ed errori
DirectCast genera un errore del compilatore se rileva che non esiste alcuna relazione di ereditarietà o
implementazione. Tuttavia, la mancanza di un errore del compilatore non garantisce una conversione corretta.
Se la conversione desiderata è più restrittiva, potrebbe verificarsi un errore in fase di esecuzione. In tal caso, il
runtime genera un InvalidCastException errore.

Parole chiave di conversione


Di seguito è riportato un confronto delle parole chiave di conversione del tipo.

REL A Z IO N E T RA
PA RO L A C H IAVE T IP I DI DAT I A RGO M EN T I ERRO RE DI RUN - T IM E

CType Function Qualsiasi tipo di dati È necessario definire una Genera


conversione verso un tipo InvalidCastException
di dati più piccolo o più
piccolo tra i due tipi di dati

DirectCast Qualsiasi tipo di dati Un tipo deve ereditare da o Genera


implementare l'altro tipo InvalidCastException

Operatore TryCast Solo tipi di riferimento Un tipo deve ereditare da o Non restituisce alcun
implementare l'altro tipo risultato

Esempio
Nell'esempio seguente vengono illustrati due utilizzi di DirectCast , uno che non riesce in fase di esecuzione e
uno che ha esito positivo.
Dim q As Object = 2.37
Dim i As Integer = CType(q, Integer)
' The following conversion fails at run time
Dim j As Integer = DirectCast(q, Integer)
Dim f As New System.Windows.Forms.Form
Dim c As System.Windows.Forms.Control
' The following conversion succeeds.
c = DirectCast(f, System.Windows.Forms.Control)

Nell'esempio precedente, il tipo in fase di esecuzione di q è Double . CType ha esito positivo perché Double
può essere convertito in Integer . Tuttavia, il primo DirectCast errore viene eseguito in fase di esecuzione
perché il tipo in fase di esecuzione di Double non ha una relazione di ereditarietà con Integer , anche se esiste
una conversione. Il secondo DirectCast ha esito positivo perché converte dal tipo Form al tipo Control , da cui
Form eredita.

Vedi anche
Convert.ChangeType
Widening and Narrowing Conversions
Conversioni implicite ed esplicite
Espressione di funzione (Visual Basic)
05/03/2021 • 5 minutes to read • Edit Online

Dichiara i parametri e il codice che definiscono un'espressione lambda di funzione.

Sintassi
Function ( [ parameterlist ] ) expression
- or -
Function ( [ parameterlist ] )
[ statements ]
End Function

Parti
T ERM IN E DEF IN IZ IO N E

parameterlist facoltativo. Elenco di nomi di variabili locali che


rappresentano i parametri di questa procedura. Le parentesi
devono essere presenti anche quando l'elenco è vuoto.
Vedere elenco di parametri.

expression Obbligatorio. Espressione singola. Il tipo dell'espressione è il


tipo restituito della funzione.

statements Obbligatorio. Elenco di istruzioni che restituiscono un valore


tramite l' Return istruzione. (Vedere istruzione return). Il
tipo del valore restituito è il tipo restituito della funzione.

Commenti
Un' espressione lambda è una funzione senza nome che calcola e restituisce un valore. È possibile usare
un'espressione lambda in qualsiasi punto in cui è possibile usare un tipo delegato, ad eccezione di un
argomento di RemoveHandler . Per altre informazioni sui delegati e sull'uso di espressioni lambda con i delegati,
vedere istruzione Delegate e conversione di delegati rilassati.

Sintassi delle espressioni lambda


La sintassi di un'espressione lambda è simile a quella di una funzione standard. Le differenze sono le seguenti:
Un'espressione lambda non ha un nome.
Le espressioni lambda non possono avere modificatori, ad esempio Overloads o Overrides .
Le espressioni lambda non utilizzano una As clausola per definire il tipo restituito della funzione. Al
contrario, il tipo viene dedotto dal valore al quale il corpo di un'espressione lambda a riga singola
restituisce oppure il valore restituito di un'espressione lambda su più righe. Se, ad esempio, il corpo di
un'espressione lambda a riga singola è Where cust.City = "London" , il tipo restituito sarà Boolean .
Il corpo di un'espressione lambda a riga singola deve essere un'espressione, non un'istruzione. Il corpo
può essere costituito da una chiamata a una routine della funzione, ma non da una chiamata a una
routine Sub.
È necessario dedurre tutti i parametri con i tipi di dati specificati.
I parametri facoltativi e ParamArray non sono consentiti.
I parametri generici non sono consentiti.

Esempio
Negli esempi seguenti vengono illustrati due modi per creare espressioni lambda semplici. Il primo usa un
oggetto Dim per fornire un nome per la funzione. Per chiamare la funzione, si invia un valore per il parametro.

Dim add1 = Function(num As Integer) num + 1

' The following line prints 6.


Console.WriteLine(add1(5))

Esempio
In alternativa, è possibile dichiarare ed eseguire la funzione nello stesso momento.

Console.WriteLine((Function(num As Integer) num + 1)(5))

Esempio
Di seguito è riportato un esempio di espressione lambda che incrementa il relativo argomento e restituisce il
valore. Nell'esempio viene illustrata la sintassi delle espressioni lambda su una sola riga e su più righe per una
funzione. Per altri esempi, vedere espressioni lambda.

Dim increment1 = Function(x) x + 1


Dim increment2 = Function(x)
Return x + 2
End Function

' Write the value 2.


Console.WriteLine(increment1(1))

' Write the value 4.


Console.WriteLine(increment2(2))

Esempio
Le espressioni lambda sono sottostanti molti degli operatori di query in Language-Integrated query (LINQ) e
possono essere utilizzate in modo esplicito nelle query basate su metodo. Nell'esempio seguente viene illustrata
una tipica query LINQ, seguita dalla conversione della query nel formato del metodo.
Dim londonCusts = From cust In db.Customers
Where cust.City = "London"
Select cust

' This query is compiled to the following code:


Dim londonCusts = db.Customers.
Where(Function(cust) cust.City = "London").
Select(Function(cust) cust)

Per ulteriori informazioni sui metodi di query, vedere query. Per ulteriori informazioni sugli operatori di query
standard, vedere Cenni preliminari sugli operatori di query standard.

Vedi anche
Istruzione Function
Espressioni lambda
Operatori ed espressioni
Istruzioni
Confronto di valori
Espressioni booleane
Operatore If
Conversione di tipo relaxed del delegato
Operatore GetType (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Restituisce un Type oggetto per il tipo specificato. L' Type oggetto fornisce informazioni sul tipo, ad esempio
proprietà, metodi ed eventi.

Sintassi
GetType(typename)

Parametri
PA RA M ET RO DESC RIZ IO N E

typename Nome del tipo per il quale si desiderano le informazioni.

Commenti
L' GetType operatore restituisce l' Type oggetto per l'oggetto specificato typename . È possibile passare il nome
di qualsiasi tipo definito in typename . Il comportamento predefinito include quanto segue:
Qualsiasi tipo di dati Visual Basic, ad esempio Boolean o Date .
Qualsiasi .NET Framework classe, struttura, modulo o interfaccia, ad esempio System.ArgumentException
o System.Double .
Qualsiasi classe, struttura, modulo o interfaccia definita dall'applicazione.
Qualsiasi matrice definita dall'applicazione.
Qualsiasi delegato definito dall'applicazione.
Qualsiasi enumerazione definita da Visual Basic, .NET Framework o dall'applicazione.
Se si desidera ottenere l'oggetto tipo di una variabile oggetto, utilizzare il Type.GetType metodo.
L' GetType operatore può essere utile nelle circostanze seguenti:
È necessario accedere ai metadati per un tipo in fase di esecuzione. L' Type oggetto fornisce metadati
quali i membri del tipo e le informazioni sulla distribuzione. Questa operazione è necessaria, ad esempio,
per riflettere un assembly. Per altre informazioni, vedere System.Reflection.
Si desidera confrontare due riferimenti a oggetti per verificare se fanno riferimento a istanze dello stesso
tipo. In caso affermativo, GetType restituisce riferimenti allo stesso Type oggetto.

Esempio
Negli esempi seguenti viene illustrato l' GetType operatore in uso.
' The following statement returns the Type object for Integer.
MsgBox(GetType(Integer).ToString())
' The following statement returns the Type object for one-dimensional string arrays.
MsgBox(GetType(String()).ToString())

Vedi anche
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Operatori ed espressioni
Operatore GetXmlNamespace (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Ottiene l' XNamespace oggetto che corrisponde al prefisso dello spazio dei nomi XML specificato.

Sintassi
GetXmlNamespace(xmlNamespacePrefix)

Parti
xmlNamespacePrefix
facoltativo. Stringa che identifica il prefisso dello spazio dei nomi XML. Se specificato, la stringa deve essere un
identificatore XML valido. Per ulteriori informazioni, vedere nomi di elementi e attributi XML dichiarati. Se non
viene specificato alcun prefisso, viene restituito lo spazio dei nomi predefinito. Se non viene specificato alcuno
spazio dei nomi predefinito, viene restituito lo spazio dei nomi vuoto.

Valore restituito
XNamespaceOggetto che corrisponde al prefisso dello spazio dei nomi XML.

Commenti
L' GetXmlNamespace operatore ottiene l' XNamespace oggetto che corrisponde al prefisso dello spazio dei nomi
XML xmlNamespacePrefix .
È possibile utilizzare i prefissi degli spazi dei nomi XML direttamente nei valori letterali XML e nelle proprietà
Axis XML. Tuttavia, è necessario usare l' GetXmlNamespace operatore per convertire un prefisso dello spazio dei
nomi in un XNamespace oggetto prima di poterlo usare nel codice. È possibile aggiungere un nome di elemento
non qualificato a un XNamespace oggetto per ottenere un XName oggetto completo, che richiede molti LINQ to
XML metodi.

Esempio
Nell'esempio seguente viene importato ns come prefisso dello spazio dei nomi XML. USA quindi il prefisso
dello spazio dei nomi per creare un valore letterale XML e accedere al primo nodo figlio con il nome completo
ns:phone . Passa quindi quel nodo figlio alla ShowName subroutine, che costruisce un nome completo usando l'
GetXmlNamespace operatore. La ShowName subroutine passa quindi il nome completo al Ancestors metodo per
ottenere il ns:contact nodo padre.
' Place Imports statements at the top of your program.
Imports <xmlns:ns="http://SomeNamespace">

Module GetXmlNamespaceSample

Sub RunSample()

' Create test by using a global XML namespace prefix.

Dim contact =
<ns:contact>
<ns:name>Patrick Hines</ns:name>
<ns:phone ns:type="home">206-555-0144</ns:phone>
<ns:phone ns:type="work">425-555-0145</ns:phone>
</ns:contact>

ShowName(contact.<ns:phone>(0))
End Sub

Sub ShowName(ByVal phone As XElement)


Dim qualifiedName = GetXmlNamespace(ns) + "contact"
Dim contact = phone.Ancestors(qualifiedName)(0)
Console.WriteLine("Name: " & contact.<ns:name>.Value)
End Sub

End Module

Quando si chiama TestGetXmlNamespace.RunSample() , viene visualizzata una finestra di messaggio contenente il


testo seguente:
Name: Patrick Hines

Vedi anche
Istruzione Imports (spazio dei nomi XML)
Accesso a XML in Visual Basic
Operatore If (Visual Basic)
05/03/2021 • 6 minutes to read • Edit Online

Usa la valutazione del cortocircuito per restituire in modo condizionale uno dei due valori. L' If operatore può
essere chiamato con tre argomenti o con due argomenti.

Sintassi
If( [argument1,] argument2, argument3 )

Operatore If chiamato con tre argomenti


Quando If viene chiamato utilizzando tre argomenti, il primo argomento deve restituire un valore di cui è
possibile eseguire il cast come Boolean . Tale Boolean valore determinerà quale degli altri due argomenti viene
valutato e restituito. L'elenco seguente si applica solo quando l' If operatore viene chiamato con tre
argomenti.
Parti
T ERM IN E DEF IN IZ IO N E

argument1 Obbligatorio. Boolean . Determina quale degli altri


argomenti valutare e restituire.

argument2 Obbligatorio. Object . Valutato e restituito se argument1


restituisce True .

argument3 Obbligatorio. Object . Valutato e restituito se argument1


restituisce False o se argument1 è una variabile Nullable
Boolean che restituisce Nothing.

Un If operatore chiamato con tre argomenti funziona come una IIf funzione ad eccezione del fatto che usa
la valutazione a corto circuito. Una IIf funzione valuta sempre tutti e tre gli argomenti, mentre un If
operatore con tre argomenti ne valuta solo due. Il primo If argomento viene valutato e viene eseguito il cast
del risultato come Boolean valore, True o False . Se il valore è True , argument2 viene valutato e viene
restituito il relativo valore, ma argument3 non viene valutato. Se il valore dell' Boolean espressione è False ,
argument3 viene valutato e viene restituito il relativo valore, ma argument2 non viene valutato. Negli esempi
seguenti viene illustrato l'utilizzo di If quando vengono utilizzati tre argomenti:
' This statement prints TruePart, because the first argument is true.
Console.WriteLine(If(True, "TruePart", "FalsePart"))

' This statement prints FalsePart, because the first argument is false.
Console.WriteLine(If(False, "TruePart", "FalsePart"))

Dim number = 3
' With number set to 3, this statement prints Positive.
Console.WriteLine(If(number >= 0, "Positive", "Negative"))

number = -1
' With number set to -1, this statement prints Negative.
Console.WriteLine(If(number >= 0, "Positive", "Negative"))

Nell'esempio seguente viene illustrato il valore della valutazione del cortocircuito. Nell'esempio vengono
illustrati due tentativi di dividere la variabile number in base alla variabile divisor tranne quando divisor è
zero. In tal caso, deve essere restituito 0 e non è necessario effettuare alcuna operazione per eseguire la
divisione perché si verificherà un errore in fase di esecuzione. Poiché l' If espressione usa la valutazione di
corto circuito, viene valutato il secondo o il terzo argomento, a seconda del valore del primo argomento. Se il
primo argomento è true, il divisore è diverso da zero ed è sicuro valutare il secondo argomento ed eseguire la
divisione. Se il primo argomento è false, viene valutato solo il terzo argomento e viene restituito 0. Pertanto,
quando il divisore è 0, non viene effettuato alcun tentativo di eseguire la divisione e non vengono restituiti
errori. Tuttavia, poiché non IIf Usa la valutazione del cortocircuito, il secondo argomento viene valutato anche
quando il primo argomento è false. Causando un errore di divisione per zero della fase di esecuzione.

number = 12

' When the divisor is not 0, both If and IIf return 4.


Dim divisor = 3
Console.WriteLine(If(divisor <> 0, number \ divisor, 0))
Console.WriteLine(IIf(divisor <> 0, number \ divisor, 0))

' When the divisor is 0, IIf causes a run-time error, but If does not.
divisor = 0
Console.WriteLine(If(divisor <> 0, number \ divisor, 0))
' Console.WriteLine(IIf(divisor <> 0, number \ divisor, 0))

Operatore If chiamato con due argomenti


Il primo argomento di If può essere omesso. In questo modo è possibile chiamare l'operatore utilizzando solo
due argomenti. L'elenco seguente si applica solo quando l' If operatore viene chiamato con due argomenti.
Parti
T ERM IN E DEF IN IZ IO N E

argument2 Obbligatorio. Object . Deve essere un riferimento o un tipo


di valore Nullable. Valutato e restituito quando restituisce un
valore diverso da Nothing .

argument3 Obbligatorio. Object . Valutato e restituito se argument2


restituisce Nothing .

Quando l' Boolean argomento viene omesso, il primo argomento deve essere un riferimento o un tipo di valore
Nullable. Se il primo argomento restituisce Nothing , viene restituito il valore del secondo argomento. In tutti gli
altri casi, viene restituito il valore del primo argomento. Nell'esempio seguente viene illustrato il funzionamento
della valutazione:
' Variable first is a nullable type.
Dim first? As Integer = 3
Dim second As Integer = 6

' Variable first <> Nothing, so its value, 3, is returned.


Console.WriteLine(If(first, second))

second = Nothing
' Variable first <> Nothing, so the value of first is returned again.
Console.WriteLine(If(first, second))

first = Nothing
second = 6
' Variable first = Nothing, so 6 is returned.
Console.WriteLine(If(first, second))

Vedi anche
IIf
Tipi di valore Nullable
Nothing
Operatore is (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Confronta due variabili di riferimento a oggetti.

Sintassi
result = object1 Is object2

Parti
result
Obbligatorio. Qualsiasi Boolean valore.
object1
Obbligatorio. Qualsiasi Object nome.
object2
Obbligatorio. Qualsiasi Object nome.

Commenti
L' Is operatore determina se due riferimenti a oggetti si riferiscono allo stesso oggetto. Tuttavia, non esegue
confronti di valori. Se object1 ed object2 entrambi fanno riferimento alla stessa istanza dell'oggetto, result
è True ; in caso contrario, result è False .

NOTE
La Is parola chiave viene inoltre utilizzata nell'oggetto Select... Istruzione case.

Esempio
Nell'esempio seguente viene usato l' Is operatore per confrontare coppie di riferimenti a oggetti. I risultati
vengono assegnati a un Boolean valore che indica se i due oggetti sono identici.
Dim myObject As New Object
Dim otherObject As New Object
Dim yourObject, thisObject, thatObject As Object
Dim myCheck As Boolean
yourObject = myObject
thisObject = myObject
thatObject = otherObject
' The following statement sets myCheck to True.
myCheck = yourObject Is thisObject
' The following statement sets myCheck to False.
myCheck = thatObject Is thisObject
' The following statement sets myCheck to False.
myCheck = myObject Is thatObject
thatObject = myObject
' The following statement sets myCheck to True.
myCheck = thisObject Is thatObject

Come illustrato nell'esempio precedente, è possibile usare l' Is operatore per testare gli oggetti ad
associazione anticipata e ad associazione tardiva.

USA operatore TypeOf con operatore is


Is l'operatore può essere usato anche con la TypeOf parola chiave per creare un' TypeOf espressione... Is
che verifica se una variabile oggetto è compatibile con un tipo di dati. Ad esempio:

If TypeOf sender Is Button Then

Vedere anche
Operatore TypeOf
Operatore IsNot
Comparison Operators in Visual Basic
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Operatori ed espressioni
Operatore IsFalse (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Determina se un'espressione è False .


Non è possibile chiamare IsFalse in modo esplicito nel codice, ma il compilatore Visual Basic può usarlo per
generare codice da AndAlso clausole. Se si definisce una classe o una struttura e quindi si usa una variabile di
quel tipo in una AndAlso clausola, è necessario definire IsFalse su tale classe o struttura.
Il compilatore considera gli IsFalse IsTrue operatori e come una coppia corrispondente. Ciò significa che se si
definisce uno di essi, è necessario definire anche l'altro.

NOTE
L' IsFalse operatore può essere sottoposto a Overload, il che significa che una classe o una struttura può ridefinire il
comportamento quando il relativo operando ha il tipo della classe o della struttura. Se il codice usa questo operatore su
una classe o una struttura di questo tipo, assicurarsi di comprendere il comportamento ridefinito. Per altre informazioni,
vedere Operator Procedures.

Esempio
Nell'esempio di codice seguente viene definita la struttura di una struttura che include definizioni per gli
IsFalse IsTrue operatori e.

Public Structure p
Dim a As Double
Public Shared Operator IsFalse(ByVal w As p) As Boolean
Dim b As Boolean
' Insert code to calculate IsFalse of w.
Return b
End Operator
Public Shared Operator IsTrue(ByVal w As p) As Boolean
Dim b As Boolean
' Insert code to calculate IsTrue of w.
Return b
End Operator
End Structure

Vedi anche
Operatore IsTrue
Procedura: definire un operatore
Operatore AndAlso
Operatore IsNot (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Confronta due variabili di riferimento a oggetti.

Sintassi
result = object1 IsNot object2

Parti
result

Obbligatorio. Valore Boolean .


object1

Obbligatorio. Qualsiasi Object variabile o espressione.


object2

Obbligatorio. Qualsiasi Object variabile o espressione.

Commenti
L' IsNot operatore determina se due riferimenti a oggetti si riferiscono a oggetti diversi. Tuttavia, non esegue
confronti di valori. Se object1 ed object2 entrambi fanno riferimento alla stessa istanza dell'oggetto, result
è False ; in caso contrario, result è True .
IsNot è l'opposto dell' Is operatore. Il vantaggio di IsNot è che è possibile evitare la sintassi scomoda con
Not e Is , che può essere difficile da leggere.
È possibile utilizzare gli Is IsNot operatori e per testare gli oggetti ad associazione anticipata e ad
associazione tardiva.

Esempio
Nell'esempio di codice seguente vengono usati sia l' Is operatore che l' IsNot operatore per eseguire lo
stesso confronto.

Dim o1, o2 As New Object


If Not o1 Is o2 Then MsgBox("o1 and o2 do not refer to the same instance.")
If o1 IsNot o2 Then MsgBox("o1 and o2 do not refer to the same instance.")

USA operatore TypeOf con operatore non


A partire da Visual Basic 14, è possibile usare l' TypeOf operatore con l' IsNot operatore per verificare se un
oggetto non è compatibile con un tipo di dati. Ad esempio:
If TypeOf sender IsNot Button Then

Vedere anche
Operatore Is
Operatore TypeOf
Precedenza tra gli operatori in Visual Basic
Procedura: determinare se due oggetti sono uguali
Operatore IsTrue (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Determina se un'espressione è True .


Non è possibile chiamare IsTrue in modo esplicito nel codice, ma il compilatore Visual Basic può usarlo per
generare codice da OrElse clausole. Se si definisce una classe o una struttura e quindi si usa una variabile di
quel tipo in una OrElse clausola, è necessario definire IsTrue su tale classe o struttura.
Il compilatore considera gli IsTrue IsFalse operatori e come una coppia corrispondente. Ciò significa che se si
definisce uno di essi, è necessario definire anche l'altro.

Uso del compilatore di IsTrue


Una volta definita una classe o una struttura, è possibile utilizzare una variabile di quel tipo in un' For If
istruzione,, Else If o o While in una When clausola. In tal caso, il compilatore richiede un operatore che
converte il tipo in un Boolean valore in modo che possa testare una condizione. Cerca un operatore appropriato
nell'ordine seguente:
1. Un operatore di conversione verso un tipo di dati più ampio dalla classe o dalla struttura a Boolean .
2. Un operatore di conversione verso un tipo di dati più ampio dalla classe o dalla struttura a Boolean? .
3. IsTrue Operatore sulla classe o sulla struttura.
4. Una conversione verso un tipo di caratteri più piccolo Boolean? non comporta una conversione da
Boolean a Boolean? .

5. Operatore di conversione verso un tipo di dati più piccolo dalla classe o dalla struttura a Boolean .
Se non è stata definita alcuna conversione a Boolean o a un IsTrue operatore, il compilatore segnala un errore.

NOTE
L' IsTrue operatore può essere sottoposto a Overload, il che significa che una classe o una struttura può ridefinire il
comportamento quando il relativo operando ha il tipo della classe o della struttura. Se il codice usa questo operatore su
una classe o una struttura di questo tipo, assicurarsi di comprendere il comportamento ridefinito. Per altre informazioni,
vedere Operator Procedures.

Esempio
Nell'esempio di codice seguente viene definita la struttura di una struttura che include definizioni per gli
IsFalse IsTrue operatori e.
Public Structure p
Dim a As Double
Public Shared Operator IsFalse(ByVal w As p) As Boolean
Dim b As Boolean
' Insert code to calculate IsFalse of w.
Return b
End Operator
Public Shared Operator IsTrue(ByVal w As p) As Boolean
Dim b As Boolean
' Insert code to calculate IsTrue of w.
Return b
End Operator
End Structure

Vedi anche
Operatore IsFalse
Procedura: definire un operatore
Operatore OrElse
Like (operatore) (Visual Basic)
05/03/2021 • 10 minutes to read • Edit Online

Confronta una stringa con un modello.

IMPORTANT
L' Like operatore non è attualmente supportato nei progetti .NET Core e .NET standard.

Sintassi
result = string Like pattern

Parti
result
Obbligatorio. Qualsiasi Boolean variabile. Il risultato è un Boolean valore che indica se l'oggetto string
soddisfa o meno pattern .
string
Obbligatorio. Qualsiasi espressione String .
pattern
Obbligatorio. Qualsiasi String espressione conforme alle convenzioni dei criteri di ricerca descritte in
"osservazioni".

Commenti
Se il valore in string soddisfa il modello contenuto in pattern , result è True . Se la stringa non soddisfa il
criterio, result è False . Se string e pattern sono stringhe vuote, il risultato è True .

Metodo di confronto
Il comportamento dell' Like operatore dipende dall' istruzione Option Compare. Il metodo di confronto tra
stringhe predefinito per ogni file di origine è Option Compare Binary .

Opzioni modello
Criteri di ricerca predefiniti fornisce uno strumento versatile per i confronti tra stringhe. Le funzionalità dei
criteri di ricerca consentono di associare ogni carattere in a string un carattere specifico, un carattere jolly, un
elenco di caratteri o un intervallo di caratteri. Nella tabella seguente vengono illustrati i caratteri consentiti in e
le relative pattern corrispondenze.

C A RAT T ERI IN PATTERN C O RRISP O N DE A STRING

? Un solo carattere
C A RAT T ERI IN PATTERN C O RRISP O N DE A STRING

* Zero o più caratteri

# Qualsiasi cifra singola (0-9)

[charlist] Qualsiasi carattere singolo in charlist

[!charlist] Qualsiasi carattere singolo non presente in charlist

Elenchi di caratteri
Un gruppo di uno o più caratteri ( charlist ) racchiusi tra parentesi quadre ( [ ] ) può essere usato per
trovare la corrispondenza con qualsiasi carattere singolo in string e può includere quasi tutti i codici carattere,
incluse le cifre.
Un punto esclamativo ( ! ) all'inizio di charlist indica che viene effettuata una corrispondenza se viene
trovato un carattere ad eccezione dei caratteri in charlist string . Quando viene usato all'esterno delle
parentesi quadre, il punto esclamativo corrisponde a se stesso.

Caratteri speciali
Per trovare la corrispondenza tra i caratteri speciali ( [ ), il punto interrogativo ( ? ), il simbolo di cancelletto ()
# e l'asterisco ( * ), racchiuderli tra parentesi quadre. La parentesi quadra chiusa ( ] ) non può essere usata
all'interno di un gruppo per trovare la corrispondenza, ma può essere usata all'esterno di un gruppo come
singolo carattere.
La sequenza di caratteri [] è considerata una stringa di lunghezza zero ( "" ). Tuttavia, non può far parte di un
elenco di caratteri racchiuso tra parentesi quadre. Se si desidera controllare se una posizione in string contiene
uno di un gruppo di caratteri o nessun carattere, è possibile utilizzare Like due volte. Per un esempio, vedere
procedura: trovare la corrispondenza di una stringa con un modello.

Intervalli di caratteri
Utilizzando un trattino ( – ) per separare i limiti inferiore e superiore dell'intervallo, charlist può specificare
un intervallo di caratteri. Se ad esempio [A–Z] la posizione del carattere corrispondente in contiene un
carattere compreso nell'intervallo, viene generata una corrispondenza se la posizione del string A Z [!H–L]
carattere corrispondente contiene un carattere non compreso nell'intervallo, H ovvero L .
Quando si specifica un intervallo di caratteri, questi devono essere visualizzati in ordine crescente, ovvero dal
più basso al più alto. Pertanto, [A–Z] è un modello valido, ma [Z–A] non lo è.
Più intervalli di caratteri
Per specificare più intervalli per la stessa posizione del carattere, inserirli all'interno delle stesse parentesi
quadre senza delimitatori. Ad esempio, [A–CX–Z] restituisce una corrispondenza se la posizione del carattere
corrispondente in string contiene qualsiasi carattere compreso nell'intervallo A C o nell'intervallo X - Z .
Utilizzo del trattino
Un trattino ( – ) può apparire all'inizio (dopo un punto esclamativo, se presente) o alla fine di charlist per
corrispondere a se stesso. In qualsiasi altra posizione, il segno meno identifica un intervallo di caratteri delimitati
dai caratteri su entrambi i lati del segno meno.
Sequenza di fascicolazione
Il significato di un intervallo specificato dipende dall'ordinamento dei caratteri in fase di esecuzione, come
determinato da Option Compare e dalle impostazioni locali del sistema in cui è in esecuzione il codice. Con
Option Compare Binary , l'intervallo [A–E] corrisponde a,,, A B C D e E . Con Option Compare Text ,
[A–E] corrisponde a A , a ,, À à , B , b , C , c , D , d , E e e . L'intervallo non corrisponde Ê o ê
perché i caratteri accentati vengono ordinati dopo caratteri non accentati nell'ordinamento.

Caratteri di digramma
In alcune lingue sono presenti caratteri alfabetici che rappresentano due caratteri distinti. Ad esempio, diversi
linguaggi utilizzano il carattere æ per rappresentare i caratteri a e e quando vengono visualizzati insieme. L'
Like operatore riconosce che il singolo carattere di digramma e i due caratteri singoli sono equivalenti.

Quando nelle impostazioni locali del sistema viene specificata una lingua che usa un carattere digraph,
un'occorrenza del singolo carattere di digramma in pattern o string corrisponde alla sequenza di due
caratteri equivalente nell'altra stringa. Analogamente, un carattere di digramma pattern racchiuso tra parentesi
quadre (di per sé, in un elenco o in un intervallo) corrisponde alla sequenza di due caratteri equivalente in
string .

Overload
L' Like operatore può essere sottoposto a Overload, il che significa che una classe o una struttura può
ridefinire il comportamento quando un operando ha il tipo della classe o della struttura. Se il codice usa questo
operatore su una classe o una struttura di questo tipo, assicurarsi di comprendere il comportamento ridefinito.
Per altre informazioni, vedere Operator Procedures.

Esempio
Questo esempio usa l' Like operatore per confrontare le stringhe con i vari modelli. I risultati entrano in una
Boolean variabile che indica se ogni stringa soddisfa il modello.
Dim testCheck As Boolean
' The following statement returns True (does "F" satisfy "F"?)
testCheck = "F" Like "F"
' The following statement returns False for Option Compare Binary
' and True for Option Compare Text (does "F" satisfy "f"?)
testCheck = "F" Like "f"
' The following statement returns False (does "F" satisfy "FFF"?)
testCheck = "F" Like "FFF"
' The following statement returns True (does "aBBBa" have an "a" at the
' beginning, an "a" at the end, and any number of characters in
' between?)
testCheck = "aBBBa" Like "a*a"
' The following statement returns True (does "F" occur in the set of
' characters from "A" through "Z"?)
testCheck = "F" Like "[A-Z]"
' The following statement returns False (does "F" NOT occur in the
' set of characters from "A" through "Z"?)
testCheck = "F" Like "[!A-Z]"
' The following statement returns True (does "a2a" begin and end with
' an "a" and have any single-digit number in between?)
testCheck = "a2a" Like "a#a"
' The following statement returns True (does "aM5b" begin with an "a",
' followed by any character from the set "L" through "P", followed
' by any single-digit number, and end with any character NOT in
' the character set "c" through "e"?)
testCheck = "aM5b" Like "a[L-P]#[!c-e]"
' The following statement returns True (does "BAT123khg" begin with a
' "B", followed by any single character, followed by a "T", and end
' with zero or more characters of any type?)
testCheck = "BAT123khg" Like "B?T*"
' The following statement returns False (does "CAT123khg"?) begin with
' a "B", followed by any single character, followed by a "T", and
' end with zero or more characters of any type?)
testCheck = "CAT123khg" Like "B?T*"

Vedi anche
InStr
StrComp
Operatori di confronto
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Istruzione Option Compare
Operatori ed espressioni
Procedura: confrontare una stringa con un modello
Operatore Mod (Visual Basic)
05/03/2021 • 6 minutes to read • Edit Online

Divide due numeri e restituisce solo il resto.

Sintassi
result = number1 Mod number2

Parti
result
Obbligatorio. Qualsiasi variabile o proprietà numerica.
number1
Obbligatorio. Qualsiasi espressione numerica.
number2
Obbligatorio. Qualsiasi espressione numerica.

Tipi supportati
tutti i tipi numerici. Sono inclusi i tipi a virgola mobile e non firmati e Decimal .

Risultato
Il risultato è il resto dopo che number1 è diviso per number2 . Ad esempio, l'espressione 14 Mod 4 restituisce 2.

NOTE
Esiste una differenza tra resto e modulo in matematica, con risultati diversi per i numeri negativi. L' Mod operatore in
Visual Basic, l' op_Modulus operatore .NET Framework e l'istruzione REM il sottostante eseguono un'operazione resto.

Il risultato di un' Mod operazione mantiene il segno del dividendo, number1 , quindi può essere positivo o
negativo. Il risultato è sempre compreso nell'intervallo (- number2 , number2 ), Exclusive. Ad esempio:

Public Module Example


Public Sub Main()
Console.WriteLine($" 8 Mod 3 = {8 Mod 3}")
Console.WriteLine($"-8 Mod 3 = {-8 Mod 3}")
Console.WriteLine($" 8 Mod -3 = {8 Mod -3}")
Console.WriteLine($"-8 Mod -3 = {-8 Mod -3}")
End Sub
End Module
' The example displays the following output:
' 8 Mod 3 = 2
' -8 Mod 3 = -2
' 8 Mod -3 = 2
' -8 Mod -3 = -2
Osservazioni
Se number1 o number2 è un valore a virgola mobile, viene restituito il resto a virgola mobile della divisione. Il
tipo di dati del risultato è il tipo di dati più piccolo che può conservare tutti i valori possibili risultanti dalla
divisione con i tipi di dati di number1 e number2 .
Se number1 o number2 restituisce Nothing, viene considerato come zero.
Gli operatori correlati includono quanto segue:
L' operatore \ (Visual Basic) restituisce il quoziente integer di una divisione. Ad esempio, l'espressione
14 \ 4 restituisce 3.

L' operatore/(Visual Basic) restituisce il quoziente completo, incluso il resto, come numero a virgola
mobile. Ad esempio, l'espressione 14 / 4 restituisce 3,5.

Tentativo di divisione per zero


Se number2 restituisce zero, il comportamento dell' Mod operatore dipende dal tipo di dati degli operandi:
Una divisione integrale genera un' DivideByZeroException eccezione se number2 non può essere determinata
in fase di compilazione e genera un errore in fase di compilazione
BC30542 Division by zero occurred while evaluating this expression se number2 viene valutato a zero in
fase di compilazione.
Viene restituita una divisione a virgola mobile Double.NaN .

Formula equivalente
L'espressione a Mod b è equivalente a una delle formule seguenti:
a - (b * (a \ b))

a - (b * Fix(a / b))

Imprecisione a virgola mobile


Quando si utilizzano numeri a virgola mobile, tenere presente che in memoria non è sempre presente una
rappresentazione decimale precisa. Questo può causare risultati imprevisti di determinate operazioni, ad
esempio il confronto dei valori e l' Mod operatore. Per ulteriori informazioni, vedere risoluzione dei
problemirelativi ai tipi di dati.

Overload
È Mod possibile eseguire l' Overload dell'operatore, il che significa che una classe o una struttura può ridefinire
il comportamento. Se il codice si applica Mod a un'istanza di una classe o una struttura che include tale
overload, assicurarsi di comprendere il comportamento ridefinito. Per altre informazioni, vedere Operator
Procedures.

Esempio
Nell'esempio seguente viene usato l' Mod operatore per dividere due numeri e restituire solo il resto. Se uno dei
due numeri è un numero a virgola mobile, il risultato è un numero a virgola mobile che rappresenta il resto.
Debug.WriteLine(10 Mod 5)
' Output: 0
Debug.WriteLine(10 Mod 3)
' Output: 1
Debug.WriteLine(-10 Mod 3)
' Output: -1
Debug.WriteLine(12 Mod 4.3)
' Output: 3.4
Debug.WriteLine(12.6 Mod 5)
' Output: 2.6
Debug.WriteLine(47.9 Mod 9.35)
' Output: 1.15

Esempio
Nell'esempio seguente viene illustrata la potenziale imprecisione degli operandi a virgola mobile. Nella prima
istruzione gli operandi sono Double e 0,2 è una frazione binaria ripetuta in modo infinito con un valore
archiviato di 0.20000000000000001. Nella seconda istruzione, il carattere di tipo letterale D impone entrambi
gli operandi a Decimal e 0,2 presenta una rappresentazione precisa.

firstResult = 2.0 Mod 0.2


' Double operation returns 0.2, not 0.
secondResult = 2D Mod 0.2D
' Decimal operation returns 0.

Vedi anche
Int
Fix
Operatori aritmetici
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Risoluzione dei problemi relativi ai tipi di dati
Operatori aritmetici in Visual Basic
Operatore \ (Visual Basic)
Operatore NameOf-Visual Basic
02/11/2020 • 2 minutes to read • Edit Online

L'operatore NameOf ottiene il nome di una variabile, di un tipo o di un membro come costante stringa:

Console.WriteLine(NameOf(System.Collections.Generic)) ' output: Generic


Console.WriteLine(NameOf(List(Of Integer))) ' output: List
Console.WriteLine(NameOf(List(Of Integer).Count)) ' output: Count
Console.WriteLine(NameOf(List(Of Integer).Add)) ' output: Add

Dim numbers As New List(Of Integer) From { 1, 2, 3 }


Console.WriteLine(NameOf(numbers)) ' output: numbers
Console.WriteLine(NameOf(numbers.Count)) ' output: Count
Console.WriteLine(NameOf(numbers.Add)) ' output: Add

Come illustrato nell'esempio precedente, nel caso di un tipo e di uno spazio dei nomi, il nome prodotto in
genere non è completo.
L'operatore NameOf viene valutato in fase di compilazione e non ha alcun effetto in fase di esecuzione.
È possibile usare l'operatore NameOf per rendere più gestibile il codice per il controllo degli argomenti:

Private _name As String

Public Property Name As String


Get
Return _name
End Get
Set
If value Is Nothing Then
Throw New ArgumentNullException(NameOf(value), $"{NameOf(name)} cannot be null.")
End If
End Set
End Property

L' NameOf operatore è disponibile in Visual Basic 14 e versioni successive.

Vedere anche
Riferimenti al linguaggio Visual Basic
Operatori (Visual Basic)
Operatore New (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Introduce una New clausola per creare una nuova istanza dell'oggetto, specifica un vincolo del costruttore in un
parametro di tipo o identifica una Sub routine come costruttore di classe.

Commenti
In una dichiarazione o un'istruzione di assegnazione, una New clausola deve specificare una classe definita da
cui è possibile creare l'istanza. Questo significa che la classe deve esporre uno o più costruttori a cui il codice
chiamante può accedere.
È possibile utilizzare una New clausola in un'istruzione di dichiarazione o un'istruzione di assegnazione. Quando
l'istruzione viene eseguita, viene chiamato il costruttore appropriato della classe specificata, passando gli
argomenti specificati. Nell'esempio seguente viene illustrato questo problema creando istanze di una Customer
classe che dispone di due costruttori, uno che non accetta parametri e uno che accetta un parametro di stringa:

' For customer1, call the constructor that takes no arguments.


Dim customer1 As New Customer()

' For customer2, call the constructor that takes the name of the
' customer as an argument.
Dim customer2 As New Customer("Blue Yonder Airlines")

' For customer3, declare an instance of Customer in the first line


' and instantiate it in the second.
Dim customer3 As Customer
customer3 = New Customer()

' With Option Infer set to On, the following declaration declares
' and instantiates a new instance of Customer.
Dim customer4 = New Customer("Coho Winery")

Poiché le matrici sono classi, New può creare una nuova istanza di matrice, come illustrato nell'esempio
seguente:

Dim intArray1() As Integer


intArray1 = New Integer() {1, 2, 3, 4}

Dim intArray2() As Integer = {5, 6}

' The following example requires that Option Infer be set to On.
Dim intArray3() = New Integer() {6, 7, 8}

Il Common Language Runtime (CLR) genera un OutOfMemoryException errore se la memoria disponibile non è
sufficiente per creare la nuova istanza.

NOTE
La New parola chiave viene usata anche negli elenchi di parametri di tipo per specificare che il tipo fornito deve esporre
un costruttore senza parametri accessibile. Per ulteriori informazioni sui parametri e i vincoli di tipo, vedere Type list.

Per creare una routine del costruttore per una classe, impostare il nome di una Sub stored procedure sulla New
parola chiave. Per altre informazioni, vedere durata degli oggetti: come creare ed eliminare definitivamente
oggetti.
È possibile usare la parola chiave New nei contesti seguenti:
Istruzione Dim
Di
Istruzione Sub

Vedi anche
OutOfMemoryException
Parole chiave
Type List
Generic Types in Visual Basic
Durata degli oggetti: come creare e distruggere oggetti
Operatore Not (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Esegue una negazione logica su un' Boolean espressione o una negazione bit per bit su un'espressione
numerica.

Sintassi
result = Not expression

Parti
result
Obbligatorio. Qualsiasi espressione Boolean o numerica.
expression
Obbligatorio. Qualsiasi espressione Boolean o numerica.

Commenti
Per Boolean le espressioni, nella tabella seguente viene illustrato il modo in cui result viene determinato.

SE EXPRESSION È IL VA LO RE DI RESULT È

True False

False True

Per le espressioni numeriche, l' Not operatore inverte i valori di bit di qualsiasi espressione numerica e imposta
il bit corrispondente in in result base alla tabella seguente.

SE IL B IT IN EXPRESSION È IL B IT IN RESULT È

1 0

0 1

NOTE
Poiché gli operatori logici e bit per bit hanno una precedenza inferiore rispetto ad altri operatori aritmetici e relazionali,
qualsiasi operazione bit per bit deve essere racchiusa tra parentesi per garantire un'esecuzione accurata.

Tipi di dati
Per una negazione booleana, il tipo di dati del risultato è Boolean . Per una negazione bit per bit, il tipo di dati
del risultato è identico a quello di expression . Tuttavia, se Expression è Decimal , il risultato è Long .
Overload
L' Not operatore può essere sottoposto a Overload, il che significa che una classe o una struttura può ridefinire
il comportamento quando il relativo operando ha il tipo della classe o della struttura. Se il codice usa questo
operatore su una classe o una struttura di questo tipo, assicurarsi di comprendere il comportamento ridefinito.
Per altre informazioni, vedere Operator Procedures.

Esempio
Nell'esempio seguente viene usato l' Not operatore per eseguire la negazione logica su un' Boolean
espressione. Il risultato è un Boolean valore che rappresenta l'inverso del valore dell'espressione.

Dim a As Integer = 10
Dim b As Integer = 8
Dim c As Integer = 6
Dim firstCheck, secondCheck As Boolean
firstCheck = Not (a > b)
secondCheck = Not (b > a)

Nell'esempio precedente vengono restituiti i risultati di False e True , rispettivamente.

Esempio
Nell'esempio seguente viene usato l' Not operatore per eseguire la negazione logica dei singoli bit di
un'espressione numerica. Il bit nel modello di risultato viene impostato sul contrario del bit corrispondente nel
modello di operando, incluso il bit di segno.

Dim a As Integer = 10
Dim b As Integer = 8
Dim c As Integer = 6
Dim firstPattern, secondPattern, thirdPattern As Integer
firstPattern = (Not a)
secondPattern = (Not b)
thirdPattern = (Not c)

Nell'esempio precedente vengono restituiti rispettivamente i risultati di – 11, – 9 e-7.

Vedi anche
Operatori logici e bit per bit (Visual Basic)
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Operatori logici e bit per bit in Visual Basic
Operatore Or (Visual Basic)
05/03/2021 • 5 minutes to read • Edit Online

Esegue una disgiunzione logica di due Boolean espressioni o una disgiunzione bit per bit di due espressioni
numeriche.

Sintassi
result = expression1 Or expression2

Parti
result
Obbligatorio. Qualsiasi espressione Boolean o numerica. Per Boolean il confronto, result è la disgiunzione
logica inclusiva di due Boolean valori. Per le operazioni bit per bit, result è un valore numerico che
rappresenta la disgiunzione bit per bit inclusiva di due modelli di bit numerici.
expression1
Obbligatorio. Qualsiasi espressione Boolean o numerica.
expression2
Obbligatorio. Qualsiasi espressione Boolean o numerica.

Commenti
Per il Boolean confronto, result è False se e solo se expression1 e expression2 restituiscono False . Nella
tabella seguente viene illustrato come result determinare.

SE EXPRESSION1 È E EXPRESSION2 È IL VA LO RE DI RESULT È

True True True

True False True

False True True

False False False

NOTE
In un Boolean confronto, l' Or operatore valuta sempre entrambe le espressioni, che possono includere l'esecuzione di
chiamate di routine. L' operatore OrElse esegue un corto circuito, il che significa che se expression1 è True ,
expression2 non viene valutato.

Per le operazioni bit per bit, l' Or operatore esegue un confronto bit per bit dei bit posizionati in modo identico
in due espressioni numeriche e imposta il bit corrispondente in in result base alla tabella seguente.
SE IL B IT IN EXPRESSION1 È E B IT IN EXPRESSION2 È IL B IT IN RESULT È

1 1 1

1 0 1

0 1 1

0 0 0

NOTE
Poiché gli operatori logici e bit per bit hanno una precedenza inferiore rispetto ad altri operatori aritmetici e relazionali,
qualsiasi operazione bit per bit deve essere racchiusa tra parentesi per garantire un'esecuzione accurata.

Tipi di dati
Se gli operandi sono costituiti da un'espressione e da un' Boolean espressione numerica, Visual Basic converte
l' Boolean espressione in un valore numerico (-1 per True e 0 per False ) ed esegue un'operazione bit per bit.
Per un Boolean confronto, il tipo di dati del risultato è Boolean . Per un confronto bit per bit, il tipo di dati result
è un tipo numerico appropriato per i tipi di dati di expression1 e expression2 . Vedere la tabella "confronto
relazionale e bit per bit" in tipi di dati dei risultati dell'operatore.

Overload
L' Or operatore può essere sottoposto a Overload, il che significa che una classe o una struttura può ridefinire il
comportamento quando un operando ha il tipo della classe o della struttura. Se il codice usa questo operatore
su una classe o una struttura di questo tipo, assicurarsi di comprendere il comportamento ridefinito. Per altre
informazioni, vedere Operator Procedures.

Esempio
Nell'esempio seguente viene usato l' Or operatore per eseguire una disgiunzione logica inclusiva su due
espressioni. Il risultato è un Boolean valore che indica se una delle due espressioni è True .

Dim a As Integer = 10
Dim b As Integer = 8
Dim c As Integer = 6
Dim firstCheck, secondCheck, thirdCheck As Boolean
firstCheck = a > b Or b > c
secondCheck = b > a Or b > c
thirdCheck = b > a Or c > b

Nell'esempio precedente vengono prodotti rispettivamente i risultati di True , True e False .

Esempio
Nell'esempio seguente viene usato l' Or operatore per eseguire la disgiunzione logica inclusiva sui singoli bit di
due espressioni numeriche. Il bit nel modello di risultato viene impostato se uno dei bit corrispondenti negli
operandi è impostato su 1.
Dim a As Integer = 10
Dim b As Integer = 8
Dim c As Integer = 6
Dim firstPattern, secondPattern, thirdPattern As Integer
firstPattern = (a Or b)
secondPattern = (a Or c)
thirdPattern = (b Or c)

Nell'esempio precedente vengono prodotti rispettivamente i risultati 10, 14 e 14.

Vedi anche
Operatori logici e bit per bit (Visual Basic)
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Operatore OrElse
Operatori logici e bit per bit in Visual Basic
Operatore OrElse (Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

Esegue una disgiunzione logica inclusiva di corto circuito su due espressioni.

Sintassi
result = expression1 OrElse expression2

Parti
result
Obbligatorio. Qualsiasi espressione Boolean .
expression1
Obbligatorio. Qualsiasi espressione Boolean .
expression2
Obbligatorio. Qualsiasi espressione Boolean .

Commenti
Un'operazione logica viene detta corto circuito se il codice compilato può ignorare la valutazione di
un'espressione a seconda del risultato di un'altra espressione. Se il risultato della prima espressione valutata
determina il risultato finale dell'operazione, non è necessario valutare la seconda espressione, perché non è in
grado di modificare il risultato finale. Il cortocircuito può migliorare le prestazioni se l'espressione bypassata è
complessa o se implica chiamate di routine.
Se una o entrambe le espressioni restituiscono True , result è True . Nella tabella seguente viene illustrato
come result determinare.

SE EXPRESSION1 È E EXPRESSION2 È IL VA LO RE DI RESULT È

True (non valutato) True

False True True

False False False

Tipi di dati
L' OrElse operatore viene definito solo per il tipo di dati Boolean. Visual Basic converte ogni operando come
necessario in Boolean prima di valutare l'espressione. Se il risultato viene assegnato a un tipo numerico, Visual
Basic lo converte da Boolean a tale tipo, in modo che False diventi 0 e True diventi -1 . Per altre
informazioni, vedere conversioni di tipi booleani.

Overload
L' operatore OR e l' operatore IsTrue possono essere sottoposto a Overload, il che significa che una classe o una
struttura può ridefinire il comportamento quando un operando ha il tipo della classe o della struttura.
L'overload degli Or operatori e IsTrue influiscono sul comportamento dell' OrElse operatore. Se il codice usa
OrElse su una classe o una struttura che esegue l'overload Or di e IsTrue , assicurarsi di comprendere il
comportamento ridefinito. Per altre informazioni, vedere Operator Procedures.

Esempio
Nell'esempio seguente viene usato l' OrElse operatore per eseguire la disgiunzione logica di due espressioni. Il
risultato è un Boolean valore che indica se una delle due espressioni è true. Se la prima espressione è True , la
seconda non viene valutata.

Dim a As Integer = 10
Dim b As Integer = 8
Dim c As Integer = 6
Dim firstCheck, secondCheck, thirdCheck As Boolean
firstCheck = a > b OrElse b > c
secondCheck = b > a OrElse b > c
thirdCheck = b > a OrElse c > b

Nell'esempio precedente vengono prodotti rispettivamente i risultati di True , True e False . Nel calcolo di
firstCheck la seconda espressione non viene valutata perché il primo è già True . Tuttavia, la seconda
espressione viene valutata nel calcolo di secondCheck .

Esempio
Nell'esempio seguente viene illustrata un' If istruzione... Then contenente due chiamate di procedura. Se la
prima chiamata restituisce True , la seconda procedura non viene chiamata. Questo potrebbe produrre risultati
imprevisti se la seconda procedura esegue attività importanti che devono essere sempre eseguite quando viene
eseguita questa sezione del codice.

If testFunction(5) = True OrElse otherFunction(4) = True Then


' If testFunction(5) is True, otherFunction(4) is not called.
' Insert code to be executed.
End If

Vedi anche
Operatori logici e bit per bit (Visual Basic)
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Operatore Or
Operatore IsTrue
Operatori logici e bit per bit in Visual Basic
Sottoespressione (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Dichiara i parametri e il codice che definiscono un'espressione lambda subroutine.

Sintassi
Sub ( [ parameterlist ] ) statement
- or -
Sub ( [ parameterlist ] )
[ statements ]
End Sub

Parti
T ERM IN E DEF IN IZ IO N E

parameterlist facoltativo. Elenco di nomi di variabili locali che


rappresentano i parametri della stored procedure. Le
parentesi devono essere presenti anche quando l'elenco è
vuoto. Per altre informazioni, vedere Parameter List.

statement Obbligatorio. Una singola istruzione.

statements Obbligatorio. Elenco di istruzioni.

Commenti
Un' espressione lambda è una subroutine che non ha un nome e che esegue una o più istruzioni. È possibile
usare un'espressione lambda ovunque sia possibile usare un tipo delegato, ad eccezione di un argomento di
RemoveHandler . Per altre informazioni sui delegati e sull'uso di espressioni lambda con i delegati, vedere
istruzione Delegate e conversione di delegati rilassati.

Sintassi delle espressioni lambda


La sintassi di un'espressione lambda è simile a quella di una subroutine standard. Le differenze sono le seguenti:
Un'espressione lambda non ha un nome.
Un'espressione lambda non può avere un modificatore, ad esempio Overloads o Overrides .
Il corpo di un'espressione lambda a riga singola deve essere un'istruzione, non un'espressione. Il corpo
può essere costituito da una chiamata a una routine Sub, ma non da una chiamata a una routine di
funzione.
In un'espressione lambda, tutti i parametri devono avere tipi di dati specificati oppure è necessario
dedurre tutti i parametri.
I parametri e facoltativi ParamArray non sono consentiti nelle espressioni lambda.
I parametri generici non sono consentiti nelle espressioni lambda.
Esempio
Di seguito è riportato un esempio di espressione lambda che scrive un valore nella console. Nell'esempio viene
illustrata la sintassi delle espressioni lambda su una sola riga e su più righe per una subroutine. Per altri esempi,
vedere espressioni lambda.

Dim writeline1 = Sub(x) Console.WriteLine(x)


Dim writeline2 = Sub(x)
Console.WriteLine(x)
End Sub

' Write "Hello".


writeline1("Hello")

' Write "World"


writeline2("World")

Vedi anche
Istruzione Sub
Espressioni lambda
Operatori ed espressioni
Istruzioni
Conversione di tipo relaxed del delegato
Operatore TryCast (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Introduce un'operazione di conversione del tipo che non genera un'eccezione.

Commenti
Se un tentativo di conversione ha esito negativo CType e viene DirectCast generato un InvalidCastException
errore. Ciò può influire negativamente sulle prestazioni dell'applicazione. TryCast non restituisce nulla, quindi,
anziché dover gestire una possibile eccezione, è necessario testare solo il risultato restituito Nothing .
Usare la TryCast parola chiave nello stesso modo in cui si usano la funzione CType e la parola chiave dell'
Operatore DirectCast . È possibile specificare un'espressione come primo argomento e un tipo in cui convertirla
come secondo argomento. TryCast opera solo sui tipi di riferimento, ad esempio le classi e le interfacce.
Richiede una relazione di ereditarietà o implementazione tra i due tipi. Ciò significa che un tipo deve ereditare
da o implementare l'altro.

Errori ed errori
TryCast genera un errore del compilatore se rileva che non esiste alcuna relazione di ereditarietà o
implementazione. Tuttavia, la mancanza di un errore del compilatore non garantisce una conversione corretta.
Se la conversione desiderata è più restrittiva, potrebbe verificarsi un errore in fase di esecuzione. In tal caso,
TryCast non viene restituito alcunrisultato.

Parole chiave di conversione


Di seguito è riportato un confronto delle parole chiave di conversione del tipo.

REL A Z IO N E T RA
PA RO L A C H IAVE T IP I DI DAT I A RGO M EN T I ERRO RE DI RUN - T IM E

CType Function Qualsiasi tipo di dati È necessario definire una Genera


conversione verso un tipo InvalidCastException
di dati più piccolo o più
piccolo tra i due tipi di dati

Operatore DirectCast Qualsiasi tipo di dati Un tipo deve ereditare da o Genera


implementare l'altro tipo InvalidCastException

TryCast Solo tipi di riferimento Un tipo deve ereditare da o Non restituisce alcun
implementare l'altro tipo risultato

Esempio
Nell'esempio riportato di seguito viene illustrato come usare TryCast .
Function PrintTypeCode(ByVal obj As Object) As String
Dim objAsConvertible As IConvertible = TryCast(obj, IConvertible)
If objAsConvertible Is Nothing Then
Return obj.ToString() & " does not implement IConvertible"
Else
Return "Type code is " & objAsConvertible.GetTypeCode()
End If
End Function

Vedi anche
Widening and Narrowing Conversions
Conversioni implicite ed esplicite
Operatore TypeOf (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Verifica se il tipo di runtime del risultato di un'espressione è compatibile con il tipo specificato.

Sintassi
result = TypeOf objectexpression Is typename

result = TypeOf objectexpression IsNot typename

Parti
result
Restituita. Valore Boolean .
objectexpression
Obbligatorio. Qualsiasi espressione che restituisce un tipo riferimento.
typename
Obbligatorio. Qualsiasi nome di un tipo di dati.

Commenti
L'operatore TypeOf determina se il tipo di objectexpression in fase di esecuzione è compatibile con typename .
La compatibilità dipende dalla categoria del tipo di typename . La tabella seguente illustra come viene
determinata la compatibilità.

C AT EGO RIA DEL T IP O DI TYPENAME C RIT ERIO DI C O M PAT IB IL ITÀ

Classe objectexpression è del tipo typename o eredita da


typename

Struttura objectexpression è del tipo typename

Interfaccia objectexpression implementa typename o eredita da


una classe che implementa typename

Se il tipo di objectexpression in fase di esecuzione soddisfa il criterio di compatibilità, result sarà True . In
caso contrario, result sarà False . Se objectexpression è null, TypeOf ... Is restituisce False e ... IsNot
restituisce True .
TypeOf viene sempre usato con la parola chiave Is per costruire un'espressione TypeOf ... Is oppure con la
parola chiave IsNot per costruire un'espressione TypeOf ... IsNot .

Esempio
Nell'esempio seguente le espressioni TypeOf ... Is vengono usate per verificare la compatibilità dei tipi di due
variabili di riferimento a un oggetto con diversi tipi di dati.

Dim refInteger As Object = 2


MsgBox("TypeOf Object[Integer] Is Integer? " & TypeOf refInteger Is Integer)
MsgBox("TypeOf Object[Integer] Is Double? " & TypeOf refInteger Is Double)
Dim refForm As Object = New System.Windows.Forms.Form
MsgBox("TypeOf Object[Form] Is Form? " & TypeOf refForm Is System.Windows.Forms.Form)
MsgBox("TypeOf Object[Form] Is Label? " & TypeOf refForm Is System.Windows.Forms.Label)
MsgBox("TypeOf Object[Form] Is Control? " & TypeOf refForm Is System.Windows.Forms.Control)
MsgBox("TypeOf Object[Form] Is IComponent? " & TypeOf refForm Is System.ComponentModel.IComponent)

La variabile refInteger presenta un tipo in fase di esecuzione Integer . È compatibile con Integer , ma non
con Double . La variabile refForm presenta un tipo in fase di esecuzione Form. È compatibile con Form perché si
tratta del relativo tipo, con Control perché Form eredita da Control e con IComponent perché Form eredita da
Component, che implementa IComponent. refForm non è invece compatibile con Label.

Vedi anche
Operatore Is
Operatore IsNot
Comparison Operators in Visual Basic
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Operatori ed espressioni
Operatore Xor (Visual Basic)
05/03/2021 • 6 minutes to read • Edit Online

Esegue un'esclusione logica di due Boolean espressioni oppure un'esclusione bit per bit su due espressioni
numeriche.

Sintassi
result = expression1 Xor expression2

Parti
result
Obbligatorio. Qualsiasi Boolean variabile o variabile numerica. Per il confronto booleano, result è l'esclusione
logica (disgiunzione logica esclusiva) di due Boolean valori. Per le operazioni bit per bit, result è un valore
numerico che rappresenta l'esclusione bit per bit (disgiunzione bit per bit esclusiva) di due modelli di bit
numerici.
expression1
Obbligatorio. Qualsiasi espressione Boolean o numerica.
expression2
Obbligatorio. Qualsiasi espressione Boolean o numerica.

Commenti
Per il confronto booleano, result è True se e solo se esattamente uno di expression1 e expression2
restituisce True . Ovvero, se e solo se expression1 e expression2 restituiscono valori opposti Boolean . Nella
tabella seguente viene illustrato come result determinare.

SE EXPRESSION1 È E EXPRESSION2 È IL VA LO RE DI RESULT È

True True False

True False True

False True True

False False False

NOTE
In un confronto booleano, l' Xor operatore valuta sempre entrambe le espressioni, che possono includere l'esecuzione di
chiamate di routine. Non esiste alcuna controparte di corto circuito di Xor , perché il risultato dipende sempre da
entrambi gli operandi. Per gli operatori logici di corto circuito , vedere operatore AndAlso e operatore OrElse.

Per le operazioni bit per bit, l' Xor operatore esegue un confronto bit per bit dei bit posizionati in modo identico
in due espressioni numeriche e imposta il bit corrispondente in in result base alla tabella seguente.

SE IL B IT IN EXPRESSION1 È E B IT IN EXPRESSION2 È IL B IT IN RESULT È

1 1 0

1 0 1

0 1 1

0 0 0

NOTE
Poiché gli operatori logici e bit per bit hanno una precedenza inferiore rispetto ad altri operatori aritmetici e relazionali,
qualsiasi operazione bit per bit deve essere racchiusa tra parentesi per garantire un'esecuzione accurata.

Ad esempio, 5 Xor 3 è 6. Per verificarne il motivo, convertire 5 e 3 nelle rispettive rappresentazioni binarie, 101
e 011. Usare quindi la tabella precedente per determinare che 101 Xor 011 è 110, ovvero la rappresentazione
binaria del numero decimale 6.

Tipi di dati
Se gli operandi sono costituiti da un'espressione e da un' Boolean espressione numerica, Visual Basic converte
l' Boolean espressione in un valore numerico (-1 per True e 0 per False ) ed esegue un'operazione bit per bit.
Per un Boolean confronto, il tipo di dati del risultato è Boolean . Per un confronto bit per bit, il tipo di dati result
è un tipo numerico appropriato per i tipi di dati di expression1 e expression2 . Vedere la tabella "confronto
relazionale e bit per bit" in tipi di dati dei risultati dell'operatore.

Overload
L' Xor operatore può essere sottoposto a Overload, il che significa che una classe o una struttura può ridefinire
il comportamento quando un operando ha il tipo della classe o della struttura. Se il codice usa questo operatore
su una classe o una struttura di questo tipo, verificare di aver compreso il comportamento ridefinito. Per altre
informazioni, vedere Operator Procedures.

Esempio
Nell'esempio seguente viene usato l' Xor operatore per eseguire l'esclusione logica (disgiunzione logica
esclusiva) su due espressioni. Il risultato è un Boolean valore che indica se una delle espressioni è esattamente
True .

Dim a As Integer = 10
Dim b As Integer = 8
Dim c As Integer = 6
Dim firstCheck, secondCheck, thirdCheck As Boolean
firstCheck = a > b Xor b > c
secondCheck = b > a Xor b > c
thirdCheck = b > a Xor c > b

Nell'esempio precedente vengono prodotti rispettivamente i risultati di False , True e False .


Esempio
Nell'esempio seguente viene usato l' Xor operatore per eseguire l'esclusione logica (disgiunzione logica
esclusiva) sui singoli bit di due espressioni numeriche. Il bit nel modello di risultato viene impostato se
esattamente uno dei bit corrispondenti negli operandi è impostato su 1.

Dim a As Integer = 10 ' 1010 in binary


Dim b As Integer = 8 ' 1000 in binary
Dim c As Integer = 6 ' 0110 in binary
Dim firstPattern, secondPattern, thirdPattern As Integer
firstPattern = (a Xor b) ' 2, 0010 in binary
secondPattern = (a Xor c) ' 12, 1100 in binary
thirdPattern = (b Xor c) ' 14, 1110 in binary

Nell'esempio precedente vengono prodotti rispettivamente i risultati 2, 12 e 14.

Vedi anche
Operatori logici e bit per bit (Visual Basic)
Precedenza tra gli operatori in Visual Basic
Elenco degli operatori per funzionalità
Operatori logici e bit per bit in Visual Basic
Proprietà (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

In questa pagina sono elencate le proprietà che sono membri dei moduli Visual Basic. Le altre proprietà che
sono membri di oggetti Visual Basic specifici sono elencate in oggetti.

Proprietà Visual Basic

DateString Restituisce o imposta un String valore che rappresenta la


data corrente in base al sistema.

Now Restituisce un Date valore contenente la data e l'ora


correnti in base al sistema.

ScriptEngine Restituisce un valore String che rappresenta il runtime


correntemente in uso.

ScriptEngineBuildVersion Restituisce un oggetto Integer contenente il numero di


versione della build del Runtime attualmente in uso.

ScriptEngineMajorVersion Restituisce un oggetto Integer contenente il numero di


versione principale del Runtime attualmente in uso.

ScriptEngineMinorVersion Restituisce un oggetto Integer contenente il numero di


versione secondario del Runtime attualmente in uso.

TimeOfDay Restituisce o imposta un valore Date contenente l'ora


corrente del sistema in uso.

Timer Restituisce un valore Double che rappresenta il numero di


secondi trascorsi dalla mezzanotte.

TimeString Restituisce o imposta un String valore che rappresenta


l'ora corrente del giorno in base al sistema.

Today Restituisce o imposta un valore Date contenente la data


corrente del sistema in uso.

Vedi anche
Riferimenti al linguaggio Visual Basic
Query (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Visual Basic consente di creare espressioni LINQ (Language-Integrated query) nel codice.

Contenuto della sezione


Aggregate Clause
Descrive la Aggregate clausola che applica una o più funzioni di aggregazione a una raccolta.
Clausola Distinct
Descrive la Distinct clausola, che limita i valori della variabile di intervallo corrente per eliminare i valori
duplicati nei risultati della query.
Clausola from
Descrive la From clausola che specifica una raccolta e una variabile di intervallo per una query.
Clausola Group by
Descrive la Group By clausola, che raggruppa gli elementi di un risultato della query e può essere usata per
applicare funzioni di aggregazione a ogni gruppo.
Clausola Group Join
Descrive la Group Join clausola, che combina due raccolte in un'unica raccolta gerarchica.
Clausola join
Descrive la Join clausola, che combina due raccolte in un'unica raccolta.
Clausola Let
Viene descritta la Let clausola, che calcola un valore e lo assegna a una nuova variabile nella query.
Clausola ORDER BY
Descrive la Order By clausola che specifica l'ordinamento delle colonne in una query.
Clausola SELECT
Viene descritta la Select clausola che dichiara un set di variabili di intervallo per una query.
Clausola Skip
Descrive la Skip clausola che ignora un numero specificato di elementi in una raccolta e quindi restituisce gli
elementi rimanenti.
Clausola Skip While
Descrive la Skip While clausola che ignora gli elementi di una raccolta, purché una condizione specificata sia
true e quindi restituisce gli elementi rimanenti.

Clausola Take
Descrive la Take clausola, che restituisce un numero specificato di elementi contigui dall'inizio di una raccolta.
Clausola Take While
Descrive la Take While clausola, che include gli elementi di una raccolta, purché una condizione specificata sia
true e ignori gli elementi rimanenti.

Clausola WHERE
Descrive la Where clausola che specifica una condizione di filtro per una query.
Vedi anche
LINQ
Introduzione a LINQ in Visual Basic
Clausola Aggregate (Visual Basic)
05/03/2021 • 11 minutes to read • Edit Online

Applica una o più funzioni di aggregazione a una raccolta.

Sintassi
Aggregate element [As type] In collection _
[, element2 [As type2] In collection2, [...]]
[ clause ]
Into expressionList

Parti
T ERM IN E DEF IN IZ IO N E

element Obbligatorio. Variabile utilizzata per scorrere gli elementi


della raccolta.

type facoltativo. Tipo di element . Se non viene specificato alcun


tipo, il tipo di element viene dedotto da collection .

collection Obbligatorio. Fa riferimento alla raccolta su cui operare.

clause facoltativo. Una o più clausole di query, ad esempio una


Where clausola, per perfezionare il risultato della query per
applicare la clausola o le clausole Aggregate a.

expressionList Obbligatorio. Una o più espressioni delimitate da virgole che


identificano una funzione di aggregazione da applicare alla
raccolta. È possibile applicare un alias a una funzione di
aggregazione per specificare il nome di un membro per il
risultato della query. Se non viene specificato alcun alias,
viene usato il nome della funzione di aggregazione. Per
esempi, vedere la sezione sulle funzioni di aggregazione più
avanti in questo argomento.

Commenti
La Aggregate clausola può essere utilizzata per includere funzioni di aggregazione nelle query. Le funzioni di
aggregazione eseguono controlli e calcoli su un set di valori e restituiscono un singolo valore. È possibile
accedere al valore calcolato utilizzando un membro del tipo di risultato della query. Le funzioni di aggregazione
standard che è possibile utilizzare sono le All Any funzioni,, Average , Count , LongCount , Max , Min e Sum
. Queste funzioni hanno familiarità con gli sviluppatori che hanno familiarità con le aggregazioni di SQL. Sono
descritti nella sezione seguente di questo argomento.
Il risultato di una funzione di aggregazione viene incluso nel risultato della query come campo del tipo di
risultato della query. È possibile fornire un alias per il risultato della funzione di aggregazione per specificare il
nome del membro del tipo di risultato della query che conterrà il valore di aggregazione. Se non viene
specificato alcun alias, viene usato il nome della funzione di aggregazione.
La Aggregate clausola può iniziare una query oppure può essere inclusa come clausola aggiuntiva in una query.
Se la Aggregate clausola inizia una query, il risultato è un singolo valore che rappresenta il risultato della
funzione di aggregazione specificata nella Into clausola. Se nella clausola viene specificata più di una funzione
di aggregazione Into , la query restituisce un singolo tipo con una proprietà separata per fare riferimento al
risultato di ogni funzione di aggregazione nella Into clausola. Se la Aggregate clausola viene inclusa come
clausola aggiuntiva in una query, il tipo restituito nella raccolta di query avrà una proprietà separata per fare
riferimento al risultato di ogni funzione di aggregazione nella Into clausola.

Funzioni di aggregazione
Di seguito sono riportate le funzioni di aggregazione standard che è possibile utilizzare con la Aggregate
clausola.
Tutti
Restituisce true se tutti gli elementi della raccolta soddisfano una condizione specificata; in caso contrario,
restituisce false . Di seguito è riportato un esempio:

Dim customerList1 = Aggregate order In orders


Into AllOrdersOver100 = All(order.Total >= 100)

Qualsiasi
Restituisce true se un elemento della raccolta soddisfa una condizione specificata; in caso contrario, restituisce
false . Di seguito è riportato un esempio:

Dim customerList2 = From cust In customers


Aggregate order In cust.Orders
Into AnyOrderOver500 = Any(order.Total >= 500)

Media
Calcola la media di tutti gli elementi della raccolta o calcola un'espressione fornita per tutti gli elementi della
raccolta. Di seguito è riportato un esempio:

Dim customerOrderAverage = Aggregate order In orders


Into Average(order.Total)

Conteggio
Conta il numero di elementi nella raccolta. È possibile specificare un'espressione facoltativa Boolean per contare
solo il numero di elementi della raccolta che soddisfano una condizione. Di seguito è riportato un esempio:

Dim customerOrderAfter1996 = From cust In customers


Aggregate order In cust.Orders
Into Count(order.OrderDate > #12/31/1996#)

Group
Fa riferimento ai risultati della query raggruppati come risultato di una Group By clausola o Group Join . La
Group funzione è valida solo nella Into clausola di una Group By clausola o Group Join . Per ulteriori
informazioni ed esempi, vedere clausola Group by e clausola Group Join.
LongCount
Conta il numero di elementi nella raccolta. È possibile specificare un'espressione facoltativa Boolean per contare
solo il numero di elementi della raccolta che soddisfano una condizione. Restituisce il risultato come Long . Per
un esempio, vedere la Count funzione Aggregate.
Max
Calcola il valore massimo dalla raccolta oppure calcola un'espressione fornita per tutti gli elementi della raccolta.
Di seguito è riportato un esempio:

Dim customerMaxOrder = Aggregate order In orders


Into MaxOrder = Max(order.Total)

Min
Calcola il valore minimo dalla raccolta oppure calcola un'espressione fornita per tutti gli elementi della raccolta.
Di seguito è riportato un esempio:

Dim customerMinOrder = From cust In customers


Aggregate order In cust.Orders
Into MinOrder = Min(order.Total)

Sum
Calcola la somma di tutti gli elementi della raccolta o calcola un'espressione fornita per tutti gli elementi della
raccolta. Di seguito è riportato un esempio:

Dim customerTotals = From cust In customers


Aggregate order In cust.Orders
Into Sum(order.Total)

Esempio
Nell'esempio seguente viene illustrato come utilizzare la Aggregate clausola per applicare funzioni di
aggregazione a un risultato della query.

Public Sub AggregateSample()


Dim customers = GetCustomerList()

Dim customerOrderTotal =
From cust In customers
Aggregate order In cust.Orders
Into Sum(order.Total), MaxOrder = Max(order.Total),
MinOrder = Min(order.Total), Avg = Average(order.Total)

For Each customer In customerOrderTotal


Console.WriteLine(customer.cust.CompanyName & vbCrLf &
vbTab & "Sum = " & customer.Sum & vbCrLf &
vbTab & "Min = " & customer.MinOrder & vbCrLf &
vbTab & "Max = " & customer.MaxOrder & vbCrLf &
vbTab & "Avg = " & customer.Avg.ToString("#.##"))
Next
End Sub

Creazione di funzioni di aggregazione User-Defined


È possibile includere funzioni di aggregazione personalizzate in un'espressione di query aggiungendo metodi di
estensione al IEnumerable<T> tipo. Il metodo personalizzato può quindi eseguire un calcolo o un'operazione
sulla raccolta enumerabile che ha fatto riferimento alla funzione di aggregazione. Per altre informazioni sui
metodi di estensione, vedere Metodi di estensione.
Nell'esempio seguente viene illustrata una funzione di aggregazione personalizzata che calcola il valore
mediano di una raccolta di numeri. Esistono due overload del Median metodo di estensione. Il primo overload
accetta come input una raccolta di tipo IEnumerable(Of Double) . Se la Median funzione di aggregazione viene
chiamata per un campo di query di tipo Double , questo metodo verrà chiamato. Il secondo overload del
Median metodo può essere passato a qualsiasi tipo generico. L'overload generico del Median metodo accetta
un secondo parametro che fa riferimento all' Func(Of T, Double) espressione lambda per proiettare un valore
per un tipo (da una raccolta) come valore corrispondente di tipo Double . Delega quindi il calcolo del valore
mediano all'altro overload del Median metodo. Per ulteriori informazioni sulle espressioni lambda, vedere
espressioni lambda.

Imports System.Runtime.CompilerServices

Module UserDefinedAggregates

' Calculate the median value for a collection of type Double.


<Extension()>
Function Median(ByVal values As IEnumerable(Of Double)) As Double
If values.Count = 0 Then
Throw New InvalidOperationException("Cannot compute median for an empty set.")
End If

Dim sortedList = From number In values


Order By number

Dim medianValue As Double

Dim itemIndex = CInt(Int(sortedList.Count / 2))

If sortedList.Count Mod 2 = 0 Then


' Even number of items in list.
medianValue = ((sortedList(itemIndex) + sortedList(itemIndex - 1)) / 2)
Else
' Odd number of items in list.
medianValue = sortedList(itemIndex)
End If

Return medianValue
End Function

' "Cast" the collection of generic items as type Double and call the
' Median() method to calculate the median value.
<Extension()>
Function Median(Of T)(ByVal values As IEnumerable(Of T),
ByVal selector As Func(Of T, Double)) As Double
Return (From element In values Select selector(element)).Median()
End Function

End Module

Nell'esempio seguente vengono illustrate query di esempio che chiamano la Median funzione di aggregazione
su una raccolta di tipo Integer e una raccolta di tipo Double . La query che chiama la Median funzione di
aggregazione sulla raccolta di tipo Double chiama l'overload del Median metodo che accetta come input una
raccolta di tipo Double . La query che chiama la Median funzione di aggregazione sulla raccolta di tipo Integer
chiama l'overload generico del Median metodo.
Module Module1

Sub Main()
Dim numbers1 = {1, 2, 3, 4, 5}

Dim query1 = Aggregate num In numbers1 Into Median(num)

Console.WriteLine("Median = " & query1)

Dim numbers2 = {1.9, 2, 8, 4, 5.7, 6, 7.2, 0}

Dim query2 = Aggregate num In numbers2 Into Median()

Console.WriteLine("Median = " & query2)


End Sub

End Module

Vedi anche
Introduzione a LINQ in Visual Basic
Query
Clausola SELECT
Clausola from
Clausola WHERE
Clausola Group by
Clausola Distinct (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Limita i valori della variabile di intervallo corrente per eliminare i valori duplicati nelle clausole di query
successive.

Sintassi
Distinct

Osservazioni
È possibile utilizzare la Distinct clausola per restituire un elenco di elementi univoci. La Distinct clausola fa in
modo che la query ignori i risultati di query duplicati. La Distinct clausola si applica ai valori duplicati per tutti
i campi restituiti specificati dalla Select clausola. Se non Select viene specificata alcuna clausola, la Distinct
clausola viene applicata alla variabile di intervallo per la query identificata nella From clausola. Se la variabile di
intervallo non è un tipo non modificabile, la query ignorerà solo il risultato di una query se tutti i membri del
tipo corrispondono a un risultato della query esistente.

Esempio
L'espressione di query seguente unisce un elenco di clienti e un elenco di ordini dei clienti. La Distinct clausola
viene inclusa per restituire un elenco di nomi di clienti e date degli ordini univoci.

Dim customerOrders = From cust In customers, ord In orders


Where cust.CustomerID = ord.CustomerID
Select cust.CompanyName, ord.OrderDate
Distinct

Vedi anche
Introduzione a LINQ in Visual Basic
Query
Clausola from
Clausola SELECT
Clausola WHERE
Clausola Equals (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Confronta le chiavi delle raccolte da unire in join.

Commenti
La Equals parola chiave viene usata nei contesti seguenti:
Clausola Group Join
Clausola join

Vedi anche
Parole chiave
Clausola From (Visual Basic)
05/03/2021 • 6 minutes to read • Edit Online

Specifica una o più variabili di intervallo e una raccolta su cui eseguire una query.

Sintassi
From element [ As type ] In collection [ _ ]
[, element2 [ As type2 ] In collection2 [, ... ] ]

Parti
T ERM IN E DEF IN IZ IO N E

element Obbligatorio. Variabile di intervallo utilizzata per scorrere gli


elementi della raccolta. Una variabile di intervallo viene
utilizzata per fare riferimento a ogni membro di
collection mentre la query scorre collection . Deve
essere un tipo enumerabile.

type facoltativo. Tipo di element . Se non type viene specificato


alcun parametro, il tipo di element viene dedotto da
collection .

collection Obbligatorio. Fa riferimento alla raccolta su cui eseguire una


query. Deve essere un tipo enumerabile.

Commenti
La From clausola viene utilizzata per identificare i dati di origine per una query e le variabili utilizzate per fare
riferimento a un elemento della raccolta di origine. Queste variabili sono denominate variabili di intervallo. La
From clausola è obbligatoria per una query, tranne quando la Aggregate clausola viene utilizzata per
identificare una query che restituisce solo i risultati aggregati. Per ulteriori informazioni, vedere clausola
Aggregate.
È possibile specificare più From clausole in una query per identificare più raccolte da unire in join. Quando si
specificano più raccolte, vengono ripetute in modo indipendente oppure è possibile unirle se sono correlate. È
possibile unire le raccolte in modo implicito usando la Select clausola oppure in modo esplicito usando le
Join Group Join clausole o. In alternativa, è possibile specificare più variabili di intervallo e raccolte in una
singola From clausola, con ogni variabile di intervallo e raccolta correlate separate dalle altre da una virgola.
Nell'esempio di codice seguente vengono illustrate entrambe le opzioni di sintassi per la From clausola.

' Multiple From clauses in a query.


Dim result = From var1 In collection1, var2 In collection2

' Equivalent syntax with a single From clause.


Dim result2 = From var1 In collection1
From var2 In collection2
La From clausola definisce l'ambito di una query, che è simile all'ambito di un For ciclo. Ogni element
variabile di intervallo nell'ambito di una query deve pertanto avere un nome univoco. Poiché è possibile
specificare più From clausole per una query, From le clausole successive possono fare riferimento alle variabili
di intervallo nella From clausola oppure possono fare riferimento alle variabili di intervallo in una From
clausola precedente. Ad esempio, nell'esempio seguente viene illustrata una clausola annidata From in cui la
raccolta nella seconda clausola è basata su una proprietà della variabile di intervallo nella prima clausola.

Dim allOrders = From cust In GetCustomerList()


From ord In cust.Orders
Select ord

Ogni From clausola può essere seguita da qualsiasi combinazione di clausole di query aggiuntive per
perfezionare la query. È possibile affinare la query nei modi seguenti:
Combinare più raccolte in modo implicito usando From le Select clausole e oppure in modo esplicito
usando Join le Group Join clausole o.
Utilizzare la Where clausola per filtrare il risultato della query.
Ordinare il risultato usando la Order By clausola.
Raggruppare i risultati simili utilizzando la Group By clausola.
Utilizzare la Aggregate clausola per identificare le funzioni di aggregazione da valutare per l'intero
risultato della query.
Utilizzare la Let clausola per introdurre una variabile di iterazione il cui valore è determinato da
un'espressione anziché da una raccolta.
Utilizzare la Distinct clausola per ignorare i risultati della query duplicati.
Identificare le parti del risultato da restituire utilizzando le Skip Take clausole,, Skip While e
Take While .

Esempio
Nell'espressione di query seguente viene utilizzata una From clausola per dichiarare una variabile di intervallo
cust per ogni Customer oggetto della customers raccolta. La Where clausola usa la variabile di intervallo per
limitare l'output ai clienti dall'area specificata. Il For Each ciclo Visualizza il nome della società per ogni cliente
nel risultato della query.

Sub DisplayCustomersForRegion(ByVal customers As List(Of Customer),


ByVal region As String)

Dim customersForRegion = From cust In customers


Where cust.Region = region

For Each cust In customersForRegion


Console.WriteLine(cust.CompanyName)
Next
End Sub

Vedi anche
Query
Introduzione a LINQ in Visual Basic
Istruzione For Each...Next
Istruzione For...Next
Clausola SELECT
Clausola WHERE
Aggregate Clause
Clausola Distinct
Clausola join
Clausola Group Join
Clausola ORDER BY
Clausola Let
Clausola Skip
Clausola Take
Clausola Skip While
Clausola Take While
Clausola Group By (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Raggruppa gli elementi di un risultato della query. Può essere usata anche per applicare funzioni di
aggregazione a ogni gruppo. L'operazione di raggruppamento è basata su una o più chiavi.

Sintassi
Group [ listField1 [, listField2 [...] ] By keyExp1 [, keyExp2 [...] ]
Into aggregateList

Parti
listField1 , listField2

facoltativo. Uno o più campi della variabile o delle variabili di query che identificano in modo esplicito i
campi da includere nel risultato raggruppato. Se non sono specificati campi, tutti i campi della variabile o
delle variabili di query vengono inclusi nel risultato raggruppato.
keyExp1

Obbligatorio. Espressione che identifica la chiave da usare per determinare i gruppi di elementi. È
possibile specificare più di una chiave per specificare una chiave composta.
keyExp2

facoltativo. Uno o più tasti aggiuntivi che vengono combinati con keyExp1 per creare una chiave
composta.
aggregateList

Obbligatorio. Una o più espressioni che identificano come vengono aggregati i gruppi. Per identificare un
nome di membro per i risultati raggruppati, usare la parola chiave Group , che può essere in uno dei
seguenti formati:

Into Group

-oppure-

Into <alias> = Group

È anche possibile includere funzioni di aggregazione da applicare al gruppo.

Commenti
È possibile usare la clausola Group By per suddividere i risultati di una query in gruppi. Il raggruppamento è
basato su una chiave o una chiave composta costituita da più chiavi. Gli elementi associati ai valori della chiave
corrispondenti vengono inclusi nello stesso gruppo.
Per identificare il nome del membro che viene usato per fare riferimento al gruppo, usare il parametro
aggregateList della clausola Into e la parola chiave Group . È anche possibile includere funzioni di
aggregazione nella clausola Into per calcolare i valori per gli elementi raggruppati. Per un elenco di funzioni di
aggregazione standard, vedere Aggregate Clause.

Esempio
L'esempio di codice seguente raggruppa un elenco di clienti in base alla relativa posizione (paese/area
geografica) e fornisce un conteggio dei clienti in ogni gruppo. I risultati vengono ordinati in base al nome del
paese/area geografica. I risultati raggruppati vengono ordinati in base al nome della città.

Public Sub GroupBySample()


Dim customers = GetCustomerList()

Dim customersByCountry = From cust In customers


Order By cust.City
Group By CountryName = cust.Country
Into RegionalCustomers = Group, Count()
Order By CountryName

For Each country In customersByCountry


Console.WriteLine(country.CountryName &
" (" & country.Count & ")" & vbCrLf)

For Each customer In country.RegionalCustomers


Console.WriteLine(vbTab & customer.CompanyName &
" (" & customer.City & ")")
Next
Next
End Sub

Vedi anche
Introduzione a LINQ in Visual Basic
Query
Clausola SELECT
Clausola from
Clausola ORDER BY
Aggregate Clause
Clausola Group Join
Clausola Group Join (Visual Basic)
05/03/2021 • 5 minutes to read • Edit Online

Combina due raccolte in un'unica raccolta gerarchica. L'operazione di join è basata sulle chiavi corrispondenti.

Sintassi
Group Join element [As type] In collection _
On key1 Equals key2 [ And key3 Equals key4 [... ] ] _
Into expressionList

Parti
T ERM IN E DEF IN IZ IO N E

element Obbligatorio. Variabile di controllo per la raccolta da unire in


join.

type facoltativo. Tipo di element . Se non type viene specificato


alcun parametro, il tipo di element viene dedotto da
collection .

collection Obbligatorio. Raccolta da combinare con la raccolta che si


trova sul lato sinistro dell' Group Join operatore. Una
Group Join clausola può essere annidata in una Join
clausola o in un'altra Group Join clausola.

key1 Equals key2 Obbligatorio. Identifica le chiavi per le raccolte da unire in


join. Equals Per confrontare le chiavi delle raccolte da unire
in join, è necessario usare l'operatore. È possibile combinare
le condizioni di join usando l' And operatore per identificare
più chiavi. Il key1 parametro deve essere dalla raccolta a
sinistra dell' Join operatore. Il key2 parametro deve
essere dalla raccolta a destra dell' Join operatore.

Le chiavi utilizzate nella condizione di join possono essere


espressioni che includono più di un elemento della raccolta.
Ogni espressione chiave può tuttavia contenere solo
elementi della rispettiva raccolta.

expressionList Obbligatorio. Una o più espressioni che identificano la


modalità di aggregazione dei gruppi di elementi della
raccolta. Per identificare un nome di membro per i risultati
raggruppati, usare la Group parola chiave (
<alias> = Group ). È anche possibile includere funzioni di
aggregazione da applicare al gruppo.

Commenti
La Group Join clausola combina due raccolte in base ai valori di chiave corrispondenti delle raccolte da unire in
join. La raccolta risultante può contenere un membro che fa riferimento a una raccolta di elementi della seconda
raccolta che corrispondono al valore della chiave della prima raccolta. È inoltre possibile specificare le funzioni di
aggregazione da applicare agli elementi raggruppati della seconda raccolta. Per informazioni sulle funzioni di
aggregazione, vedere clausola Aggregate.
Si consideri, ad esempio, una raccolta di Manager e una raccolta di dipendenti. Gli elementi di entrambe le
raccolte hanno una proprietà ManagerID che identifica i dipendenti che riferiscono a un particolare
responsabile. I risultati di un'operazione di join contengono un risultato per ogni responsabile e dipendente con
un valore ManagerID corrispondente. I risultati di un' Group Join operazione contengono l'elenco completo dei
Manager. Ogni risultato di gestione avrà un membro che fa riferimento all'elenco di dipendenti che
corrispondevano al responsabile specifico.
La raccolta risultante da un' Group Join operazione può contenere qualsiasi combinazione di valori della
raccolta identificata nella From clausola e le espressioni identificate nella Into clausola della clausola
Group Join . Per ulteriori informazioni sulle espressioni valide per la Into clausola, vedere clausola Aggregate.

Un' Group Join operazione restituirà tutti i risultati della raccolta identificata sul lato sinistro dell' Group Join
operatore. Questo vale anche se non sono presenti corrispondenze nella raccolta da unire in join. Questa
operazione è simile a LEFT OUTER JOIN in SQL.
È possibile usare la Join clausola per combinare le raccolte in un'unica raccolta. Equivale a un INNER JOIN in
SQL.

Esempio
L'esempio di codice seguente unisce due raccolte usando la Group Join clausola.

Dim customerList = From cust In customers


Group Join ord In orders On
cust.CustomerID Equals ord.CustomerID
Into CustomerOrders = Group,
OrderTotal = Sum(ord.Total)
Select cust.CompanyName, cust.CustomerID,
CustomerOrders, OrderTotal

For Each customer In customerList


Console.WriteLine(customer.CompanyName &
" (" & customer.OrderTotal & ")")

For Each order In customer.CustomerOrders


Console.WriteLine(vbTab & order.OrderID & ": " & order.Total)
Next
Next

Vedi anche
Introduzione a LINQ in Visual Basic
Query
Clausola SELECT
Clausola from
Clausola join
Clausola WHERE
Clausola Group by
Clausola Join (Visual Basic)
05/03/2021 • 5 minutes to read • Edit Online

Combina due raccolte in un'unica raccolta. L'operazione di join è basata sulle chiavi corrispondenti e usa l'
Equals operatore.

Sintassi
Join element In collection _
[ joinClause _ ]
[ groupJoinClause ... _ ]
On key1 Equals key2 [ And key3 Equals key4 [... ]

Parti
element Obbligatorio. Variabile di controllo per la raccolta da unire in join.
collection
Obbligatorio. Raccolta da combinare con la raccolta identificata sul lato sinistro dell' Join operatore. Una Join
clausola può essere annidata in un'altra Join clausola o in una Group Join clausola.
joinClause
facoltativo. Una o più Join clausole aggiuntive per perfezionare ulteriormente la query.
groupJoinClause
facoltativo. Una o più Group Join clausole aggiuntive per perfezionare ulteriormente la query.
key1 Equals key2
Obbligatorio. Identifica le chiavi per le raccolte da unire in join. Equals Per confrontare le chiavi delle raccolte da
unire in join, è necessario usare l'operatore. È possibile combinare le condizioni di join usando l' And operatore
per identificare più chiavi. key1 deve derivare dalla raccolta a sinistra dell' Join operatore. key2 deve derivare
dalla raccolta a destra dell' Join operatore.
Le chiavi utilizzate nella condizione di join possono essere espressioni che includono più di un elemento della
raccolta. Ogni espressione chiave può tuttavia contenere solo elementi della rispettiva raccolta.

Commenti
La Join clausola combina due raccolte in base ai valori di chiave corrispondenti delle raccolte da unire in join.
La raccolta risultante può contenere qualsiasi combinazione di valori della raccolta identificata sul lato sinistro
dell' Join operatore e della raccolta identificata nella Join clausola. La query restituirà solo i risultati per i
quali viene soddisfatta la condizione specificata dall' Equals operatore. Equivale a un INNER JOIN in SQL.
È possibile utilizzare più Join clausole in una query per unire due o più raccolte in un'unica raccolta.
È possibile eseguire un join implicito per combinare raccolte senza la Join clausola. A tale scopo, includere più
In clausole nella From clausola e specificare una Where clausola che identifichi le chiavi che si desidera
utilizzare per il join.
È possibile usare la Group Join clausola per combinare le raccolte in un'unica raccolta gerarchica. Questa
operazione è simile a LEFT OUTER JOIN in SQL.
Esempio
Nell'esempio di codice seguente viene eseguito un join implicito per combinare un elenco di clienti con i relativi
ordini.

Dim customerIDs() = {"ALFKI", "VICTE", "BLAUS", "TRAIH"}

Dim customerList = From cust In customers, custID In customerIDs


Where cust.CustomerID = custID
Select cust.CompanyName

For Each companyName In customerList


Console.WriteLine(companyName)
Next

Esempio
L'esempio di codice seguente unisce due raccolte usando la Join clausola.

Imports System.Diagnostics
Imports System.Security.Permissions

Public Class JoinSample

<SecurityPermission(SecurityAction.Demand)>
Public Sub ListProcesses()
Dim processDescriptions As New List(Of ProcessDescription)
processDescriptions.Add(New ProcessDescription With {
.ProcessName = "explorer",
.Description = "Windows Explorer"})
processDescriptions.Add(New ProcessDescription With {
.ProcessName = "winlogon",
.Description = "Windows Logon"})
processDescriptions.Add(New ProcessDescription With {
.ProcessName = "cmd",
.Description = "Command Window"})
processDescriptions.Add(New ProcessDescription With {
.ProcessName = "iexplore",
.Description = "Internet Explorer"})

Dim processes = From proc In Process.GetProcesses


Join desc In processDescriptions
On proc.ProcessName Equals desc.ProcessName
Select proc.ProcessName, proc.Id, desc.Description

For Each proc In processes


Console.WriteLine("{0} ({1}), {2}",
proc.ProcessName, proc.Id, proc.Description)
Next
End Sub

End Class

Public Class ProcessDescription


Public ProcessName As String
Public Description As String
End Class

In questo esempio verrà generato un output simile al seguente:


winlogon (968), Windows Logon
explorer (2424), File Explorer

cmd (5136), Command Window

Esempio
Nell'esempio di codice seguente vengono unite due raccolte utilizzando la Join clausola con due colonne
chiave.

Imports System.Diagnostics
Imports System.Security.Permissions

Public Class JoinSample2

<SecurityPermission(SecurityAction.Demand)>
Public Sub ListProcesses()
Dim processDescriptions As New List(Of ProcessDescription2)

' 8 = Normal priority, 13 = High priority


processDescriptions.Add(New ProcessDescription2 With {
.ProcessName = "explorer",
.Description = "Windows Explorer",
.Priority = 8})
processDescriptions.Add(New ProcessDescription2 With {
.ProcessName = "winlogon",
.Description = "Windows Logon",
.Priority = 13})
processDescriptions.Add(New ProcessDescription2 With {
.ProcessName = "cmd",
.Description = "Command Window",
.Priority = 8})
processDescriptions.Add(New ProcessDescription2 With {
.ProcessName = "iexplore",
.Description = "Internet Explorer",
.Priority = 8})

Dim processes = From proc In Process.GetProcesses


Join desc In processDescriptions
On proc.ProcessName Equals desc.ProcessName And
proc.BasePriority Equals desc.Priority
Select proc.ProcessName, proc.Id, desc.Description,
desc.Priority

For Each proc In processes


Console.WriteLine("{0} ({1}), {2}, Priority = {3}",
proc.ProcessName,
proc.Id,
proc.Description,
proc.Priority)
Next
End Sub

End Class

Public Class ProcessDescription2


Public ProcessName As String
Public Description As String
Public Priority As Integer
End Class

Nell'esempio viene generato un output simile al seguente:


winlogon (968), Windows Logon, Priority = 13

cmd (700), Command Window, Priority = 8


explorer (2424), File Explorer, Priority = 8

Vedi anche
Introduzione a LINQ in Visual Basic
Query
Clausola SELECT
Clausola from
Clausola Group Join
Clausola WHERE
Clausola Let (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Calcola un valore e lo assegna a una nuova variabile all'interno della query.

Sintassi
Let variable = expression [, ...]

Parti
T ERM IN E DEF IN IZ IO N E

variable Obbligatorio. Alias che può essere utilizzato per fare


riferimento ai risultati dell'espressione fornita.

expression Obbligatorio. Espressione che verrà valutata e assegnata alla


variabile specificata.

Commenti
La Let clausola consente di calcolare i valori per ogni risultato della query e di farvi riferimento tramite un
alias. L'alias può essere utilizzato in altre clausole, ad esempio la Where clausola. La Let clausola consente di
creare un'istruzione di query più semplice da leggere poiché è possibile specificare un alias per una clausola
Expression inclusa nella query e sostituire l'alias ogni volta che viene utilizzata la clausola Expression.
È possibile includere un numero qualsiasi variable di expression assegnazioni e nella Let clausola. Separare
ogni assegnazione con una virgola (,).

Esempio
Nell'esempio di codice seguente viene usata la Let clausola per calcolare uno sconto del 10% sui prodotti.

Dim discountedProducts = From prod In products


Let Discount = prod.UnitPrice * 0.1
Where Discount >= 50
Select prod.ProductName, prod.UnitPrice, Discount

For Each prod In discountedProducts


Console.WriteLine("Product: {0}, Price: {1}, Discounted Price: {2}",
prod.ProductName, prod.UnitPrice.ToString("$#.00"),
(prod.UnitPrice - prod.Discount).ToString("$#.00"))
Next

Vedi anche
Introduzione a LINQ in Visual Basic
Query
Clausola SELECT
Clausola from
Clausola WHERE
Clausola Order By (Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

Specifica l'ordinamento per il risultato di una query.

Sintassi
Order By orderExp1 [ Ascending | Descending ] [, orderExp2 [...] ]

Parti
orderExp1
Obbligatorio. Uno o più campi dal risultato della query corrente che identificano la modalità di ordinamento dei
valori restituiti. I nomi dei campi devono essere separati da virgole (,). È possibile identificare ogni campo come
ordinato in ordine crescente o decrescente usando le Ascending Descending parole chiave o. Se non Ascending
Descending viene specificata alcuna parola chiave o, l'ordinamento predefinito è crescente. Ai campi di
ordinamento viene assegnata la precedenza da sinistra a destra.

Commenti
È possibile utilizzare la Order By clausola per ordinare i risultati di una query. La Order By clausola può
ordinare solo un risultato in base alla variabile di intervallo per l'ambito corrente. Ad esempio, la Select
clausola introduce un nuovo ambito in un'espressione di query con nuove variabili di iterazione per tale ambito.
Le variabili di intervallo definite prima Select di una clausola in una query non sono disponibili dopo la
Select clausola. Se pertanto si desidera ordinare i risultati in base a un campo non disponibile nella Select
clausola, è necessario inserire la Order By clausola prima della Select clausola. Un esempio di quando è
necessario eseguire questa operazione è quando si desidera ordinare la query in base a campi che non vengono
restituiti come parte del risultato.
L'ordine crescente e decrescente per un campo è determinato dall'implementazione dell' IComparable
interfaccia per il tipo di dati del campo. Se il tipo di dati non implementa l' IComparable interfaccia,
l'ordinamento viene ignorato.

Esempio
Nell'espressione di query seguente viene utilizzata una From clausola per dichiarare una variabile di intervallo
book per la books raccolta. La Order By clausola Ordina il risultato della query in base al prezzo in ordine
crescente (impostazione predefinita). I libri con lo stesso prezzo vengono ordinati in base al titolo in ordine
crescente. La Select clausola seleziona le Title Price proprietà e come valori restituiti dalla query.

Dim titlesAscendingPrice = From book In books


Order By book.Price, book.Title
Select book.Title, book.Price

Esempio
Nell'espressione di query seguente viene utilizzata la Order By clausola per ordinare il risultato della query in
base al prezzo in ordine decrescente. I libri con lo stesso prezzo vengono ordinati in base al titolo in ordine
crescente.

Dim titlesDescendingPrice = From book In books


Order By book.Price Descending, book.Title
Select book.Title, book.Price

Esempio
Nell'espressione di query seguente viene utilizzata una Select clausola per selezionare titolo, prezzo, data di
pubblicazione e autore. Quindi compila i Title Price campi,, PublishDate e Author della variabile di
intervallo per il nuovo ambito. La Order By clausola Ordina la nuova variabile di intervallo in base al nome
dell'autore, al titolo del libro e quindi al prezzo. Ogni colonna viene ordinata in base all'ordine predefinito
(ascendente).

Dim bookOrders =
From book In books
Select book.Title, book.Price, book.PublishDate, book.Author
Order By Author, Title, Price

Vedi anche
Introduzione a LINQ in Visual Basic
Query
Clausola SELECT
Clausola from
Clausola Select (Visual Basic)
05/03/2021 • 6 minutes to read • Edit Online

Definisce il risultato di una query.

Sintassi
Select [ var1 = ] fieldName1 [, [ var2 = ] fieldName2 [...] ]

Parti
var1
facoltativo. Alias che può essere utilizzato per fare riferimento ai risultati dell'espressione di colonna.
fieldName1
Obbligatorio. Nome del campo da restituire nel risultato della query.

Commenti
È possibile utilizzare la Select clausola per definire i risultati che devono essere restituiti da una query. Ciò
consente di definire i membri di un nuovo tipo anonimo creato da una query o di destinare i membri di un tipo
denominato restituito da una query. La Select clausola non è obbligatoria per una query. Se non Select viene
specificata alcuna clausola, la query restituirà un tipo basato su tutti i membri delle variabili di intervallo
identificate per l'ambito corrente. Per ulteriori informazioni, vedere tipi anonimi. Quando una query crea un tipo
denominato, restituirà un risultato di tipo IEnumerable<T> dove T è il tipo creato.
La Select clausola può fare riferimento a qualsiasi variabile nell'ambito corrente. Sono incluse le variabili di
intervallo identificate nella From clausola o nelle From clausole. Include anche tutte le nuove variabili create
con un alias dalle Aggregate Let Group By clausole,, o o Group Join dalle variabili di una Select clausola
precedente nell'espressione di query. La Select clausola può includere anche valori statici. Nell'esempio di
codice seguente, ad esempio, viene illustrata un'espressione di query in cui la Select clausola definisce il
risultato della query come nuovo tipo anonimo con quattro membri: ProductName , Price , Discount e
DiscountedPrice . I ProductName Price valori dei membri e vengono ricavati dalla variabile di intervallo di
prodotti definita nella From clausola. Il DiscountedPrice valore del membro viene calcolato nella Let clausola.
Il Discount membro è un valore statico.

' 10% discount


Dim discount_10 = 0.1
Dim priceList =
From product In products
Let DiscountedPrice = product.UnitPrice * (1 - discount_10)
Select product.ProductName, Price = product.UnitPrice,
Discount = discount_10, DiscountedPrice

La Select clausola introduce un nuovo set di variabili di intervallo per le clausole di query successive e le
variabili di intervallo precedenti non sono più nell'ambito. L'ultima Select clausola in un'espressione di query
determina il valore restituito dalla query. Ad esempio, la query seguente restituisce il nome e l'ID dell'azienda
per ogni ordine cliente per il quale il totale supera 500. La prima Select clausola identifica le variabili di
intervallo per la Where clausola e la seconda Select clausola. La seconda Select clausola identifica i valori
restituiti dalla query come un nuovo tipo anonimo.

Dim customerList = From cust In customers, ord In cust.Orders


Select Name = cust.CompanyName,
Total = ord.Total, ord.OrderID
Where Total > 500
Select Name, OrderID

Se la Select clausola identifica un singolo elemento da restituire, l'espressione di query restituisce una raccolta
del tipo di quel singolo elemento. Se la Select clausola identifica più elementi da restituire, l'espressione di
query restituisce una raccolta di un nuovo tipo anonimo, in base agli elementi selezionati. Ad esempio, le due
query seguenti restituiscono raccolte di due tipi diversi in base alla Select clausola. La prima query restituisce
una raccolta di nomi di società come stringhe. La seconda query restituisce una raccolta di Customer oggetti
popolati con i nomi e le informazioni sull'indirizzo della società.

Dim customerNames = From cust In customers


Select cust.CompanyName

Dim customerInfo As IEnumerable(Of Customer) =


From cust In customers
Select New Customer With {.CompanyName = cust.CompanyName,
.Address = cust.Address,
.City = cust.City,
.Region = cust.Region,
.Country = cust.Country}

Esempio
Nell'espressione di query seguente viene utilizzata una From clausola per dichiarare una variabile di intervallo
cust per la customers raccolta. La Select clausola seleziona il nome e il valore ID del cliente e popola
CompanyName le CustomerID colonne e della nuova variabile di intervallo. L' For Each istruzione esegue il ciclo
di ogni oggetto restituito e visualizza le CompanyName CustomerID colonne e per ogni record.

Sub SelectCustomerNameAndId(ByVal customers() As Customer)


Dim nameIds = From cust In customers
Select cust.CompanyName, cust.CustomerID
For Each nameId In nameIds
Console.WriteLine(nameId.CompanyName & ": " & nameId.CustomerID)
Next
End Sub

Vedi anche
Introduzione a LINQ in Visual Basic
Query
Clausola from
Clausola WHERE
Clausola ORDER BY
Tipi anonimi
Clausola Skip (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Ignora un numero specificato di elementi in una raccolta e quindi restituisce gli elementi rimanenti.

Sintassi
Skip count

Parti
count
Obbligatorio. Valore o espressione che restituisce il numero di elementi della sequenza da ignorare.

Commenti
La Skip clausola fa in modo che una query ignori gli elementi all'inizio di un elenco di risultati e restituisca gli
elementi rimanenti. Il numero di elementi da ignorare è identificato dal count parametro.
È possibile utilizzare la Skip clausola con la Take clausola per restituire un intervallo di dati da qualsiasi
segmento di una query. A tale scopo, passare l'indice del primo elemento dell'intervallo alla Skip clausola e la
dimensione dell'intervallo alla Take clausola.
Quando si utilizza la Skip clausola in una query, potrebbe essere necessario assicurarsi che i risultati vengano
restituiti in un ordine che consentirà alla Skip clausola di ignorare i risultati desiderati. Per ulteriori
informazioni sull'ordinamento dei risultati di query, vedere clausola ORDER BY.
È possibile usare la SkipWhile clausola per specificare che solo determinati elementi vengono ignorati, a
seconda della condizione specificata.

Esempio
Nell'esempio di codice seguente viene utilizzata la Skip clausola insieme alla Take clausola per restituire dati
da una query in pagine. La GetCustomers funzione utilizza la Skip clausola per ignorare i clienti nell'elenco fino
al valore di indice iniziale fornito e utilizza la Take clausola per restituire una pagina di clienti a partire da tale
valore di indice.
Public Sub PagingSample()
Dim pageNumber As Integer = 0
Dim pageSize As Integer = 10

Dim customersPage = GetCustomers(pageNumber * pageSize, pageSize)

Do While customersPage IsNot Nothing


Console.WriteLine(vbCrLf & "Page: " & pageNumber + 1 & vbCrLf)

For Each cust In customersPage


Console.WriteLine(cust.CustomerID & ", " & cust.CompanyName)
Next

Console.WriteLine(vbCrLf)

pageNumber += 1
customersPage = GetCustomers(pageNumber * pageSize, pageSize)
Loop
End Sub

Public Function GetCustomers(ByVal startIndex As Integer,


ByVal pageSize As Integer) As List(Of Customer)

Dim customers = GetCustomerList()

Dim returnCustomers = From cust In customers


Skip startIndex Take pageSize

If returnCustomers.Count = 0 Then Return Nothing

Return returnCustomers
End Function

Vedi anche
Introduzione a LINQ in Visual Basic
Query
Clausola SELECT
Clausola from
Clausola ORDER BY
Clausola Skip While
Clausola Take
Clausola Skip While (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Ignora gli elementi in una raccolta finché una condizione specificata è true e quindi restituisce gli elementi
rimanenti.

Sintassi
Skip While expression

Parti
T ERM IN E DEF IN IZ IO N E

expression Obbligatorio. Espressione che rappresenta una condizione


per cui verificare gli elementi. L'espressione deve restituire un
Boolean valore o un equivalente funzionale, ad esempio un
oggetto Integer da valutare come Boolean .

Commenti
La Skip While clausola ignora gli elementi dall'inizio di un risultato della query fino a quando l'oggetto
specificato expression restituisce false . expression Una volta restituito false , la query restituisce tutti gli
elementi rimanenti. expression Viene ignorato per i risultati rimanenti.
La clausola è Skip While diversa dalla Where clausola in quanto la Where clausola può essere usata per
escludere tutti gli elementi da una query che non soddisfano una determinata condizione. La Skip While
clausola esclude gli elementi solo fino alla prima volta che la condizione non viene soddisfatta. La Skip While
clausola è particolarmente utile quando si lavora con un risultato di query ordinato.
È possibile ignorare un numero specifico di risultati dall'inizio di un risultato della query usando la Skip
clausola.

Esempio
Nell'esempio di codice seguente viene utilizzata la Skip While clausola per ignorare i risultati fino a quando
non viene trovato il primo cliente del Stati Uniti.
Public Sub SkipWhileSample()
Dim customers = GetCustomerList()

' Return customers starting from the first U.S. customer encountered.
Dim customerList = From cust In customers
Order By cust.Country
Skip While IsInternationalCustomer(cust)

For Each cust In customerList


Console.WriteLine(cust.CompanyName & vbTab & cust.Country)
Next
End Sub

Public Function IsInternationalCustomer(ByVal cust As Customer) As Boolean


If cust.Country = "USA" Then Return False

Return True
End Function

Vedi anche
Introduzione a LINQ in Visual Basic
Query
Clausola SELECT
Clausola from
Clausola Skip
Clausola Take While
Clausola WHERE
Clausola Take (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Restituisce un numero specificato di elementi contigui dall'inizio di una raccolta.

Sintassi
Take count

Parti
count
Obbligatorio. Valore o espressione che restituisce il numero di elementi della sequenza da restituire.

Commenti
La Take clausola fa in modo che una query includa un numero specificato di elementi contigui dall'inizio di un
elenco di risultati. Il numero di elementi da includere è specificato dal count parametro.
È possibile utilizzare la Take clausola con la Skip clausola per restituire un intervallo di dati da qualsiasi
segmento di una query. A tale scopo, passare l'indice del primo elemento dell'intervallo alla Skip clausola e la
dimensione dell'intervallo alla Take clausola. In questo caso, la Take clausola deve essere specificata dopo la
Skip clausola.

Quando si utilizza la Take clausola in una query, potrebbe essere necessario assicurarsi che i risultati vengano
restituiti in un ordine che consenta alla Take clausola di includere i risultati desiderati. Per ulteriori informazioni
sull'ordinamento dei risultati di query, vedere clausola ORDER BY.
È possibile utilizzare la TakeWhile clausola per specificare che vengano restituiti solo determinati elementi, a
seconda della condizione specificata.

Esempio
Nell'esempio di codice seguente viene utilizzata la Take clausola insieme alla Skip clausola per restituire dati
da una query in pagine. La funzione GetCustomers utilizza la Skip clausola per ignorare i clienti nell'elenco fino
al valore di indice iniziale fornito e utilizza la Take clausola per restituire una pagina di clienti a partire da tale
valore di indice.
Public Sub PagingSample()
Dim pageNumber As Integer = 0
Dim pageSize As Integer = 10

Dim customersPage = GetCustomers(pageNumber * pageSize, pageSize)

Do While customersPage IsNot Nothing


Console.WriteLine(vbCrLf & "Page: " & pageNumber + 1 & vbCrLf)

For Each cust In customersPage


Console.WriteLine(cust.CustomerID & ", " & cust.CompanyName)
Next

Console.WriteLine(vbCrLf)

pageNumber += 1
customersPage = GetCustomers(pageNumber * pageSize, pageSize)
Loop
End Sub

Public Function GetCustomers(ByVal startIndex As Integer,


ByVal pageSize As Integer) As List(Of Customer)

Dim customers = GetCustomerList()

Dim returnCustomers = From cust In customers


Skip startIndex Take pageSize

If returnCustomers.Count = 0 Then Return Nothing

Return returnCustomers
End Function

Vedi anche
Introduzione a LINQ in Visual Basic
Query
Clausola SELECT
Clausola from
Clausola ORDER BY
Clausola Take While
Clausola Skip
Clausola Take While (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Include gli elementi in una raccolta finché una condizione specificata è true e quindi ignora gli elementi
rimanenti.

Sintassi
Take While expression

Parti
T ERM IN E DEF IN IZ IO N E

expression Obbligatorio. Espressione che rappresenta una condizione


per cui verificare gli elementi. L'espressione deve restituire un
Boolean valore o un equivalente funzionale, ad esempio un
oggetto Integer da valutare come Boolean .

Commenti
La Take While clausola include gli elementi dall'inizio di un risultato della query fino a quando l'oggetto
specificato expression restituisce false . Una volta expression restituiti false , la query ignorerà tutti gli
elementi rimanenti. expression Viene ignorato per i risultati rimanenti.
La clausola è Take While diversa dalla Where clausola in quanto la Where clausola può essere utilizzata per
includere tutti gli elementi di una query che soddisfano una determinata condizione. La Take While clausola
include gli elementi solo fino alla prima volta che la condizione non viene soddisfatta. La Take While clausola è
particolarmente utile quando si lavora con un risultato di query ordinato.

Esempio
Nell'esempio di codice seguente viene utilizzata la Take While clausola per recuperare i risultati fino a quando
non viene trovato il primo cliente senza ordini.
Public Sub TakeWhileSample()
Dim customers = GetCustomerList()

' Return customers until the first customer with no orders is found.
Dim customersWithOrders = From cust In customers
Order By cust.Orders.Count Descending
Take While HasOrders(cust)

For Each cust In customersWithOrders


Console.WriteLine(cust.CompanyName & " (" & cust.Orders.Length & ")")
Next
End Sub

Public Function HasOrders(ByVal cust As Customer) As Boolean


If cust.Orders.Length > 0 Then Return True

Return False
End Function

Vedi anche
Introduzione a LINQ in Visual Basic
Query
Clausola SELECT
Clausola from
Clausola Take
Clausola Skip While
Clausola WHERE
Clausola Where (Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

Specifica la condizione di filtro per una query.

Sintassi
Where condition

Parti
condition
Obbligatorio. Espressione che determina se i valori per l'elemento corrente nella raccolta sono inclusi nella
raccolta di output. L'espressione deve restituire un Boolean valore o l'equivalente di un Boolean valore. Se la
condizione restituisce True , l'elemento viene incluso nel risultato della query. in caso contrario, l'elemento
viene escluso dal risultato della query.

Commenti
La Where clausola consente di filtrare i dati della query selezionando solo gli elementi che soddisfano
determinati criteri. Gli elementi i cui valori determinano che la Where clausola restituisca True sono inclusi nel
risultato della query; gli altri elementi sono esclusi. L'espressione utilizzata in una Where clausola deve restituire
un oggetto Boolean o l'equivalente di un Boolean , ad esempio un Integer che restituisce False quando il
valore è zero. È possibile combinare più espressioni in una Where clausola utilizzando operatori logici come
And ,, Or AndAlso , OrElse , Is e IsNot .

Per impostazione predefinita, le espressioni di query non vengono valutate fino a quando non vengono
accessibili, ad esempio quando sono associate a dati o iterate in un For ciclo. Di conseguenza, la Where
clausola non viene valutata fino a quando non viene eseguito l'accesso alla query. Se i valori sono esterni alla
query utilizzata nella Where clausola, verificare che nel momento in cui viene eseguita la query venga utilizzato
il valore appropriato nella Where clausola. Per ulteriori informazioni sull'esecuzione di query, vedere scrittura
della prima query LINQ.
È possibile chiamare le funzioni all'interno Where di una clausola per eseguire un calcolo o un'operazione su un
valore dell'elemento corrente nella raccolta. La chiamata di una funzione in una Where clausola può causare
l'esecuzione immediata della query quando viene definita al posto di quando viene eseguito l'accesso. Per
ulteriori informazioni sull'esecuzione di query, vedere scrittura della prima query LINQ.

Esempio
Nell'espressione di query seguente viene utilizzata una From clausola per dichiarare una variabile di intervallo
cust per ogni Customer oggetto della customers raccolta. La Where clausola usa la variabile di intervallo per
limitare l'output ai clienti dall'area specificata. Il For Each ciclo Visualizza il nome della società per ogni cliente
nel risultato della query.
Sub DisplayCustomersForRegion(ByVal customers As List(Of Customer),
ByVal region As String)

Dim customersForRegion = From cust In customers


Where cust.Region = region

For Each cust In customersForRegion


Console.WriteLine(cust.CompanyName)
Next
End Sub

Esempio
Nell'esempio seguente vengono utilizzati gli And Or operatori logici e nella Where clausola.

Private Sub DisplayElements()


Dim elements As List(Of Element) = BuildList()

' Get a list of elements that have an atomic number from 12 to 14,
' or that have a name that ends in "r".
Dim subset = From theElement In elements
Where (theElement.AtomicNumber >= 12 And theElement.AtomicNumber < 15) _
Or theElement.Name.EndsWith("r")
Order By theElement.Name

For Each theElement In subset


Console.WriteLine(theElement.Name & " " & theElement.AtomicNumber)
Next

' Output:
' Aluminum 13
' Magnesium 12
' Silicon 14
' Sulfur 16
End Sub

Private Function BuildList() As List(Of Element)


Return New List(Of Element) From
{
{New Element With {.Name = "Sodium", .AtomicNumber = 11}},
{New Element With {.Name = "Magnesium", .AtomicNumber = 12}},
{New Element With {.Name = "Aluminum", .AtomicNumber = 13}},
{New Element With {.Name = "Silicon", .AtomicNumber = 14}},
{New Element With {.Name = "Phosphorous", .AtomicNumber = 15}},
{New Element With {.Name = "Sulfur", .AtomicNumber = 16}}
}
End Function

Public Class Element


Public Property Name As String
Public Property AtomicNumber As Integer
End Class

Vedi anche
Introduzione a LINQ in Visual Basic
Query
Clausola from
Clausola SELECT
Istruzione For Each...Next
Istruzioni (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Gli argomenti di questa sezione contengono tabelle con le istruzioni eseguibili e di dichiarazione di Visual Basic
e con elenchi importanti applicabili a numerose istruzioni.

Contenuto della sezione


Istruzioni A-E
Istruzioni F-P
Istruzioni Q-Z
Clausole
Contesti delle dichiarazioni e livelli di accesso predefiniti
Elenco degli attributi
Elenco parametri
Type List

Sezioni correlate
Riferimenti al linguaggio Visual Basic
Istruzioni A-E
05/03/2021 • 2 minutes to read • Edit Online

Nella tabella seguente è incluso un elenco di istruzioni del linguaggio Visual Basic.

AddHandler Chiamata Classe Const

Continua Declare Delegato Dim

Do...Loop Altro Fine Fine <keyword>

Enumerazione Cancellare Error (Errore) (Error Event


(Errore)e)

Esci

Vedi anche
Istruzioni F-P
Istruzioni Q-Z
Riferimenti al linguaggio Visual Basic
Istruzione AddHandler
05/03/2021 • 2 minutes to read • Edit Online

Associa un evento a un gestore eventi in fase di esecuzione.

Sintassi
AddHandler event, AddressOf eventhandler

Parti

evento Nome dell'evento da gestire.

eventhandler Nome di una routine che gestisce l'evento.

Commenti
Le AddHandler RemoveHandler istruzioni e consentono di avviare e arrestare la gestione degli eventi in qualsiasi
momento durante l'esecuzione del programma.
La firma della eventhandler stored procedure deve corrispondere alla firma dell'evento event .
La parola chiave Handles e l'istruzione AddHandler consentono entrambe di specificare che quelle particolari
routine gestiscono particolari eventi, ma esistono alcune differenze. L'istruzione AddHandler connette le routine
agli eventi in fase di esecuzione. Usare la parola chiave Handles quando si definisce una routine, per specificare
che questa gestisce un particolare evento. Per ulteriori informazioni, vedere handle.

NOTE
Per gli eventi personalizzati, l' AddHandler istruzione richiama la funzione di AddHandler accesso dell'evento. Per
ulteriori informazioni sugli eventi personalizzati, vedere istruzione Event.

Esempio
Sub TestEvents()
Dim Obj As New Class1
' Associate an event handler with an event.
AddHandler Obj.Ev_Event, AddressOf EventHandler
' Call the method to raise the event.
Obj.CauseSomeEvent()
' Stop handling events.
RemoveHandler Obj.Ev_Event, AddressOf EventHandler
' This event will not be handled.
Obj.CauseSomeEvent()
End Sub

Sub EventHandler()
' Handle the event.
MsgBox("EventHandler caught event.")
End Sub

Public Class Class1


' Declare an event.
Public Event Ev_Event()
Sub CauseSomeEvent()
' Raise an event.
RaiseEvent Ev_Event()
End Sub
End Class

Vedere anche
Istruzione RemoveHandler
Selettori
Istruzione Event
Eventi
Istruzione Call (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Trasferisce il controllo a una Function Sub procedura di libreria a collegamento dinamico (dll), o.

Sintassi
[ Call ] procedureName [ (argumentList) ]

Parti

procedureName Obbligatorio. Nome della procedura da chiamare.

argumentList facoltativo. Elenco di variabili o espressioni che


rappresentano gli argomenti passati alla routine quando
viene chiamato. Più argomenti sono separati da virgole. Se si
include argumentList , è necessario racchiuderlo tra
parentesi.

Commenti
È possibile utilizzare la Call parola chiave quando si chiama una routine. Per la maggior parte delle chiamate di
procedura, non è necessario usare questa parola chiave.
In genere si usa la Call parola chiave quando l'espressione chiamata non inizia con un identificatore. Call
Non è consigliabile usare la parola chiave per altri usi.
Se la procedura restituisce un valore, l' Call istruzione lo ignora.

Esempio
Nel codice seguente vengono illustrati due esempi Call in cui la parola chiave è necessaria per chiamare una
routine. In entrambi gli esempi, l'espressione chiamata non inizia con un identificatore.

Sub TestCall()
Call (Sub() Console.Write("Hello"))()

Call New TheClass().ShowText()


End Sub

Class TheClass
Public Sub ShowText()
Console.Write(" World")
End Sub
End Class

Vedi anche
Istruzione Function
Istruzione Sub
Declare Statement
Espressioni lambda
Istruzione Class (Visual Basic)
05/03/2021 • 8 minutes to read • Edit Online

Dichiara il nome di una classe e introduce la definizione di variabili, proprietà, eventi e routine inclusi nella
classe.

Sintassi
[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ MustInherit | NotInheritable ] [ Partial ] _
Class name [ ( Of typelist ) ]
[ Inherits classname ]
[ Implements interfacenames ]
[ statements ]
End Class

Parti
T ERM IN E DEF IN IZ IO N E

attributelist facoltativo. Vedere elenco attributi.

accessmodifier facoltativo. Può essere uno dei seguenti:

- Pubblico
- Protetto
- Amico
- Privata
- Amico protetto
- Privato protetto

Vedere livelli di accesso in Visual Basic.

Shadows facoltativo. Vedere Shadows.

MustInherit facoltativo. Vedere MustInherit.

NotInheritable facoltativo. Vedere NotInheritable.

Partial facoltativo. Indica una definizione parziale della classe. Vedere


parziale.

name Obbligatorio. Nome di questa classe. Vedere Declared


Element Names.

Of facoltativo. Specifica che si tratta di una classe generica.

typelist Obbligatorio se si usa la parola chiave of . Elenco di


parametri di tipo per questa classe. Vedere elenco dei tipi.
T ERM IN E DEF IN IZ IO N E

Inherits facoltativo. Indica che questa classe eredita i membri di


un'altra classe. Vedere istruzione Inherits.

classname Obbligatorio se si usa l' Inherits istruzione. Nome della


classe da cui deriva questa classe.

Implements facoltativo. Indica che questa classe implementa i membri di


una o più interfacce. Vedere istruzione Implements.

interfacenames Obbligatorio se si usa l' Implements istruzione. Nomi delle


interfacce implementate da questa classe.

statements facoltativo. Istruzioni che definiscono i membri di questa


classe.

End Class Obbligatorio. Termina la Class definizione.

Commenti
Un' Class istruzione definisce un nuovo tipo di dati. Una classe è un blocco predefinito fondamentale della
programmazione orientata a oggetti (OOP). Per altre informazioni, vedere oggetti e classi.
È possibile usare Class solo a livello di spazio dei nomi o di modulo. Ciò significa che il contesto di
dichiarazione per una classe deve essere un file di origine, uno spazio dei nomi, una classe, una struttura, un
modulo o un'interfaccia e non può essere una routine o un blocco. Per altre informazioni, vedere Contesti delle
dichiarazioni e livelli di accesso predefiniti.
Ogni istanza di una classe ha una durata indipendente da tutte le altre istanze. Questa durata inizia quando
viene creata da una nuova clausola operator o da una funzione come CreateObject . Termina quando tutte le
variabili che puntano all'istanza sono state impostate su Nothing o su istanze di altre classi.
Per impostazione predefinita, le classi accedono a Friend . È possibile modificare i livelli di accesso con i
modificatori di accesso. Per altre informazioni, vedere livelli di accesso in Visual Basic.

Regole
Annidamento. È possibile definire una classe all'interno di un'altra. La classe esterna viene chiamata
classe che la contiene e la classe interna è chiamata classe annidata.
Ereditarietà. Se la classe utilizza l' istruzione Inherits, è possibile specificare solo una classe o
un'interfaccia di base. Una classe non può ereditare da più di un elemento.
Una classe non può ereditare da un'altra classe con un livello di accesso più restrittivo. Una classe, ad
esempio, Public non può ereditare da una Friend classe.
Una classe non può ereditare da una classe annidata al suo interno.
Implementazione. Se la classe utilizza l' istruzione Implements, è necessario implementare ogni
membro definito da ogni interfaccia specificata in interfacenames . Un'eccezione a questa operazione è la
riimplementazione di un membro della classe base. Per ulteriori informazioni, vedere la sezione relativa
alla riimplementazione in Implements.
Proprietà predefinita. Una classe può specificare al massimo una proprietà come proprietà predefinita.
Per ulteriori informazioni, vedere default.
Comportamento
Livello di accesso. All'interno di una classe, è possibile dichiarare ogni membro con il proprio livello di
accesso. I membri della classe hanno per impostazione predefinita l'accesso pubblico , eccetto le variabili
e le costanti, per impostazione predefinita l'accesso privato . Quando una classe dispone di un accesso
più limitato di uno dei relativi membri, il livello di accesso della classe ha la precedenza.
Ambito. Una classe è nell'ambito di tutti gli spazi dei nomi, la classe, la struttura o il modulo che lo
contiene.
L'ambito di ogni membro della classe è l'intera classe.
Vita. Visual Basic non supporta classi statiche. L'equivalente funzionale di una classe statica viene fornito
da un modulo. Per ulteriori informazioni, vedere istruzione Module.
I membri della classe hanno durate a seconda della modalità e della posizione in cui vengono dichiarati.
Per ulteriori informazioni, vedere Lifetime in Visual Basic.
Qualificazione. Il codice esterno a una classe deve qualificare il nome di un membro con il nome della
classe.
Se il codice all'interno di una classe annidata crea un riferimento non qualificato a un elemento di
programmazione, Visual Basic cerca prima l'elemento nella classe annidata, quindi nella classe che lo
contiene e così via fino all'elemento contenitore più esterno.

Classi e moduli
Questi elementi presentano molte analogie, ma esistono anche alcune differenze importanti.
Terminologia. Le versioni precedenti di Visual Basic riconoscono due tipi di moduli: moduli di classe (file
con estensione CLS) e moduli standard (file con estensione BAS). La versione corrente chiama queste
classi e moduli, rispettivamente.
Membri condivisi. È possibile controllare se un membro di una classe è un membro condiviso o di
istanza.
Orientamento dell'oggetto. Le classi sono orientate agli oggetti, ma i moduli non lo sono. È possibile
creare una o più istanze di una classe. Per altre informazioni, vedere oggetti e classi.

Esempio
Nell'esempio seguente viene utilizzata un' Class istruzione per definire una classe e diversi membri.
Class BankAccount
Shared interestRate As Decimal
Private accountNumber As String
Private accountBalance As Decimal
Public holdOnAccount As Boolean = False

Public ReadOnly Property Balance() As Decimal


Get
Return accountBalance
End Get
End Property

Public Sub PostInterest()


accountBalance = accountBalance * (1 + interestRate)
End Sub

Public Sub PostDeposit(ByVal amountIn As Decimal)


accountBalance = accountBalance + amountIn
End Sub

Public Sub PostWithdrawal(ByVal amountOut As Decimal)


accountBalance = accountBalance - amountOut
End Sub
End Class

Vedi anche
Oggetti e classi
Strutture e classi
Istruzione Interface
Istruzione Module
Property Statement
Durata degli oggetti: come creare e distruggere oggetti
Generic Types in Visual Basic
Procedura: Usare una classe generica
Istruzione Const (Visual Basic)
05/03/2021 • 8 minutes to read • Edit Online

Dichiara e definisce una o più costanti.

Sintassi
[ <attributelist> ] [ accessmodifier ] [ Shadows ]
Const constantlist

Parti
attributelist
facoltativo. Elenco di attributi che si applicano a tutte le costanti dichiarate in questa istruzione. Vedere l' elenco
degli attributi tra parentesi angolari (" < " e " > ").
accessmodifier
facoltativo. Usare questa funzione per specificare quale codice può accedere a queste costanti. Può essere public,
protected, Friend, Protected Friend, privateo private protected.
Shadows
facoltativo. Usare questa classe per dichiarare e nascondere un elemento di programmazione in una classe base.
Vedere Shadows.
constantlist
Obbligatorio. Elenco di costanti dichiarate in questa istruzione.
constant [ , constant ... ]

Ogni constant presenta la sintassi e le parti seguenti:


constantname [ As datatype ] = initializer

PA RT E DESC RIZ IO N E

constantname Obbligatorio. Nome della costante. Vedere Declared Element


Names.

datatype Obbligatorio se Option Strict è On . Tipo di dati della


costante.

initializer Obbligatorio. Espressione valutata in fase di compilazione e


assegnata alla costante.

Commenti
Se si dispone di un valore che non cambia mai nell'applicazione, è possibile definire una costante denominata e
utilizzarla al posto di un valore letterale. Un nome è più facile da ricordare rispetto a un valore. È possibile
definire la costante una sola volta e usarla in molte posizioni nel codice. Se in una versione successiva è
necessario ridefinire il valore, l' Const istruzione è l'unica posizione necessaria per apportare una modifica.
È possibile usare Const solo a livello di modulo o di procedura. Ciò significa che il contesto di dichiarazione per
una variabile deve essere una classe, una struttura, un modulo, una procedura o un blocco e non può essere un
file di origine, uno spazio dei nomi o un'interfaccia. Per altre informazioni, vedere Contesti delle dichiarazioni e
livelli di accesso predefiniti.
Le costanti locali (all'interno di una procedura) utilizzano per impostazione predefinita l'accesso pubblico e non
è possibile usare alcun modificatore di accesso. Le costanti membro della classe e del modulo (all'esterno di
qualsiasi routine) per impostazione predefinita è l'accesso privato e le costanti membro della struttura vengono
predefinite per l'accesso pubblico. È possibile modificare i livelli di accesso con i modificatori di accesso.

Regole
Contesto della dichiarazione. Una costante dichiarata a livello di modulo, all'esterno di qualsiasi
routine, è una costante membro; si tratta di un membro della classe, della struttura o del modulo che lo
dichiara.
Una costante dichiarata a livello di routine è una costante locale. è locale per la routine o il blocco che lo
dichiara.
Attributi. È possibile applicare attributi solo a costanti membro, non a costanti locali. Un attributo
fornisce informazioni ai metadati dell'assembly, che non è significativo per l'archiviazione temporanea, ad
esempio le costanti locali.
Modificatori. Per impostazione predefinita, tutte le costanti sono Shared , Static e ReadOnly . Non è
possibile usare una di queste parole chiave quando si dichiara una costante.
A livello di procedura, non è possibile usare Shadows o alcun modificatore di accesso per dichiarare
costanti locali.
Più costanti. È possibile dichiarare più costanti nella stessa istruzione di dichiarazione, specificando la
constantname parte per ciascuna di esse. Più costanti sono separate da virgole.

Regole del tipo di dati


Tipi di dati. L' Const istruzione può dichiarare il tipo di dati di una variabile. È possibile specificare
qualsiasi tipo di dati o il nome di un'enumerazione.
Tipo predefinito. Se non si specifica datatype , la costante accetta il tipo di dati di initializer . Se si
specificano sia datatype che initializer , il tipo di dati di initializer deve essere convertibile in
datatype . Se né datatype né initializer sono presenti, il tipo di dati predefinito è Object .

Tipi diversi. È possibile specificare tipi di dati diversi per costanti diverse utilizzando una clausola
separata As per ogni variabile dichiarata. Tuttavia, non è possibile dichiarare più costanti in modo che
siano dello stesso tipo utilizzando una As clausola comune.
Inizializzazione. È necessario inizializzare il valore di ogni costante in constantlist . Usare
initializer per fornire un'espressione da assegnare alla costante. L'espressione può essere costituita da
qualsiasi combinazione di valori letterali, altre costanti già definite e membri di enumerazione già definiti.
Per combinare tali elementi, è possibile utilizzare operatori aritmetici e logici.
Non è possibile usare variabili o funzioni in initializer . Tuttavia, è possibile usare parole chiave di
conversione, ad esempio CByte e CShort . È anche possibile usare AscW se lo si chiama con una
costante String o un Char argomento, poiché può essere valutato in fase di compilazione.

Comportamento
Ambito. Le costanti locali sono accessibili solo dall'interno della procedura o del blocco. Le costanti
membro sono accessibili da qualsiasi punto all'interno della classe, della struttura o del modulo.
Qualificazione. Il codice esterno a una classe, una struttura o un modulo deve qualificare il nome di una
costante membro con il nome della classe, della struttura o del modulo. Il codice esterno a una procedura
o a un blocco non può fare riferimento alle costanti locali all'interno di tale procedura o blocco.

Esempio
Nell'esempio seguente viene utilizzata l' Const istruzione per dichiarare le costanti da utilizzare al posto dei
valori letterali.

' The following statements declare constants.


Const maximum As Long = 459
Public Const helpString As String = "HELP"
Private Const startValue As Integer = 5

Esempio
Se si definisce una costante con tipo Object di dati, il compilatore Visual Basic lo assegna al tipo initializer ,
anziché Object . Nell'esempio seguente la costante naturalLogBase presenta il tipo in fase di esecuzione
Decimal .

Const naturalLogBase As Object = CDec(2.7182818284)


MsgBox("Run-time type of constant naturalLogBase is " &
naturalLogBase.GetType.ToString())

Nell'esempio precedente viene utilizzato il ToString metodo sull' Type oggetto restituito dall' operatore GetType,
perché Type non può essere convertito in String utilizzando CStr .

Vedi anche
Asc
AscW
Istruzione Enum
#Const (direttiva)
Istruzione Dim
Istruzione ReDim
Conversioni implicite ed esplicite
Costanti ed enumerazioni
Costanti ed enumerazioni
CString
Istruzione Continue (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Trasferisce immediatamente il controllo all'iterazione successiva di un ciclo.

Sintassi
Continue { Do | For | While }

Osservazioni
È possibile trasferire dall'interno di Do un For ciclo, o While all'iterazione successiva del ciclo. Il controllo
passa immediatamente al test della condizione del ciclo, equivalente al trasferimento all' For istruzione o o
While all' Do Loop istruzione o che contiene la Until While clausola o.

È possibile usare in Continue qualsiasi posizione del ciclo che consente i trasferimenti. Le regole che
consentono il trasferimento del controllo sono le stesse dell' istruzione goto.
Se, ad esempio, un ciclo è interamente contenuto all'interno di un blocco, di Try un Catch blocco o di un
Finally blocco, è possibile utilizzare Continue per trasferire il ciclo. Se, invece, la Try struttura... End Try è
contenuta all'interno del ciclo, non è possibile utilizzare Continue per trasferire il controllo fuori dal Finally
blocco ed è possibile utilizzarlo per il trasferimento da un Try blocco o Catch solo se si trasferisce
completamente dalla struttura. Try . End Try ..
Se sono presenti cicli annidati dello stesso tipo, ad esempio un Do ciclo all'interno di un altro Do ciclo, un'
Continue Do istruzione passa all'iterazione successiva del Do ciclo più interno che la contiene. Non è possibile
usare Continue per passare all'iterazione successiva di un ciclo contenitore dello stesso tipo.
Se sono presenti cicli annidati di tipi diversi, ad esempio un Do ciclo all'interno di un For ciclo, è possibile
passare all'iterazione successiva di uno dei due cicli usando Continue Do o Continue For .

Esempio
Nell'esempio di codice seguente viene utilizzata l' Continue While istruzione per passare alla colonna successiva
di una matrice se il divisore è zero. L'oggetto Continue While si trova all'interno di un For ciclo. Trasferisce all'
While col < lastcol istruzione, che è l'iterazione successiva del ciclo più interno While che contiene il For
ciclo.
Dim row, col As Integer
Dim lastrow As Integer = 6
Dim lastcol As Integer = 10
Dim a(,) As Double = New Double(lastrow, lastcol) {}
Dim b(7) As Double
row = -1
While row < lastrow
row += 1
col = -1
While col < lastcol
col += 1
a(row, col) = 0
For i As Integer = 0 To b.GetUpperBound(0)
If b(i) = col Then
Continue While
Else
a(row, col) += (row + b(i)) / (col - b(i))
End If
Next i
End While
End While

Vedi anche
Istruzione Do...Loop
Istruzione For...Next
Istruzione While...End While
Istruzione Try...Catch...Finally
Declare Statement
05/03/2021 • 16 minutes to read • Edit Online

Dichiara un riferimento a una routine implementata in un file esterno.

Sintassi
[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ Overloads ] _
Declare [ charsetmodifier ] [ Sub ] name Lib "libname" _
[ Alias "aliasname" ] [ ([ parameterlist ]) ]
' -or-
[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ Overloads ] _
Declare [ charsetmodifier ] [ Function ] name Lib "libname" _
[ Alias "aliasname" ] [ ([ parameterlist ]) ] [ As returntype ]

Parti
T ERM IN E DEF IN IZ IO N E

attributelist facoltativo. Vedere elenco attributi.

accessmodifier facoltativo. Può essere uno dei seguenti:

- Pubblico
- Protetto
- Amico
- Privata
- Amico protetto
- Privato protetto

Vedere livelli di accesso in Visual Basic.

Shadows facoltativo. Vedere Shadows.

charsetmodifier facoltativo. Specifica le informazioni sul set di caratteri e la


ricerca di file. Può essere uno dei seguenti:

- ANSI (impostazione predefinita)


- Unicode
- Automatico

Sub Facoltativo, ma Sub Function deve essere visualizzato o.


Indica che la procedura esterna non restituisce alcun valore.

Function Facoltativo, ma Sub Function deve essere visualizzato o.


Indica che la procedura esterna restituisce un valore.

name Obbligatorio. Nome del riferimento esterno. Per ulteriori


informazioni, vedere nomi di elementi dichiarati.
T ERM IN E DEF IN IZ IO N E

Lib Obbligatorio. Introduce una Lib clausola che identifica il


file esterno (dll o risorsa di codice) contenente una routine
esterna.

libname Obbligatorio. Nome del file che contiene la routine


dichiarata.

Alias facoltativo. Indica che la routine dichiarata non può essere


identificata all'interno del file in base al nome specificato in
name . Specificare l'identificazione in aliasname .

aliasname Obbligatorio se si usa la Alias parola chiave. Stringa che


identifica la procedura in uno dei due modi seguenti:

Nome del punto di ingresso della routine all'interno del file,


racchiuso tra virgolette ( "" )

-oppure-

Un simbolo di cancelletto ( # ) seguito da un Integer che


specifica il numero ordinale del punto di ingresso della
routine all'interno del file

parameterlist Obbligatorio se la procedura accetta parametri. Vedere


elenco di parametri.

returntype Obbligatorio se Function è specificato e Option Strict


è On . Tipo di dati del valore restituito dalla stored
procedure.

Commenti
In alcuni casi è necessario chiamare una routine definita in un file, ad esempio una DLL o una risorsa di codice,
all'esterno del progetto. Quando si esegue questa operazione, il compilatore Visual Basic non ha accesso alle
informazioni necessarie per chiamare correttamente la stored procedure, ad esempio la posizione in cui si trova
la stored procedure, il modo in cui viene identificata, la sequenza chiamante e il tipo restituito e il set di caratteri
stringa usato. L' Declare istruzione crea un riferimento a una procedura esterna e fornisce le informazioni
necessarie.
Si può usare Declare solo a livello di modulo. Ciò significa che il contesto di dichiarazione per un riferimento
esterno deve essere una classe, una struttura o un modulo e non può essere un file di origine, uno spazio dei
nomi, un'interfaccia, una routine o un blocco. Per altre informazioni, vedere Contesti delle dichiarazioni e livelli di
accesso predefiniti.
Riferimenti esterni per impostazione predefinita l'accesso pubblico . È possibile modificare i livelli di accesso con
i modificatori di accesso.

Regole
Attributi. È possibile applicare attributi a un riferimento esterno. Tutti gli attributi applicati hanno effetto
solo nel progetto e non nel file esterno.
Modificatori. Le procedure esterne sono implicitamente condivise. Non è possibile usare la Shared
parola chiave quando si dichiara un riferimento esterno e non è possibile modificarne lo stato condiviso.
Una procedura esterna non può partecipare all'override, all'implementazione di membri di interfaccia o
alla gestione degli eventi. Di conseguenza, non è possibile usare la Overrides Overridable parola
chiave,, NotOverridable , MustOverride , Implements o Handles in un' Declare istruzione.
Nome della procedura esterna. Non è necessario assegnare a questo riferimento esterno lo stesso
nome (in name ) del nome del punto di ingresso della stored procedure all'interno del file esterno (
aliasname ). È possibile usare una Alias clausola per specificare il nome del punto di ingresso. Questo
può essere utile se la procedura esterna ha lo stesso nome di un modificatore riservato Visual Basic o di
una variabile, di una routine o di qualsiasi altro elemento di programmazione nello stesso ambito.

NOTE
I nomi dei punti di ingresso nella maggior parte delle dll fanno distinzione tra maiuscole e minuscole

Numero di procedura esterna. In alternativa, è possibile usare una Alias clausola per specificare il
numero ordinale del punto di ingresso all'interno della tabella di esportazione del file esterno. A tale
scopo, si inizia aliasname con un simbolo di cancelletto ( # ). Questo può essere utile se un carattere nel
nome della procedura esterna non è consentito in Visual Basic o se il file esterno Esporta la stored
procedure senza un nome.

Regole del tipo di dati


Tipi di dati dei parametri. Se Option Strict è On , è necessario specificare il tipo di dati di ogni
parametro in parameterlist . Può essere qualsiasi tipo di dati o il nome di un'enumerazione, una
struttura, una classe o un'interfaccia. In parameterlist è possibile utilizzare una As clausola per
specificare il tipo di dati dell'argomento da passare a ogni parametro.

NOTE
Se la procedura esterna non è stata scritta per la .NET Framework, è necessario prestare attenzione che i tipi di
dati corrispondano. Se, ad esempio, si dichiara un riferimento esterno a una procedura Visual Basic 6,0 con un
Integer parametro (16 bit in Visual Basic 6,0), è necessario identificare l'argomento corrispondente come
Short nell' Declare istruzione, perché questo è il tipo Integer a 16 bit in Visual Basic. Analogamente, Long ha
una larghezza di dati diversa in Visual Basic 6,0 ed Date è implementata in modo diverso.

Tipo di dati restituito. Se la procedura esterna è Function e Option Strict è, è On necessario


specificare il tipo di dati del valore restituito al codice chiamante. Può essere qualsiasi tipo di dati o il
nome di un'enumerazione, una struttura, una classe o un'interfaccia.

NOTE
Il compilatore Visual Basic non verifica che i tipi di dati siano compatibili con quelli della procedura esterna. In caso
di mancata corrispondenza, il Common Language Runtime genera un' MarshalDirectiveException eccezione in fase
di esecuzione.

Tipi di dati predefiniti. Se Option Strict è Off e non si specifica il tipo di dati di un parametro in
parameterlist , il compilatore Visual Basic converte l'argomento corrispondente nel tipo di dati Object.
Analogamente, se non si specifica returntype , il compilatore accetta il tipo di dati restituito come
Object .
NOTE
Poiché si tratta di una procedura esterna che potrebbe essere stata scritta su una piattaforma diversa, è pericoloso
creare ipotesi sui tipi di dati o per consentirne l'impostazione predefinita. È molto più sicuro specificare il tipo di
dati di ogni parametro e del valore restituito, se presente. Questa operazione migliora inoltre la leggibilità del
codice.

Comportamento
Ambito. Un riferimento esterno è nell'ambito di tutta la classe, la struttura o il modulo.
Vita. Un riferimento esterno ha la stessa durata della classe, della struttura o del modulo in cui è
dichiarata.
Chiamata a una routine esterna. È possibile chiamare una routine esterna nello stesso modo in cui si
chiama una Function routine o, Sub usandola in un'espressione se restituisce un valore o
specificandone il valore in un' istruzione Call se non restituisce un valore.
Gli argomenti vengono passati alla procedura esterna esattamente come specificato parameterlist nell'
Declare istruzione. Non prendere in considerazione il modo in cui i parametri sono stati originariamente
dichiarati nel file esterno. Analogamente, se è presente un valore restituito, utilizzarlo esattamente come
specificato da returntype nell' Declare istruzione.
Set di caratteri. È possibile specificare in charsetmodifier che modo Visual Basic deve effettuare il
marshalling delle stringhe quando chiama la routine esterna. Il Ansi modificatore indica Visual Basic di
effettuare il marshalling di tutte le stringhe in valori ANSI e il Unicode modificatore lo indirizza per
eseguire il marshalling di tutte le stringhe in valori Unicode. Il Auto modificatore indica Visual Basic di
effettuare il marshalling delle stringhe in base alle regole di .NET Framework basate sul riferimento
esterno name o, aliasname se specificato. Il valore predefinito è Ansi .
charsetmodifier specifica anche il modo in cui Visual Basic deve cercare la procedura esterna all'interno
del file esterno. Ansi ed Unicode entrambi Visual Basic direttamente per cercarli senza modificarne il
nome durante la ricerca. Auto indica Visual Basic per determinare il set di caratteri di base della
piattaforma di runtime ed eventualmente modificare il nome della procedura esterna, come indicato di
seguito:
In una piattaforma ANSI, ad esempio Windows 95, Windows 98 o Windows Millennium Edition,
cercare prima la procedura esterna senza modificarne il nome. Se l'operazione ha esito negativo,
aggiungere "A" alla fine del nome della procedura esterna e cercarla nuovamente.
In una piattaforma Unicode, ad esempio Windows NT, Windows 2000 o Windows XP, cercare
prima la procedura esterna senza modificarne il nome. Se l'operazione ha esito negativo,
aggiungere "W" alla fine del nome della procedura esterna e cercarla nuovamente.
Meccanismo. Visual Basic utilizza il meccanismo .NET Framework Platform Invoke (PInvoke) per
risolvere e accedere a procedure esterne. L' Declare istruzione e la DllImportAttribute classe utilizzano
entrambi questo meccanismo automaticamente e non è necessaria alcuna conoscenza di PInvoke. Per
altre informazioni, vedere procedura dettagliata: chiamata delle API di Windows.
IMPORTANT
Se la procedura esterna viene eseguita all'esterno del Common Language Runtime (CLR), si tratta di codice non gestito.
Quando si chiama una procedura di questo tipo, ad esempio una funzione API Windows o un metodo COM, è possibile
esporre l'applicazione ai rischi per la sicurezza. Per altre informazioni, vedere linee guida per la codifica di codice non
gestito.

Esempio
Nell'esempio seguente viene dichiarato un riferimento esterno a una Function routine che restituisce il nome
utente corrente. Chiama quindi la procedura esterna GetUserNameA come parte della getUser procedura.

Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (


ByVal lpBuffer As String, ByRef nSize As Integer) As Integer
Sub GetUser()
Dim buffer As String = New String(CChar(" "), 25)
Dim retVal As Integer = GetUserName(buffer, 25)
Dim userName As String = Strings.Left(buffer, InStr(buffer, Chr(0)) - 1)
MsgBox(userName)
End Sub

Esempio
DllImportAttributeFornisce un metodo alternativo per l'utilizzo di funzioni nel codice non gestito. Nell'esempio
seguente viene dichiarata una funzione importata senza usare un' Declare istruzione.

' Add an Imports statement at the top of the class, structure, or


' module that uses the DllImport attribute.
Imports System.Runtime.InteropServices

<DllImportAttribute("kernel32.dll", EntryPoint:="MoveFileW",
SetLastError:=True, CharSet:=CharSet.Unicode,
ExactSpelling:=True,
CallingConvention:=CallingConvention.StdCall)>
Public Shared Function MoveFile(ByVal src As String,
ByVal dst As String) As Boolean
' This function copies a file from the path src to the path dst.
' Leave this function empty. The DLLImport attribute forces calls
' to MoveFile to be forwarded to MoveFileW in KERNEL32.DLL.
End Function

Vedi anche
LastDllError
Istruzione Imports (tipo e spazio dei nomi .NET)
Operatore AddressOf
Istruzione Function
Istruzione Sub
Elenco parametri
Istruzione Call
Procedura dettagliata: Chiamata delle API di Windows
Istruzione Delegate
05/03/2021 • 7 minutes to read • Edit Online

Utilizzato per dichiarare un delegato. Un delegato è un tipo di riferimento che fa riferimento a un Shared
metodo di un tipo o a un metodo di istanza di un oggetto. Per creare un'istanza di questa classe delegata è
possibile utilizzare qualsiasi routine con tipi restituiti e parametri corrispondenti. La stored procedure può quindi
essere richiamata in un secondo momento tramite l'istanza del delegato.

Sintassi
[ <attrlist> ] [ accessmodifier ] _
[ Shadows ] Delegate [ Sub | Function ] name [( Of typeparamlist )] [([ parameterlist ])] [ As type ]

Parti
T ERM IN E DEF IN IZ IO N E

attrlist facoltativo. Elenco degli attributi che si applicano a questo


delegato. Gli attributi sono separati da una virgola. È
necessario racchiudere l' elenco degli attributi tra parentesi
angolari (" < " e " > ").

accessmodifier facoltativo. Specifica il codice che può accedere al delegato.


Può essere uno dei seguenti:

- Public. Qualsiasi codice in grado di accedere all'elemento


che dichiara il delegato può accedervi.
- Protetto. Solo il codice all'interno della classe del delegato o
di una classe derivata può accedervi.
- Amico. Solo il codice all'interno dello stesso assembly può
accedere al delegato.
- Privato. Solo il codice all'interno dell'elemento che dichiara
il delegato può accedervi.

- Amico protetto Solo il codice all'interno della classe del


delegato, una classe derivata o lo stesso assembly può
accedere al delegato.
- Privato protetto Solo il codice all'interno della classe del
delegato o in una classe derivata nello stesso assembly può
accedere al delegato.
T ERM IN E DEF IN IZ IO N E

Shadows facoltativo. Indica che questo delegato dichiara e nasconde


un elemento di programmazione con nome identico o un set
di elementi di overload in una classe base. È possibile
nascondere qualsiasi tipo di elemento dichiarato con
qualsiasi altro tipo.

Un elemento nascosto non è disponibile all'interno della


classe derivata che lo nasconde, a meno che l'elemento di
shadowing sia inaccessibile. Se, ad esempio, un Private
elemento nasconde un elemento della classe base, il codice
che non dispone dell'autorizzazione per accedere
all'elemento Private accede all'elemento della classe di
base.

Sub Facoltativo, ma Sub Function deve essere visualizzato o.


Dichiara questa procedura come una procedura di delega
Sub che non restituisce un valore.

Function Facoltativo, ma Sub Function deve essere visualizzato o.


Dichiara questa routine come una routine di delegato
Function che restituisce un valore.

name Obbligatorio. Nome del tipo delegato. segue le convenzioni


di denominazione delle variabili standard.

typeparamlist facoltativo. Elenco di parametri di tipo per questo delegato.


Più parametri di tipo sono separati da virgole.
Facoltativamente, ogni parametro di tipo può essere
dichiarato Variant usando In i Out modificatori generici e.
È necessario racchiudere l' elenco dei tipi tra parentesi e
introducerlo con la Of parola chiave.

parameterlist facoltativo. Elenco di parametri passati alla procedura


quando viene chiamato. È necessario racchiudere l' elenco di
parametri tra parentesi.

type Obbligatorio se si specifica una Function stored procedure.


Tipo di dati del valore restituito.

Commenti
L' Delegate istruzione definisce il parametro e i tipi restituiti di una classe delegata. Per creare un'istanza di
questa classe delegata è possibile utilizzare qualsiasi routine con i tipi restituiti e i parametri corrispondenti. La
stored procedure può quindi essere richiamata per mezzo dell'istanza del delegato, chiamando il metodo del
delegato Invoke .
I delegati possono essere dichiarati a livello di spazio dei nomi, modulo, classe o struttura, ma non all'interno di
una routine.
Ogni classe delegata definisce un costruttore a cui viene passata la specifica di un metodo dell'oggetto. Un
argomento di un costruttore di delegati deve essere un riferimento a un metodo o a un'espressione lambda.
Per specificare un riferimento a un metodo, usare la sintassi seguente:
AddressOf [ expression .] methodname
Il tipo in fase di compilazione dell'elemento expression deve essere il nome di una classe o un'interfaccia
contenente un metodo con il nome specificato la cui firma corrisponde a quella della classe delegata. Il metodo
methodname può essere o un metodo condiviso o un metodo di istanza. methodname non è un elemento
facoltativo, anche se si crea un delegato per il metodo predefinito della classe.
Per specificare un'espressione lambda, usare la sintassi seguente:
Function ([ parm As type , parm2 As type2 , ...]) expression

La firma della funzione deve corrispondere a quella del tipo delegato. Per ulteriori informazioni sulle espressioni
lambda, vedere espressioni lambda.
Per altre informazioni sui delegati, vedere Delegati.

Esempio
Nell'esempio seguente viene utilizzata l' Delegate istruzione per dichiarare un delegato per l'utilizzo di due
numeri e la restituzione di un numero. Il DelegateTest metodo accetta un'istanza di un delegato di questo tipo e
la usa per operare su coppie di numeri.

Delegate Function MathOperator(


ByVal x As Double,
ByVal y As Double
) As Double

Function AddNumbers(
ByVal x As Double,
ByVal y As Double
) As Double
Return x + y
End Function

Function SubtractNumbers(
ByVal x As Double,
ByVal y As Double
) As Double
Return x - y
End Function

Sub DelegateTest(
ByVal x As Double,
ByVal op As MathOperator,
ByVal y As Double
)
Dim ret As Double
ret = op.Invoke(x, y) ' Call the method.
MsgBox(ret)
End Sub

Protected Sub Test()


DelegateTest(5, AddressOf AddNumbers, 3)
DelegateTest(9, AddressOf SubtractNumbers, 3)
End Sub

Vedi anche
Operatore AddressOf
Di
Delegati
Procedura: Usare una classe generica
Generic Types in Visual Basic
Covarianza e controvarianza
In
Out
Istruzione Dim (Visual Basic)
05/03/2021 • 23 minutes to read • Edit Online

Dichiara e alloca lo spazio di archiviazione per una o più variabili.

Sintassi
[ <attributelist> ] [ accessmodifier ] [[ Shared ] [ Shadows ] | [ Static ]] [ ReadOnly ]
Dim [ WithEvents ] variablelist

Parti
attributelist

facoltativo. Vedere elenco attributi.


accessmodifier

facoltativo. Può essere uno dei seguenti:


Pubblica
Protetto
Friend
Privata
Protected Friend
Privato protetto
Vedere livelli di accesso in Visual Basic.
Shared

facoltativo. Vedere Shared.


Shadows

facoltativo. Vedere Shadows.


Static

facoltativo. Vedere static.


ReadOnly

facoltativo. Vedere ReadOnly.


WithEvents

facoltativo. Specifica che si tratta di variabili oggetto che fanno riferimento a istanze di una classe in
grado di generare eventi. Vedere WithEvents.
variablelist

Obbligatorio. Elenco delle variabili dichiarate in questa istruzione.


variable [ , variable ... ]

Ogni variable presenta la sintassi e le parti seguenti:


variablename [ ( [ boundslist ] ) ] [ As [ New ] datatype [ With {
[ .propertyname = propinitializer [ , ... ] ] } ] ] [ = initializer ]

PA RT E DESC RIZ IO N E

variablename Obbligatorio. Nome della variabile. Vedere Declared


Element Names.

boundslist facoltativo. Elenco di limiti di ogni dimensione di una


variabile di matrice.

New facoltativo. Crea una nuova istanza della classe quando


Dim viene eseguita l'istruzione.

datatype facoltativo. Tipo di dati della variabile.

With facoltativo. Introduce l'elenco di inizializzatori di oggetto.

propertyname facoltativo. Nome di una proprietà nella classe di cui si


sta creando un'istanza.

propinitializer Obbligatorio dopo propertyname =. Espressione


valutata e assegnata al nome della proprietà.

initializer Facoltativo se New non è specificato. Espressione


valutata e assegnata alla variabile al momento della
creazione.

Commenti
Il compilatore Visual Basic usa l' Dim istruzione per determinare il tipo di dati della variabile e altre
informazioni, ad esempio il codice che può accedere alla variabile. Nell'esempio seguente viene dichiarata una
variabile che conterrà un Integer valore.

Dim numberOfStudents As Integer

È possibile specificare qualsiasi tipo di dati o il nome di un'enumerazione, una struttura, una classe o
un'interfaccia.

Dim finished As Boolean


Dim monitorBox As System.Windows.Forms.Form

Per un tipo riferimento, usare la New parola chiave per creare una nuova istanza della classe o della struttura
specificata dal tipo di dati. Se si usa New , non si usa un'espressione di inizializzazione. Vengono invece forniti gli
argomenti, se necessari, al costruttore della classe da cui si crea la variabile.

Dim bottomLabel As New System.Windows.Forms.Label

È possibile dichiarare una variabile in una routine, un blocco, una classe, una struttura o un modulo. Non è
possibile dichiarare una variabile in un file di origine, uno spazio dei nomi o un'interfaccia. Per altre
informazioni, vedere Contesti delle dichiarazioni e livelli di accesso predefiniti.
Una variabile dichiarata a livello di modulo, all'esterno di qualsiasi routine, è una variabile membro o un campo.
Le variabili membro sono nell'ambito della classe, della struttura o del modulo. Una variabile dichiarata a livello
di routine è una variabile locale. Le variabili locali si trovano nell'ambito solo all'interno della routine o del
blocco.
I modificatori di accesso seguenti vengono utilizzati per dichiarare le variabili all'esterno di una routine: Public
,, Protected Friend , Protected Friend e Private . Per altre informazioni, vedere livelli di accesso in Visual
Basic.
La parola chiave è facoltativa e in genere omessa se si specifica uno dei modificatori seguenti: Public ,,
Dim
Protected Friend , Protected Friend , Private , Shared , Shadows , Static , ReadOnly o WithEvents .

Public maximumAllowed As Double


Protected Friend currentUserName As String
Private salary As Decimal
Static runningTotal As Integer

Se Option Explicit è on (impostazione predefinita), il compilatore richiede una dichiarazione per ogni variabile
utilizzata. Per altre informazioni, vedere istruzione Option Explicit.

Specifica di un valore iniziale


È possibile assegnare un valore a una variabile al momento della creazione. Per un tipo di valore, si usa un
inizializzatore per fornire un'espressione da assegnare alla variabile. L'espressione deve restituire una costante
che può essere calcolata in fase di compilazione.

Dim quantity As Integer = 10


Dim message As String = "Just started"

Se viene specificato un inizializzatore e non viene specificato un tipo di dati in una As clausola, viene utilizzata l'
inferenza del tipo per dedurre il tipo di dati dall'inizializzatore. Nell'esempio seguente, sia num1 che num2 sono
fortemente tipizzati come numeri interi. Nella seconda dichiarazione, l'inferenza del tipo deduce il tipo dal valore
3.

' Use explicit typing.


Dim num1 As Integer = 3

' Use local type inference.


Dim num2 = 3

L'inferenza del tipo si applica a livello di routine. Non si applica all'esterno di una routine in una classe, una
struttura, un modulo o un'interfaccia. Per ulteriori informazioni sull'inferenza del tipo, vedere l' istruzione Option
deduce e l' inferenza del tipo locale.
Per informazioni su cosa accade quando un tipo di dati o un inizializzatore non viene specificato, vedere valori e
tipi di dati predefiniti più avanti in questo argomento.
È possibile utilizzare un inizializzatore di oggetto per dichiarare istanze di tipi denominati e anonimi. Il codice
seguente crea un'istanza di una Student classe e usa un inizializzatore di oggetto per inizializzare le proprietà.

Dim student1 As New Student With {.First = "Michael",


.Last = "Tucker"}
Per altre informazioni sugli inizializzatori di oggetto, vedere procedura: dichiarare un oggetto usando un
inizializzatore dioggetto, inizializzatori di oggetto: tipi denominati e anonimie tipi anonimi.

Dichiarazione di più variabili


È possibile dichiarare diverse variabili in un'unica istruzione di dichiarazione, specificando il nome della variabile
per ciascuna di esse e seguendo ogni nome di matrice con le parentesi. Nel caso di più variabili, è possibile
separarle mediante virgole.

Dim lastTime, nextTime, allTimes() As Date

Se si dichiara più di una variabile con una As clausola, non è possibile fornire un inizializzatore per quel gruppo
di variabili.
È possibile specificare tipi di dati diversi per variabili diverse utilizzando una As clausola separata per ogni
variabile dichiarata. Ogni variabile accetta il tipo di dati specificato nella prima As clausola rilevata dopo la
relativa variablename parte.

Dim a, b, c As Single, x, y As Double, i As Integer


' a, b, and c are all Single; x and y are both Double

Matrici
È possibile dichiarare una variabile in modo che contenga una matrice, che può includere più valori. Per
specificare che una variabile include una matrice, attenersi variablename immediatamente alle parentesi. Per
altre informazioni sulle matrici, vedere Matrici.
È possibile specificare il limite inferiore e superiore di ogni dimensione di una matrice. A tale scopo, includere un
oggetto boundslist all'interno delle parentesi. Per ogni dimensione, boundslist specifica il limite superiore e,
facoltativamente, il limite inferiore. Il limite inferiore è sempre zero, indipendentemente dal fatto che sia
specificato o meno. Ogni indice può variare da zero al valore del limite superiore.
Le due istruzioni seguenti sono equivalenti. Ogni istruzione dichiara una matrice di 21 Integer elementi.
Quando si accede alla matrice, l'indice può variare da 0 a 20.

Dim totals(20) As Integer


Dim totals(0 To 20) As Integer

Nell'istruzione seguente viene dichiarata una matrice bidimensionale di tipo Double . La matrice include 4 righe
(3 + 1) di 6 colonne (5 + 1) ognuna. Si noti che un limite superiore rappresenta il valore massimo possibile per
l'indice e non la lunghezza della dimensione. La lunghezza della dimensione è il limite superiore più uno.

Dim matrix2(3, 5) As Double

Una matrice può avere dimensioni da 1 a 32.


È possibile lasciare vuoti tutti i limiti in una dichiarazione di matrice. In tal caso, la matrice ha il numero di
dimensioni specificate, ma non è inizializzata. Il valore è fino a Nothing quando non si inizializzano almeno
alcuni dei relativi elementi. Nell' Dim istruzione devono essere specificati i limiti per tutte le dimensioni o per
nessuna dimensione.
' Declare an array with blank array bounds.
Dim messages() As String
' Initialize the array.
ReDim messages(4)

Se la matrice ha più di una dimensione, è necessario includere virgole tra le parentesi per indicare il numero di
dimensioni.

Dim oneDimension(), twoDimensions(,), threeDimensions(,,) As Byte

È possibile dichiarare una matrice di lunghezza zero dichiarando una delle dimensioni della matrice come-1.
Una variabile che contiene una matrice di lunghezza zero non ha il valore Nothing . Le matrici di lunghezza zero
sono richieste da alcune funzioni Common Language Runtime. Se si tenta di accedere a una matrice di questo
tipo, si verifica un'eccezione in fase di esecuzione. Per altre informazioni, vedere Matrici.
È possibile inizializzare i valori di una matrice usando un valore letterale di matrice. A tale scopo, racchiudere i
valori di inizializzazione tra parentesi graffe ( {} ).

Dim longArray() As Long = {0, 1, 2, 3}

Per le matrici multidimensionali, l'inizializzazione di ogni dimensione separata è racchiusa tra parentesi graffe
nella dimensione esterna. Gli elementi vengono specificati in ordine di riga.

Dim twoDimensions(,) As Integer = {{0, 1, 2}, {10, 11, 12}}

Per ulteriori informazioni sui valori letterali di matrice, vedere matrici.

Tipi di dati e valori predefiniti


Nella tabella seguente vengono descritti i risultati di varie combinazioni della specifica del tipo di dati e
dell'inizializzatore in un'istruzione Dim .

IN IZ IA L IZ Z ATO RE
T IP O DI DAT I SP EC IF IC ATO ? SP EC IF IC ATO ? ESEM P IO RISULTATO

No No Dim qty Se Option Strict è


disattivato (impostazione
predefinita), la variabile
viene impostata su
Nothing .

Se Option Strict è
abilitato, si verifica un errore
in fase di compilazione.
IN IZ IA L IZ Z ATO RE
T IP O DI DAT I SP EC IF IC ATO ? SP EC IF IC ATO ? ESEM P IO RISULTATO

No Sì Dim qty = 5 Se l' opzione deduce è on


(impostazione predefinita),
la variabile accetta il tipo di
dati dell'inizializzatore.
Vedere inferenza del tipo
locale.

Se le istruzioni
Option Infer e
Option Strict sono
disabilitate, il tipo di dati
accettato dalla variabile è
Object .

Se Option Infer è
disabilitato e
Option Strict è abilitato,
si verifica un errore in fase
di compilazione.

Sì No Dim qty As Integer La variabile viene


inizializzata sul valore
predefinito per il tipo di
dati. Vedere la tabella più
avanti in questa sezione.

Sì Sì Dim qty As Integer = 5 Se il tipo di dati


dell'inizializzatore non è
convertibile nel tipo di dati
specificato, si verifica un
errore in fase di
compilazione.

Se si specifica un tipo di dati ma non si specifica un inizializzatore, Visual Basic inizializza la variabile sul valore
predefinito per il tipo di dati. Nella tabella seguente vengono illustrati i valori di inizializzazione predefiniti.

T IP O DI DAT I VA LO RE P REDEF IN ITO

Tutti i tipi numerici (inclusi Byte e SByte ) 0

Char Binario 0

Tutti i tipi di riferimento (inclusi Object , String e tutte le Nothing


matrici)

Boolean False

Date 12:00 del 1 ° gennaio dell'anno 1 (01/01/0001 12:00:00 AM)

Ogni elemento di una struttura viene inizializzato come se fosse una variabile separata. Se si dichiara la
lunghezza di una matrice senza inizializzarne gli elementi, ogni elemento viene inizializzato come se fosse una
variabile separata.

Durata variabile locale statica


Una Static variabile locale ha una durata maggiore di quella della routine in cui è dichiarata. I limiti della
durata della variabile dipendono dalla posizione in cui la procedura viene dichiarata e dal fatto che sia Shared .

DIC H IA RA Z IO N E DI RO UT IN E VA RIA B IL E IN IZ IA L IZ Z ATA L A VA RIA B IL E SM ET T E DI ESIST ERE

In un modulo La prima volta che viene chiamata la Quando il programma interrompe


stored procedure l'esecuzione

In una classe o una struttura, la La prima volta che la stored procedure Quando il programma interrompe
procedura è Shared viene chiamata su un'istanza specifica o l'esecuzione
sulla classe o sulla struttura stessa

In una classe o una struttura, la La prima volta che la stored procedure Quando l'istanza viene rilasciata per
procedura non è Shared viene chiamata su un'istanza specifica Garbage Collection (GC)

Attributi e modificatori
È possibile applicare attributi solo alle variabili membro e non alle variabili locali. Un attributo fornisce
informazioni ai metadati dell'assembly, che non è significativo per l'archiviazione temporanea, ad esempio le
variabili locali.
A livello di modulo, non è possibile usare il Static modificatore per dichiarare le variabili membro. A livello di
procedura, non è possibile usare Shared , Shadows , ReadOnly , WithEvents o qualsiasi modificatore di accesso
per dichiarare le variabili locali.
È possibile specificare quale codice può accedere a una variabile fornendo un oggetto accessmodifier . Le
variabili membro della classe e del modulo (all'esterno di qualsiasi routine) sono predefinite per l'accesso
privato e le variabili membro della struttura sono predefinite per l'accesso pubblico. È possibile modificare i
livelli di accesso con i modificatori di accesso. Non è possibile usare i modificatori di accesso per le variabili
locali (all'interno di una routine).
È possibile specificare WithEvents solo sulle variabili membro, non sulle variabili locali all'interno di una routine.
Se si specifica WithEvents , il tipo di dati della variabile deve essere un tipo di classe specifico, non Object . Non
è possibile dichiarare una matrice con WithEvents . Per ulteriori informazioni sugli eventi, vedere eventi.

NOTE
Il codice esterno a una classe, una struttura o un modulo deve qualificare il nome di una variabile membro con il nome
della classe, della struttura o del modulo. Il codice esterno a una procedura o a un blocco non può fare riferimento ad
alcuna variabile locale all'interno di tale procedura o blocco.

Rilascio di risorse gestite


Il .NET Framework Garbage Collector elimina le risorse gestite senza alcuna codifica aggiuntiva da parte
dell'utente. Tuttavia, è possibile forzare l'eliminazione di una risorsa gestita anziché attendere il Garbage
Collector.
Se una classe dispone di una risorsa particolarmente preziosa e limitata (ad esempio una connessione al
database o un handle di file), è possibile che non si desideri attendere fino al Garbage Collection successivo per
eliminare un'istanza di classe che non è più in uso. Una classe può implementare l' IDisposable interfaccia per
fornire un modo per rilasciare le risorse prima di un Garbage Collection. Una classe che implementa tale
interfaccia espone un Dispose metodo che può essere chiamato per forzare il rilascio immediato di risorse
preziose.
L' Using istruzione automatizza il processo di acquisizione di una risorsa, l'esecuzione di un set di istruzioni e
quindi l'eliminazione della risorsa. Tuttavia, la risorsa deve implementare l' IDisposable interfaccia. Per ulteriori
informazioni, vedere istruzione using.

Esempio
Nell'esempio seguente vengono dichiarate le variabili utilizzando l' Dim istruzione con varie opzioni.

' Declare and initialize a Long variable.


Dim startingAmount As Long = 500

' Declare a variable that refers to a Button object,


' create a Button object, and assign the Button object
' to the variable.
Dim switchButton As New System.Windows.Forms.Button

' Declare a local variable that always retains its value,


' even after its procedure returns to the calling code.
Static totalSales As Double

' Declare a variable that refers to an array.


Dim highTemperature(31) As Integer

' Declare and initialize an array variable that


' holds four Boolean check values.
Dim checkValues() As Boolean = {False, False, True, False}

Esempio
Nell'esempio seguente vengono elencati i numeri primi compresi tra 1 e 30. L'ambito delle variabili locali è
descritto nei commenti del codice.
Public Sub ListPrimes()
' The sb variable can be accessed only
' within the ListPrimes procedure.
Dim sb As New System.Text.StringBuilder()

' The number variable can be accessed only


' within the For...Next block. A different
' variable with the same name could be declared
' outside of the For...Next block.
For number As Integer = 1 To 30
If CheckIfPrime(number) = True Then
sb.Append(number.ToString & " ")
End If
Next

Debug.WriteLine(sb.ToString)
' Output: 2 3 5 7 11 13 17 19 23 29
End Sub

Private Function CheckIfPrime(ByVal number As Integer) As Boolean


If number < 2 Then
Return False
Else
' The root and highCheck variables can be accessed
' only within the Else block. Different variables
' with the same names could be declared outside of
' the Else block.
Dim root As Double = Math.Sqrt(number)
Dim highCheck As Integer = Convert.ToInt32(Math.Truncate(root))

' The div variable can be accessed only within


' the For...Next block.
For div As Integer = 2 To highCheck
If number Mod div = 0 Then
Return False
End If
Next

Return True
End If
End Function

Esempio
Nell'esempio seguente la speedValue variabile viene dichiarata a livello di classe. La Private parola chiave
viene usata per dichiarare la variabile. Alla variabile è possibile accedere da qualsiasi routine della Car classe.

' Create a new instance of a Car.


Dim theCar As New Car()
theCar.Accelerate(30)
theCar.Accelerate(20)
theCar.Accelerate(-5)

Debug.WriteLine(theCar.Speed.ToString)
' Output: 45
Public Class Car
' The speedValue variable can be accessed by
' any procedure in the Car class.
Private speedValue As Integer = 0

Public ReadOnly Property Speed() As Integer


Get
Return speedValue
End Get
End Property

Public Sub Accelerate(ByVal speedIncrease As Integer)


speedValue += speedIncrease
End Sub
End Class

Vedi anche
Istruzione Const
Istruzione ReDim
Istruzione Option Explicit
Option Infer (istruzione)
Option Strict Statement
Compilazione (pagina), Creazione progetti (Visual Basic)
Dichiarazione di variabile
Matrici
Inizializzatori di oggetto: tipi denominati e tipi anonimi
Tipi anonimi
Inizializzatori di oggetto: tipi denominati e tipi anonimi
Procedura: dichiarare un oggetto utilizzando un inizializzatore di oggetto
Inferenza del tipo di variabile locale
Istruzione Do...Loop (Visual Basic)
05/03/2021 • 7 minutes to read • Edit Online

Ripete un blocco di istruzioni mentre una Boolean condizione è True o finché la condizione non diventa True .

Sintassi
Do { While | Until } condition
[ statements ]
[ Continue Do ]
[ statements ]
[ Exit Do ]
[ statements ]
Loop
' -or-
Do
[ statements ]
[ Continue Do ]
[ statements ]
[ Exit Do ]
[ statements ]
Loop { While | Until } condition

Parti
T ERM IN E DEF IN IZ IO N E

Do Obbligatorio. Avvia la definizione del Do ciclo.

While Obbligatorio a meno che non sia usato Until . Ripetere il


ciclo finché non condition è False .

Until Obbligatorio a meno che non sia usato While . Ripetere il


ciclo finché non condition è True .

condition facoltativo. Espressione Boolean . Se condition è


Nothing , Visual Basic lo considera come False .

statements facoltativo. Una o più istruzioni ripetute durante o fino a


condition True .

Continue Do facoltativo. Trasferisce il controllo all'iterazione successiva del


Do ciclo.

Exit Do facoltativo. Trasferisce il controllo all'esterno del Do ciclo.

Loop Obbligatorio. Termina la definizione del Do ciclo.

Commenti
Utilizzare una Do...Loop struttura quando si desidera ripetere un set di istruzioni un numero indefinito di volte,
fino a quando non viene soddisfatta una condizione. Se si desidera ripetere le istruzioni impostando il numero
di volte, per... L'istruzione successiva è in genere una scelta migliore.
È possibile utilizzare While o Until per specificare condition , ma non entrambi.
È possibile eseguire il test condition solo una volta, sia all'inizio che alla fine del ciclo. Se si verifica condition
all'inizio del ciclo (nell' Do istruzione), il ciclo potrebbe non essere eseguito neanche una volta. Se si esegue il
test alla fine del ciclo (nell' Loop istruzione), il ciclo viene sempre eseguito almeno una volta.
La condizione viene in genere generata da un confronto di due valori, ma può essere qualsiasi espressione che
restituisce un valore booleano di tipo di dati ( True o False ). Sono inclusi i valori di altri tipi di dati, ad
esempio i tipi numerici, che sono stati convertiti in Boolean .
È possibile annidare Do cicli inserendo un ciclo all'interno di un altro. È anche possibile annidare diversi tipi di
strutture di controllo tra loro. Per altre informazioni, vedere strutture di controlli annidati.

NOTE
La Do...Loop struttura offre una maggiore flessibilità rispetto al tempo... End While , perché consente di decidere se
terminare il ciclo quando viene condition interrotto True o quando diventa prima True . Consente inoltre di
eseguire il test condition sia all'inizio che alla fine del ciclo.

Esci da do
L'istruzione Exit Do può fornire un metodo alternativo per uscire da Do…Loop . Exit Do trasferisce
immediatamente il controllo all'istruzione che segue l' Loop istruzione.
Exit Do viene spesso usato dopo la valutazione di una determinata condizione, ad esempio in una
If...Then...Else struttura. Potrebbe essere necessario uscire da un ciclo se viene rilevata una condizione che
rende superfluo o Impossibile continuare l'iterazione, ad esempio un valore errato o una richiesta di
terminazione. Un uso di Exit Do è quello di verificare la presenza di una condizione che può causare un ciclo
infinito, ovvero un ciclo che può eseguire un numero di volte elevato o infinito. È possibile utilizzare Exit Do
per eseguire l'escape del ciclo.
È possibile includere qualsiasi numero di Exit Do istruzioni in un punto qualsiasi di un oggetto Do…Loop .
Quando viene utilizzato all'interno Do di cicli annidati, Exit Do trasferisce il controllo al di fuori del ciclo più
interno e al successivo livello di nidificazione.

Esempio
Nell'esempio seguente, le istruzioni del ciclo continuano a essere eseguite fino a quando la index variabile non
è maggiore di 10. La Until clausola si trova alla fine del ciclo.

Dim index As Integer = 0


Do
Debug.Write(index.ToString & " ")
index += 1
Loop Until index > 10

Debug.WriteLine("")
' Output: 0 1 2 3 4 5 6 7 8 9 10

Esempio
Nell'esempio seguente viene utilizzata una While clausola anziché una Until clausola e condition viene
testato all'inizio del ciclo anziché alla fine.

Dim index As Integer = 0


Do While index <= 10
Debug.Write(index.ToString & " ")
index += 1
Loop

Debug.WriteLine("")
' Output: 0 1 2 3 4 5 6 7 8 9 10

Esempio
Nell'esempio seguente, condition Arresta il ciclo quando la index variabile è maggiore di 100. Nell' If
istruzione del ciclo, tuttavia, l' Exit Do istruzione arresta il ciclo quando la variabile di indice è maggiore di 10.

Dim index As Integer = 0


Do While index <= 100
If index > 10 Then
Exit Do
End If

Debug.Write(index.ToString & " ")


index += 1
Loop

Debug.WriteLine("")
' Output: 0 1 2 3 4 5 6 7 8 9 10

Esempio
Nell'esempio seguente vengono lette tutte le righe in un file di testo. Il OpenText metodo apre il file e restituisce
un oggetto StreamReader che legge i caratteri. Nella Do...Loop condizione, il Peek metodo di StreamReader
determina se sono presenti caratteri aggiuntivi.

Private Sub ShowText(ByVal textFilePath As String)


If System.IO.File.Exists(textFilePath) = False Then
Debug.WriteLine("File Not Found: " & textFilePath)
Else
Dim sr As System.IO.StreamReader = System.IO.File.OpenText(textFilePath)

Do While sr.Peek() >= 0


Debug.WriteLine(sr.ReadLine())
Loop

sr.Close()
End If
End Sub

Vedi anche
Strutture di ciclo
Istruzione For...Next
Tipo di dati Boolean
Strutture di controllo annidate
Istruzione Exit
Istruzione While...End While
Istruzione Else (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Introduce un gruppo di istruzioni da eseguire o compilate se non sono stati eseguiti o compilati altri gruppi di
istruzioni condizionali.

Commenti
È possibile usare la parola chiave Else nei contesti seguenti:
Istruzione If...Then...Else
Istruzione Select...Case
#If... Quindi... #Else direttiva

Vedi anche
Parole chiave
Istruzione End
05/03/2021 • 3 minutes to read • Edit Online

Termina immediatamente l'esecuzione.

Sintassi
End

Osservazioni
È possibile inserire l' End istruzione in un punto qualsiasi di una procedura per forzare l'arresto dell'esecuzione
dell'intera applicazione. End chiude tutti i file aperti con un' Open istruzione e cancella tutte le variabili
dell'applicazione. L'applicazione viene chiusa non appena non è presente alcun altro programma che contiene
riferimenti ai relativi oggetti e nessun codice è in esecuzione.

NOTE
L' End istruzione arresta l'esecuzione del codice improvvisamente e non richiama il Dispose metodo o o Finalize
qualsiasi altro codice Visual Basic. I riferimenti agli oggetti contenuti in altri programmi vengono invalidati. Se End viene
rilevata un'istruzione all'interno di un Try Catch blocco o, il controllo non passa al Finally blocco corrispondente.

L' Stop istruzione sospende l'esecuzione, ma, a differenza di End , non chiude alcun file né cancella alcuna
variabile, a meno che non venga rilevata in un file eseguibile compilato (exe).
Poiché End termina l'applicazione senza dover partecipare a risorse che potrebbero essere aperte, provare a
chiuderla prima di usarla. Se ad esempio nell'applicazione sono presenti moduli aperti, è necessario chiuderli
prima che il controllo raggiunga l' End istruzione.
Si consiglia End di usare con parsimonia e solo quando è necessario arrestare immediatamente. I modi normali
per terminare una procedura (istruzionereturn e istruzione Exit) non solo chiudono la stored procedure, ma
forniscono anche al codice chiamante la possibilità di chiudere in modo corretto. Un'applicazione console, ad
esempio, può semplicemente Return dalla Main procedura.

IMPORTANT
L' End istruzione chiama il Exit metodo della Environment classe nello System spazio dei nomi. Exit richiede l'
UnmanagedCode autorizzazione. In caso contrario, SecurityException si verificherà un errore.

Quando seguito da una parola chiave aggiuntiva, l' <keyword> istruzione End delimita la fine della definizione
della procedura o del blocco appropriato. Ad esempio, End Function termina la definizione di una Function
stored procedure.

Esempio
Nell'esempio seguente viene utilizzata l' End istruzione per terminare l'esecuzione del codice se richiesto
dall'utente.
Sub Form_Load()
Dim answer As MsgBoxResult
answer = MsgBox("Do you want to quit now?", MsgBoxStyle.YesNo)
If answer = MsgBoxResult.Yes Then
MsgBox("Terminating program")
End
End If
End Sub

Note per gli sviluppatori di Smart Device


Questa istruzione non è supportata.

Vedi anche
SecurityPermissionFlag
Istruzione Stop
<keyword>Istruzione End
Istruzione End <keyword> (Visual Basic)
05/03/2021 • 5 minutes to read • Edit Online

Quando seguito da una parola chiave aggiuntiva, termina la definizione del blocco di istruzioni introdotto da tale
parola chiave.

Sintassi
End AddHandler
End Class
End Enum
End Event
End Function
End Get
End If
End Interface
End Module
End Namespace
End Operator
End Property
End RaiseEvent
End RemoveHandler
End Select
End Set
End Structure
End Sub
End SyncLock
End Try
End While
End With

Parti
PA RT E DESC RIZ IO N E

End Obbligatorio. Termina la definizione dell'elemento di


programmazione.

AddHandler Obbligatorio per terminare una AddHandler funzione di


accesso iniziata da un' AddHandler istruzione
corrispondente in un' istruzione di eventopersonalizzata.

Class Obbligatorio per terminare una definizione di classe iniziata


da un' istruzione di classecorrispondente.

Enum Obbligatorio per terminare una definizione di enumerazione


iniziata da un' istruzione enumcorrispondente.

Event Obbligatorio per terminare la Custom definizione di un


evento iniziata da un' istruzione di eventocorrispondente.
PA RT E DESC RIZ IO N E

Function Obbligatorio per terminare la Function definizione di una


routine iniziata da un' istruzione Functioncorrispondente. Se
l'esecuzione rileva un' End Function istruzione, il controllo
viene restituito al codice chiamante.

Get Obbligatorio per terminare la Property definizione di una


routine iniziata da un' istruzione Getcorrispondente. Se
l'esecuzione rileva un' End Get istruzione, il controllo torna
all'istruzione che richiede il valore della proprietà.

If Obbligatorio per terminare un If ... Then ... Else


definizione del blocco iniziata da un' If istruzione
corrispondente. Vedere if... Quindi... Else (istruzione).

Interface Obbligatorio per terminare una definizione di interfaccia


iniziata da un' istruzione di interfacciacorrispondente.

Module Obbligatorio per terminare la definizione di un modulo


iniziata da un' istruzione del modulocorrispondente.

Namespace Obbligatorio per terminare una definizione dello spazio dei


nomi iniziata da un' istruzione dello spazio dei
nomicorrispondente.

Operator Obbligatorio per terminare la definizione di un operatore


iniziata da un' istruzione di operatorecorrispondente.

Property Obbligatorio per terminare una definizione di proprietà


iniziata da un' istruzione Propertycorrispondente.

RaiseEvent Obbligatorio per terminare una RaiseEvent funzione di


accesso iniziata da un' RaiseEvent istruzione
corrispondente in un' istruzione di eventopersonalizzata.

RemoveHandler Obbligatorio per terminare una RemoveHandler funzione di


accesso iniziata da un' RemoveHandler istruzione
corrispondente in un' istruzione di eventopersonalizzata.

Select Obbligatorio per terminare una Select Case definizione


del blocco... iniziata da un' Select istruzione
corrispondente. Vedere Select... Istruzione case.

Set Obbligatorio per terminare la Property definizione di una


routine iniziata da un' istruzione setcorrispondente. Se
l'esecuzione rileva un' End Set istruzione, il controllo torna
all'istruzione impostando il valore della proprietà.

Structure Obbligatorio per terminare una definizione di struttura


iniziata da un' istruzione di strutturacorrispondente.

Sub Obbligatorio per terminare la Sub definizione di una


routine iniziata da un' istruzione secondariacorrispondente.
Se l'esecuzione rileva un' End Sub istruzione, il controllo
viene restituito al codice chiamante.
PA RT E DESC RIZ IO N E

SyncLock Obbligatorio per terminare una SyncLock definizione di


blocco iniziata da un' SyncLock istruzione corrispondente.
Vedere l' istruzione SyncLock.

Try Obbligatorio per terminare un Try ... Catch ... Finally


definizione del blocco iniziata da un' Try istruzione
corrispondente. Vedere try... Rileva... Istruzione finally.

While Obbligatorio per terminare una While definizione di ciclo


iniziata da un' While istruzione corrispondente. Vedi while...
End While (istruzione).

With Obbligatorio per terminare una With definizione di blocco


iniziata da un' With istruzione corrispondente. Vedi con...
Termina con l'istruzione.

Direttive
Quando è preceduto da un simbolo di cancelletto ( # ), la End parola chiave termina un blocco di pre-
elaborazione introdotto dalla direttiva corrispondente.

#End ExternalSource
#End If
#End Region

PA RT E DESC RIZ IO N E

#End Obbligatorio. Termina la definizione del blocco di pre-


elaborazione.

ExternalSource Obbligatorio per terminare un blocco di origine esterno


iniziato da una direttiva #ExternalSourcecorrispondente.

If Obbligatorio per terminare un blocco di compilazione


condizionale iniziato da una #If direttiva corrispondente.
Vedere #If... Quindi... #Else direttive.

Region Obbligatorio per terminare un blocco di area di origine


iniziato da una direttiva #Regioncorrispondente.

Commenti
L' istruzione End, senza una parola chiave aggiuntiva, termina immediatamente l'esecuzione.

Note per gli sviluppatori di Smart Device


L' End istruzione, senza una parola chiave aggiuntiva, non è supportata.
Vedi anche
Istruzione End
Istruzione Enum (Visual Basic)
05/03/2021 • 14 minutes to read • Edit Online

Dichiara un'enumerazione e definisce i valori dei relativi membri.

Sintassi
[ <attributelist> ] [ accessmodifier ] [ Shadows ]
Enum enumerationname [ As datatype ]
memberlist
End Enum

Parti
attributelist

facoltativo. Elenco degli attributi che si applicano a questa enumerazione. È necessario racchiudere l'
elenco degli attributi tra parentesi angolari (" < " e " > ").
L' FlagsAttribute attributo indica che il valore di un'istanza dell'enumerazione può includere più membri
di enumerazione e che ogni membro rappresenta un campo di bit nel valore di enumerazione.
accessmodifier

facoltativo. Specifica il codice che può accedere a questa enumerazione. Può essere uno dei seguenti:
Pubblica
Protetto
Friend
Privata
Protected Friend
Privato protetto
Shadows

facoltativo. Specifica che questa enumerazione dichiara e nasconde un elemento di programmazione con
nome identico o un set di elementi in overload in una classe base. È possibile specificare le
ombreggiature solo sull'enumerazione stessa, non su nessuno dei relativi membri.
enumerationname

Obbligatorio. Nome dell'enumerazione. Per informazioni sui nomi validi, vedere nomi di elementi
dichiarati.
datatype

facoltativo. Tipo di dati dell'enumerazione e di tutti i relativi membri.


memberlist

Obbligatorio. Elenco di costanti membro dichiarate in questa istruzione. Vengono visualizzati più membri
nelle singole righe del codice sorgente.
Ognuno member presenta la sintassi e le parti seguenti:
[<attribute list>] member name [ = initializer ]

PA RT E DESC RIZ IO N E

membername Obbligatorio. Nome del membro.

initializer facoltativo. Espressione valutata in fase di compilazione e


assegnata a questo membro.

End Enum

Termina il blocco Enum .

Commenti
Se si dispone di un set di valori non modificabili logicamente correlati tra loro, è possibile definirli insieme in
un'enumerazione. Che fornisce nomi significativi per l'enumerazione e i relativi membri, che sono più facili da
ricordare rispetto ai relativi valori. È quindi possibile usare i membri di enumerazione in molte posizioni nel
codice.
I vantaggi dell'utilizzo delle enumerazioni includono quanto segue:
Riduce gli errori causati dalla trasposizione o dalla digitazione errata dei numeri.
Semplifica la modifica dei valori in futuro.
Semplifica la lettura del codice, il che significa che è meno probabile che vengano introdotti errori.
Garantisce la compatibilità con le edizioni. Se si utilizzano le enumerazioni, è meno probabile che il codice
abbia esito negativo se in futuro qualcuno modifica i valori corrispondenti ai nomi dei membri.
Un'enumerazione ha un nome, un tipo di dati sottostante e un set di membri. Ogni membro rappresenta una
costante.
Un'enumerazione dichiarata a livello di classe, struttura, modulo o interfaccia, all'esterno di qualsiasi routine, è
un' enumerazione di membri. È un membro della classe, struttura, modulo o interfaccia che lo dichiara.
È possibile accedere alle enumerazioni dei membri da qualsiasi posizione all'interno della classe, struttura,
modulo o interfaccia. Il codice esterno a una classe, una struttura o un modulo deve qualificare il nome di
un'enumerazione membro con il nome della classe, della struttura o del modulo. Per evitare di dover utilizzare
nomi completi, è possibile aggiungere un'istruzione Imports al file di origine.
Un'enumerazione dichiarata a livello di spazio dei nomi, all'esterno di qualsiasi classe, struttura, modulo o
interfaccia, è un membro dello spazio dei nomi in cui viene visualizzata.
Il contesto di dichiarazione per un'enumerazione deve essere un file di origine, uno spazio dei nomi, una classe,
una struttura, un modulo o un'interfaccia e non può essere una routine. Per altre informazioni, vedere Contesti
delle dichiarazioni e livelli di accesso predefiniti.
È possibile applicare gli attributi a un'enumerazione nel suo complesso, ma non ai relativi membri
singolarmente. Un attributo fornisce informazioni ai metadati dell'assembly.

Tipo di dati
L' Enum istruzione può dichiarare il tipo di dati di un'enumerazione. Ogni membro accetta il tipo di dati
dell'enumerazione. È possibile specificare Byte , Integer , Long , SByte , Short , UInteger , ULong o
UShort .

Se non si specifica datatype per l'enumerazione, ogni membro accetta il tipo di dati del relativo oggetto
initializer . Se si specificano sia datatype che initializer , il tipo di dati di initializer deve essere
convertibile in datatype . Se né datatype né initializer sono presenti, il tipo di dati predefinito è Integer .

Inizializzazione di membri
L' Enumistruzione consente di inizializzare il contenuto dei membri selezionati in memberlist . Usare
initializer per fornire un'espressione da assegnare al membro.

Se non si specifica initializer per un membro, Visual Basic lo inizializza su zero (se è il primo member in
memberlist ) o su un valore maggiore di uno rispetto a quello dell'oggetto immediatamente precedente
member .

L'espressione fornita in ogni initializer può essere costituita da qualsiasi combinazione di valori letterali, altre
costanti già definite e membri di enumerazione già definiti, incluso un membro precedente di questa
enumerazione. Per combinare tali elementi, è possibile utilizzare operatori aritmetici e logici.
Non è possibile usare variabili o funzioni in initializer . Tuttavia, è possibile usare parole chiave di
conversione, ad esempio CByte e CShort . È anche possibile usare AscW se lo si chiama con una costante
String o un Char argomento, poiché può essere valutato in fase di compilazione.

Le enumerazioni non possono avere valori a virgola mobile. Se a un membro viene assegnato un valore a
virgola mobile ed Option Strict è impostato su on, si verifica un errore del compilatore. Se Option Strict è
off, il valore viene convertito automaticamente nel Enum tipo.
Se il valore di un membro supera l'intervallo consentito per il tipo di dati sottostante o se si Inizializza un
membro sul valore massimo consentito dal tipo di dati sottostante, il compilatore segnala un errore.

Modificatori
Per impostazione predefinita, le enumerazioni di membri di classe, struttura, modulo e interfaccia sono di
accesso pubblico. È possibile modificare i livelli di accesso con i modificatori di accesso. Per impostazione
predefinita, le enumerazioni di membri dello spazio dei nomi sono Friend. È possibile modificare i livelli di
accesso in pubblico, ma non in privato o protetto. Per altre informazioni, vedere livelli di accesso in Visual Basic.
Tutti i membri di enumerazione hanno accesso pubblico e non è possibile usare alcun modificatore di accesso.
Tuttavia, se l'enumerazione stessa ha un livello di accesso più limitato, il livello di accesso di enumerazione
specificato avrà la precedenza.
Per impostazione predefinita, tutte le enumerazioni sono tipi e i rispettivi campi sono costanti. Pertanto Shared
Static ReadOnly non è possibile utilizzare le parole chiave, e quando si dichiara un'enumerazione o i relativi
membri.

Assegnazione di più valori


Le enumerazioni rappresentano in genere valori che si escludono a vicenda. Includendo l' FlagsAttribute
attributo nella Enum dichiarazione, è invece possibile assegnare più valori a un'istanza dell'enumerazione. L'
FlagsAttribute attributo specifica che l'enumerazione deve essere considerata come un campo di bit, ovvero un
set di flag. Queste sono denominate enumerazioni bit per bit .
Quando si dichiara un'enumerazione usando l' FlagsAttribute attributo, è consigliabile usare le potenze di 2,
ovvero 1, 2, 4, 8, 16 e così via, per i valori. Si consiglia inoltre che "None" sia il nome di un membro il cui valore è
0. Per ulteriori linee guida, vedere FlagsAttribute e Enum .
Esempio
L'esempio seguente mostra come usare l'istruzione Enum . Si noti che il membro è indicato come
EggSizeEnum.Medium e non come Medium .

Public Class Egg


Enum EggSizeEnum
Jumbo
ExtraLarge
Large
Medium
Small
End Enum

Public Sub Poach()


Dim size As EggSizeEnum

size = EggSizeEnum.Medium
' Continue processing...
End Sub
End Class

Esempio
Il metodo nell'esempio seguente è esterno alla Egg classe. Pertanto, EggSizeEnum è completo come
Egg.EggSizeEnum .

Public Sub Scramble(ByVal size As Egg.EggSizeEnum)


' Process for the three largest sizes.
' Throw an exception for any other size.
Select Case size
Case Egg.EggSizeEnum.Jumbo
' Process.
Case Egg.EggSizeEnum.ExtraLarge
' Process.
Case Egg.EggSizeEnum.Large
' Process.
Case Else
Throw New ApplicationException("size is invalid: " & size.ToString)
End Select
End Sub

Esempio
Nell'esempio seguente viene utilizzata l' Enum istruzione per definire un set correlato di valori costanti
denominati. In questo caso, i valori sono i colori che è possibile scegliere per progettare moduli di immissione
dati per un database.

Public Enum InterfaceColors


MistyRose = &HE1E4FF&
SlateGray = &H908070&
DodgerBlue = &HFF901E&
DeepSkyBlue = &HFFBF00&
SpringGreen = &H7FFF00&
ForestGreen = &H228B22&
Goldenrod = &H20A5DA&
Firebrick = &H2222B2&
End Enum
Esempio
Nell'esempio seguente vengono illustrati i valori che includono numeri positivi e negativi.

Enum SecurityLevel
IllegalEntry = -1
MinimumSecurity = 0
MaximumSecurity = 1
End Enum

Esempio
Nell'esempio seguente As viene usata una clausola per specificare l'oggetto datatype di un'enumerazione.

Public Enum MyEnum As Byte


Zero
One
Two
End Enum

Esempio
Nell'esempio seguente viene illustrato come utilizzare un'enumerazione bit per bit. È possibile assegnare più
valori a un'istanza di un'enumerazione bit per bit. La Enum dichiarazione include l' FlagsAttribute attributo, che
indica che l'enumerazione può essere considerata come un set di flag.

' Apply the Flags attribute, which allows an instance


' of the enumeration to have multiple values.
<Flags()> Public Enum FilePermissions As Integer
None = 0
Create = 1
Read = 2
Update = 4
Delete = 8
End Enum

Public Sub ShowBitwiseEnum()

' Declare the non-exclusive enumeration object and


' set it to multiple values.
Dim perm As FilePermissions
perm = FilePermissions.Read Or FilePermissions.Update

' Show the values in the enumeration object.


Console.WriteLine(perm.ToString)
' Output: Read, Update

' Show the total integer value of all values


' in the enumeration object.
Console.WriteLine(CInt(perm))
' Output: 6

' Show whether the enumeration object contains


' the specified flag.
Console.WriteLine(perm.HasFlag(FilePermissions.Update))
' Output: True
End Sub
Esempio
Nell'esempio seguente viene iterata un'enumerazione. Usa il GetNames metodo per recuperare una matrice di
nomi di membri dall'enumerazione e GetValues per recuperare una matrice di valori dei membri.

Enum EggSizeEnum
Jumbo
ExtraLarge
Large
Medium
Small
End Enum

Public Sub Iterate()


Dim names = [Enum].GetNames(GetType(EggSizeEnum))
For Each name In names
Console.Write(name & " ")
Next
Console.WriteLine()
' Output: Jumbo ExtraLarge Large Medium Small

Dim values = [Enum].GetValues(GetType(EggSizeEnum))


For Each value In values
Console.Write(value & " ")
Next
Console.WriteLine()
' Output: 0 1 2 3 4
End Sub

Vedi anche
Enum
AscW
Istruzione Const
Istruzione Dim
Conversioni implicite ed esplicite
CString
Costanti ed enumerazioni
Istruzione Erase (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Usato per rilasciare le variabili di matrice e deallocare la memoria usata per i relativi elementi.

Sintassi
Erase arraylist

Parti
arraylist
Obbligatorio. Elenco di variabili di matrice da cancellare. Nel caso di più variabili, è possibile separarle mediante
virgole.

Commenti
L' Erase istruzione può essere visualizzata solo a livello di routine. Ciò significa che è possibile rilasciare matrici
all'interno di una routine ma non a livello di classe o di modulo.
L' Erase istruzione equivale all'assegnazione Nothing a ogni variabile di matrice.

Esempio
Nell'esempio seguente viene utilizzata l' Erase istruzione per cancellare due matrici e liberare la relativa
memoria (rispettivamente gli elementi di archiviazione 1000 e 100). L' ReDim istruzione assegna quindi una
nuova istanza di matrice alla matrice tridimensionale.

Dim threeDimArray(9, 9, 9), twoDimArray(9, 9) As Integer


Erase threeDimArray, twoDimArray
ReDim threeDimArray(4, 4, 9)

Vedi anche
Nothing
Istruzione ReDim
Istruzione Error
05/03/2021 • 2 minutes to read • Edit Online

Simula l'occorrenza di un errore.

Sintassi
Error errornumber

Parti
errornumber
Obbligatorio. Può essere qualsiasi numero di errore valido.

Commenti
L' Error istruzione è supportata per la compatibilità con le versioni precedenti. Nel nuovo codice, in particolare
quando si creano oggetti, utilizzare il Err metodo dell'oggetto Raise per generare errori di run-time.
Se errornumber è definito, l' Error istruzione chiama il gestore degli errori dopo che alle proprietà dell' Err
oggetto sono stati assegnati i valori predefiniti seguenti:

P RO P RIETÀ VA LO RE

Number Valore specificato come argomento dell' Error istruzione.


Può essere qualsiasi numero di errore valido.

Source Nome del progetto Visual Basic corrente.

Description Espressione stringa corrispondente al valore restituito della


Error funzione per l'oggetto specificato Number , se
questa stringa esiste. Se la stringa non esiste, Description
contiene una stringa di lunghezza zero ("").

HelpFile L'unità, il percorso e il nome file completi del file della Guida
Visual Basic appropriato.

HelpContext ID del contesto del file della Guida Visual Basic appropriato
per l'errore corrispondente alla Number Proprietà.

LastDLLError Zero.

Se non esiste alcun gestore di errori o se non ne è abilitato alcuno, viene creato un messaggio di errore che
viene visualizzato dalle Err proprietà dell'oggetto.

NOTE
Alcune applicazioni host Visual Basic non possono creare oggetti. Per determinare se è possibile creare classi e oggetti,
vedere la documentazione dell'applicazione host.
Esempio
In questo esempio viene utilizzata l' Error istruzione per generare il numero di errore 11.

On Error Resume Next ' Defer error handling.


Error 11 ' Simulate the "Division by zero" error.

Requisiti
Spazio dei nomi: Microsoft. VisualBasic
Assembly: Libreria di runtime Visual Basic (in Microsoft.VisualBasic.dll)

Vedi anche
Clear
Err
Raise
Istruzione On Error
Istruzione Resume
Messaggi di errore
Istruzione Event
05/03/2021 • 12 minutes to read • Edit Online

Dichiara un evento definito dall'utente.

Sintassi
[ <attrlist> ] [ accessmodifier ] _
[ Shared ] [ Shadows ] Event eventname[(parameterlist)] _
[ Implements implementslist ]
' -or-
[ <attrlist> ] [ accessmodifier ] _
[ Shared ] [ Shadows ] Event eventname As delegatename _
[ Implements implementslist ]
' -or-
[ <attrlist> ] [ accessmodifier ] _
[ Shared ] [ Shadows ] Custom Event eventname As delegatename _
[ Implements implementslist ]
[ <attrlist> ] AddHandler(ByVal value As delegatename)
[ statements ]
End AddHandler
[ <attrlist> ] RemoveHandler(ByVal value As delegatename)
[ statements ]
End RemoveHandler
[ <attrlist> ] RaiseEvent(delegatesignature)
[ statements ]
End RaiseEvent
End Event

Parti
PA RT E DESC RIZ IO N E

attrlist Facoltativa. Elenco degli attributi applicabili all'evento. Gli


attributi sono separati da una virgola. È necessario
racchiudere l' elenco degli attributi tra parentesi angolari ("
< " e " > ").

accessmodifier facoltativo. Specifica il tipo di codice che può accedere


all'evento. Può essere uno dei seguenti:

- Public: qualsiasi codice in grado di accedere all'elemento


che lo dichiara può accedervi.
- Protected: solo il codice all'interno della classe o di una
classe derivata può accedervi.
- Friend: solo il codice nello stesso assembly può accedervi.
- Private: solo il codice nell'elemento che lo dichiara può
accedervi.
- Il codice solo Friend protettonella classe dell'evento, una
classe derivata o lo stesso assembly può accedervi.
- Il codice privato protettosolo nella classe dell'evento o in
una classe derivata nello stesso assembly può accedervi.

Shared facoltativo. Specifica che l'evento non è associato a una


specifica istanza di una classe o di una struttura.
PA RT E DESC RIZ IO N E

Shadows facoltativo. Indica che l'evento ridichiara e nasconde un


elemento di programmazione omonimo o un insieme di
elementi in overload di una classe base. È possibile
nascondere qualsiasi tipo di elemento dichiarato con
qualsiasi altro tipo.

Un elemento nascosto non è disponibile all'interno della


classe derivata che lo nasconde, a meno che l'elemento di
shadowing sia inaccessibile. Ad esempio, se un elemento
Private nasconde un elemento della classe base, il codice
che non dispone dell'autorizzazione per accedere
all'elemento Private accede invece all'elemento della
classe base.

eventname Obbligatorio. Nome dell'evento, conforme alle convenzioni di


denominazione standard delle variabili.

parameterlist facoltativo. Elenco di variabili locali che rappresentano i


parametri dell'evento. È necessario racchiudere l' elenco di
parametri tra parentesi.

Implements facoltativo. Indica che l'evento implementa un evento di


un'interfaccia.

implementslist Necessario se si fornisce Implements . Elenco delle routine


Sub implementate. Nel caso di più routine, è possibile
separarle mediante virgole.

implementedprocedure [, implementedprocedure ...]

Ogni implementedprocedure presenta la sintassi e le parti


seguenti:

interface . definedname

- interface Necessaria. Nome di un'interfaccia


implementata dalla classe o dalla struttura che contiene la
routine.
- Definedname Necessaria. Nome mediante il quale la
routine viene definita in interface . Non è necessario che
questo nome corrisponda al nome usato dalla routine per
implementare la routine definita, ossia name .

Custom Obbligatorio. È necessario che gli eventi dichiarati come


Custom definiscano funzioni di accesso AddHandler ,
RemoveHandler e RaiseEvent personalizzate.

delegatename facoltativo. Nome del delegato che specifica la firma del


gestore eventi.

AddHandler Obbligatorio. Dichiara una funzione di accesso AddHandler


che specifica le istruzioni da eseguire quando viene aggiunto
un gestore eventi, sia in modo esplicito mediante l'istruzione
AddHandler che in modo implicito mediante la clausola
Handles
PA RT E DESC RIZ IO N E

End AddHandler Obbligatorio. Termina il blocco AddHandler .

value Obbligatorio. Nome del parametro.

RemoveHandler Obbligatorio. Dichiara una funzione di accesso


RemoveHandler , che specifica le istruzioni da eseguire
quando un gestore eventi viene rimosso mediante
l'istruzione RemoveHandler .

End RemoveHandler Obbligatorio. Termina il blocco RemoveHandler .

RaiseEvent Obbligatorio. Dichiara una funzione di accesso RaiseEvent ,


che specifica le istruzioni da eseguire quando l'evento viene
generato mediante l'istruzione RaiseEvent . In genere,
viene richiamato un elenco di delegati gestito dalle funzioni
di accesso AddHandler e RemoveHandler .

End RaiseEvent Obbligatorio. Termina il blocco RaiseEvent .

delegatesignature Obbligatorio. Elenco di parametri che corrisponde ai


parametri richiesti dal delegato delegatename . È necessario
racchiudere l' elenco di parametri tra parentesi.

statements facoltativo. Istruzioni che includono i corpi dei metodi


AddHandler , RemoveHandler e RaiseEvent .

End Event Obbligatorio. Termina il blocco Event .

Commenti
Dopo aver dichiarato l'evento, usare l'istruzione RaiseEvent per generarlo. Nei frammenti seguenti viene
mostrato un esempio tipico di dichiarazione e generazione di un evento:

Public Class EventSource


' Declare an event.
Public Event LogonCompleted(ByVal UserName As String)
Sub CauseEvent()
' Raise an event on successful logon.
RaiseEvent LogonCompleted("AustinSteele")
End Sub
End Class

NOTE
È possibile dichiarare argomenti per gli eventi analogamente a quanto avviene per gli argomenti di routine, tenendo però
conto che non è possibile specificare per gli eventi argomenti denominati, argomenti ParamArray o argomenti
Optional , né ottenere da essi valori restituiti.

Per gestire un evento è necessario associarlo a una subroutine del gestore eventi mediante l'istruzione Handles
o AddHandler . Le firme della subroutine e dell'evento devono corrispondere. Per gestire un evento condiviso è
necessario usare l'istruzione AddHandler .
Si può usare Event solo a livello di modulo. Ciò significa che il contesto di dichiarazione per un evento deve
essere una classe, una struttura, un modulo o un'interfaccia e non può essere un file di origine, uno spazio dei
nomi, una procedura o un blocco. Per altre informazioni, vedere Contesti delle dichiarazioni e livelli di accesso
predefiniti.
Nella maggior parte dei casi, per dichiarare un evento è possibile usare la prima sintassi nella sezione relativa
alla sintassi di questo argomento. In alcuni scenari è tuttavia necessario disporre di un controllo maggiore sui
dettagli del comportamento dell'evento. L'ultima sintassi nella sezione relativa alla sintassi di questo argomento,
che usa la parola chiave Custom , offre questa possibilità consentendo la definizione di eventi personalizzati. In
un evento personalizzato si specifica esattamente ciò che accade quando il codice aggiunge o rimuove un
gestore eventi a o dall'evento oppure quando il codice genera l'evento. Per esempi, vedere procedura: dichiarare
eventi personalizzati per conservare la memoria e procedura: dichiarare eventi personalizzati per evitare il
blocco.

Esempio
Negli esempi seguenti, gli eventi vengono usati per il conto alla rovescia dei secondi, da 10 a 0. Il codice illustra
numerosi metodi, proprietà e istruzioni correlati agli eventi, inclusa l'istruzione RaiseEvent .
La classe che genera un evento viene definita origine e i metodi che lo elaborano vengono definiti gestori eventi.
Un'origine eventi può disporre di più gestori per gli eventi generati. Quando la classe genera l'evento, lo stesso
evento viene generato in tutte le classi per cui è stato scelto di gestire eventi per tale istanza dell'oggetto.
Nell'esempio vengono usati anche un form ( Form1 ) con un pulsante ( Button1 ) e una casella di testo ( TextBox1
). Quando si fa clic sul pulsante, nella prima casella di testo viene visualizzato il conto alla rovescia dei secondi da
10 a 0. Al termine dei 10 secondi, nella prima casella di testo viene visualizzato "Done".
Il codice di Form1 specifica gli stati di inizio e fine del form. Contiene inoltre il codice eseguito quando vengono
generati gli eventi.
Per usare l'esempio, aprire un nuovo progetto Windows Form. Aggiungere quindi un pulsante denominato
Button1 e una casella di testo denominata TextBox1 al form principale, denominato Form1 . Fare quindi clic con
il pulsante destro del mouse sul form e scegliere Visualizza codice per aprire l'editor di codice.
Aggiungere una variabile WithEvents alla sezione delle dichiarazioni della classe Form1 :

Private WithEvents mText As TimerState

Aggiungere il codice seguente al codice per Form1 : Sostituire eventuali routine duplicate, ad esempio
Form_Load o Button_Click .
Private Sub Form1_Load() Handles MyBase.Load
Button1.Text = "Start"
mText = New TimerState
End Sub
Private Sub Button1_Click() Handles Button1.Click
mText.StartCountdown(10.0, 0.1)
End Sub

Private Sub mText_ChangeText() Handles mText.Finished


TextBox1.Text = "Done"
End Sub

Private Sub mText_UpdateTime(ByVal Countdown As Double


) Handles mText.UpdateTime

TextBox1.Text = Format(Countdown, "##0.0")


' Use DoEvents to allow the display to refresh.
My.Application.DoEvents()
End Sub

Class TimerState
Public Event UpdateTime(ByVal Countdown As Double)
Public Event Finished()
Public Sub StartCountdown(ByVal Duration As Double,
ByVal Increment As Double)
Dim Start As Double = DateAndTime.Timer
Dim ElapsedTime As Double = 0

Dim SoFar As Double = 0


Do While ElapsedTime < Duration
If ElapsedTime > SoFar + Increment Then
SoFar += Increment
RaiseEvent UpdateTime(Duration - SoFar)
End If
ElapsedTime = DateAndTime.Timer - Start
Loop
RaiseEvent Finished()
End Sub
End Class

Premere F5 per eseguire l'esempio precedente e fare clic sul pulsante Avvia . Nella prima casella di testo viene
avviato il conto alla rovescia dei secondi. Al termine dei 10 secondi, nella prima casella di testo viene visualizzato
"Done".

NOTE
Il metodo My.Application.DoEvents non elabora gli eventi allo stesso modo del form. Per consentire al form di gestire
direttamente gli eventi, si può ricorrere al multithreading. Per altre informazioni, vedere Threading gestito.

Vedi anche
Istruzione RaiseEvent
Istruzione Implements
Eventi
Istruzione AddHandler
Istruzione RemoveHandler
Selettori
Istruzione Delegate
Procedura: dichiarare eventi personalizzati per proteggere la memoria
Procedura: dichiarare eventi personalizzati per evitare il blocco
Condivisa
Ombreggiature
Istruzione Exit (Visual Basic)
05/03/2021 • 6 minutes to read • Edit Online

Esce da una routine o da un blocco e trasferisce immediatamente il controllo all'istruzione successiva alla
chiamata di routine o alla definizione del blocco.

Sintassi
Exit { Do | For | Function | Property | Select | Sub | Try | While }

Istruzioni
Exit Do
Chiude immediatamente il Do ciclo in cui viene visualizzato. L'esecuzione continua con l'istruzione che segue l'
Loop istruzione. Exit Do può essere utilizzato solo all'interno di un Do ciclo. Quando viene utilizzato
all'interno Do di cicli annidati, Exit Do chiude il ciclo più interno e trasferisce il controllo al livello di
nidificazione successivo.
Exit For
Chiude immediatamente il For ciclo in cui viene visualizzato. L'esecuzione continua con l'istruzione che segue l'
Next istruzione. Exit For può essere utilizzato solo all'interno di un For ciclo... Next o For Each .. Next ..
Quando viene utilizzato all'interno For di cicli annidati, Exit For chiude il ciclo più interno e trasferisce il
controllo al livello di nidificazione successivo.
Exit Function
Esce immediatamente dalla Function routine in cui viene visualizzato. L'esecuzione continua con l'istruzione
che segue l'istruzione che ha chiamato la Function procedura. Exit Function può essere utilizzato solo
all'interno di una Function routine.
Per specificare un valore restituito, è possibile assegnare il valore al nome della funzione su una riga prima dell'
Exit Function istruzione. Per assegnare il valore restituito e uscire dalla funzione in un'unica istruzione, è
possibile usare invece l' istruzione return.
Exit Property
Esce immediatamente dalla Property routine in cui viene visualizzato. L'esecuzione continua con l'istruzione
che ha chiamato la Property routine, ovvero con l'istruzione che richiede o imposta il valore della proprietà.
Exit Property può essere utilizzato solo all'interno di una Get routine o di una proprietà Set .

Per specificare un valore restituito in una Get routine, è possibile assegnare il valore al nome della funzione su
una riga prima dell' Exit Property istruzione. Per assegnare il valore restituito e uscire dalla Get procedura in
un'unica istruzione, è possibile usare l' Return istruzione.
In una Set routine, l' Exit Property istruzione è equivalente all' Return istruzione.
Exit Select
Esce immediatamente dal Select Case blocco in cui viene visualizzato. L'esecuzione continua con l'istruzione
che segue l' End Select istruzione. Exit Select può essere utilizzato solo all'interno di un' Select Case
istruzione.
Exit Sub
Esce immediatamente dalla Sub routine in cui viene visualizzato. L'esecuzione continua con l'istruzione che
segue l'istruzione che ha chiamato la Sub procedura. Exit Sub può essere utilizzato solo all'interno di una
Sub routine.

In una Sub routine, l' Exit Sub istruzione è equivalente all' Return istruzione.
Exit Try
Esce immediatamente dal Try blocco o Catch in cui viene visualizzato. L'esecuzione continua con il Finally
blocco se ne esiste uno oppure con l'istruzione che segue l' End Try istruzione in caso contrario. Exit Try può
essere utilizzato solo all'interno di un Try Catch blocco o e non all'interno di un Finally blocco.
Exit While
Chiude immediatamente il While ciclo in cui viene visualizzato. L'esecuzione continua con l'istruzione che
segue l' End While istruzione. Exit While può essere utilizzato solo all'interno di un While ciclo. Quando viene
usato all'interno While di cicli annidati, Exit While trasferisce il controllo al ciclo che è un livello annidato
sopra il ciclo in cui Exit While si verifica.

Commenti
Non confondere Exit istruzioni con End istruzioni. Exit non definisce la fine di un'istruzione.

Esempio
Nell'esempio seguente, la condizione del ciclo arresta il ciclo quando la index variabile è maggiore di 100. Nell'
If istruzione del ciclo, tuttavia, l' Exit Do istruzione arresta il ciclo quando la variabile di indice è maggiore di
10.

Dim index As Integer = 0


Do While index <= 100
If index > 10 Then
Exit Do
End If

Debug.Write(index.ToString & " ")


index += 1
Loop

Debug.WriteLine("")
' Output: 0 1 2 3 4 5 6 7 8 9 10

Esempio
Nell'esempio seguente viene assegnato il valore restituito al nome della funzione myFunction e quindi viene
utilizzato Exit Function per restituire dalla funzione:

Function MyFunction(ByVal j As Integer) As Double


MyFunction = 3.87 * j
Exit Function
End Function

Esempio
Nell'esempio seguente viene utilizzata l' istruzione return per assegnare il valore restituito e uscire dalla
funzione:
Function MyFunction(ByVal j As Integer) As Double
Return 3.87 * j
End Function

Vedi anche
Istruzione Continue
Istruzione Do...Loop
Istruzione End
Istruzione For Each...Next
Istruzione For...Next
Istruzione Function
Istruzione Return
Istruzione Stop
Istruzione Sub
Istruzione Try...Catch...Finally
Istruzioni F-P
05/03/2021 • 2 minutes to read • Edit Online

Nella tabella seguente è incluso un elenco di istruzioni del linguaggio Visual Basic.

Per ogni... Prossimo For...Next Funzione Recupero

GoTo If...Then...Else Implementazioni Imports (spazio dei nomi e


tipo .NET)

Imports (spazio dei nomi Eredita Interfaccia Metà


XML)

Modulo Namespace In caso di errore Operatore

Opzione <keyword> Option Compare Option Explicit Option Infer

Option Strict Proprietà

Vedi anche
Istruzioni A-E
Istruzioni Q-Z
Riferimenti al linguaggio Visual Basic
Istruzione For Each...Next (Visual Basic)
05/03/2021 • 23 minutes to read • Edit Online

Ripete un gruppo di istruzioni per ogni elemento di una raccolta.

Sintassi
For Each element [ As datatype ] In group
[ statements ]
[ Continue For ]
[ statements ]
[ Exit For ]
[ statements ]
Next [ element ]

Parti
T ERM IN E DEF IN IZ IO N E

element Obbligatorio nell' For Each istruzione. Facoltativo nell'


Next istruzione. Variabile. Utilizzato per scorrere gli
elementi della raccolta.

datatype Facoltativo se Option Infer è on (impostazione


predefinita) o elementè già dichiarato; obbligatorio se
Option Infer è disattivato e element non è già
dichiarato. Tipo di dati del parametro element .

group Obbligatorio. Una variabile con un tipo che è un tipo di


raccolta o un oggetto. Si riferisce alla raccolta sulla quale
devono statements essere ripetuti.

statements facoltativo. Una o più istruzioni tra For Each e Next


eseguite in ogni elemento in group .

Continue For facoltativo. Trasferisce il controllo all'inizio del For Each


ciclo.

Exit For facoltativo. Trasferisce il controllo all'esterno del For Each


ciclo.

Next Obbligatorio. Termina la definizione del For Each ciclo.

Esempio semplice
Utilizzare un For Each ciclo... Next quando si desidera ripetere un set di istruzioni per ogni elemento di una
raccolta o di una matrice.
TIP
Oggetto per... L'istruzione successiva funziona bene quando è possibile associare ogni iterazione di un ciclo a una variabile
di controllo e determinare i valori iniziale e finale della variabile. Tuttavia, quando si tratta di una raccolta, il concetto di
valori iniziali e finali non è significativo e non si conosce necessariamente il numero di elementi della raccolta. In questo
tipo di caso, un For Each ciclo... Next è spesso una scelta migliore.

Nell'esempio seguente, il For Each ... Next l'istruzione scorre tutti gli elementi di una raccolta di elenchi.

' Create a list of strings by using a


' collection initializer.
Dim lst As New List(Of String) _
From {"abc", "def", "ghi"}

' Iterate through the list.


For Each item As String In lst
Debug.Write(item & " ")
Next
Debug.WriteLine("")
'Output: abc def ghi

Per altri esempi, vedere raccolte e matrici.

Nested Loops
È possibile annidare For Each cicli inserendo un ciclo all'interno di un altro.
Nell'esempio seguente viene illustrato l'oggetto annidato For Each ... Next strutture.

' Create lists of numbers and letters


' by using array initializers.
Dim numbers() As Integer = {1, 4, 7}
Dim letters() As String = {"a", "b", "c"}

' Iterate through the list by using nested loops.


For Each number As Integer In numbers
For Each letter As String In letters
Debug.Write(number.ToString & letter & " ")
Next
Next
Debug.WriteLine("")
'Output: 1a 1b 1c 4a 4b 4c 7a 7b 7c

Quando si annidano i cicli, ogni ciclo deve avere una variabile univoca element .
È anche possibile annidare diversi tipi di strutture di controllo tra loro. Per altre informazioni, vedere strutture di
controlli annidati.

Esci per e continua per


L'istruzione Exit for causa l'uscita dall'esecuzione di For ... Next esegue il ciclo e trasferisce il controllo
all'istruzione che segue l' Next istruzione.
L' Continue For istruzione trasferisce immediatamente il controllo all'iterazione successiva del ciclo. Per ulteriori
informazioni, vedere istruzione continue.
Nell'esempio seguente viene illustrato come utilizzare le Continue For Exit For istruzioni e.
Dim numberSeq() As Integer =
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}

For Each number As Integer In numberSeq


' If number is between 5 and 7, continue
' with the next iteration.
If number >= 5 And number <= 8 Then
Continue For
End If

' Display the number.


Debug.Write(number.ToString & " ")

' If number is 10, exit the loop.


If number = 10 Then
Exit For
End If
Next
Debug.WriteLine("")
' Output: 1 2 3 4 9 10

È possibile inserire un numero qualsiasi di Exit For istruzioni in un For Each ciclo. Quando viene utilizzato
all'interno di cicli annidati For Each , Exit For l'esecuzione esce dal ciclo più interno e trasferisce il controllo al
livello di nidificazione successivo.
Exit For viene spesso usato dopo una valutazione di una determinata condizione, ad esempio in un If ...
Then ... Else struttura. Può essere utile usare Exit For per le condizioni seguenti:
La continuazione dell'iterazione non è necessaria o impossibile. Il problema potrebbe essere causato da
un valore errato o da una richiesta di terminazione.
Viene rilevata un'eccezione in Try ... Catch ... Finally . È possibile utilizzare Exit For alla fine del
Finally blocco.

Un ciclo infinito, ovvero un ciclo che può eseguire un numero di volte elevato o infinito. Se si rileva una
condizione di questo tipo, è possibile utilizzare Exit For per eseguire l'escape del ciclo. Per ulteriori
informazioni, vedere ... Istruzione Loop.

Iterators
Si usa un iteratore per eseguire un'iterazione personalizzata su una raccolta. Un iteratore può essere una
funzione o una funzione di Get accesso. Viene utilizzata un' Yield istruzione per restituire ogni elemento della
raccolta uno alla volta.
È possibile chiamare un iteratore usando un' For Each...Next istruzione. Ogni iterazione del ciclo For Each
chiama l'iteratore. Quando Yield viene raggiunta un'istruzione nell'iteratore, viene restituita l'espressione nell'
Yield istruzione e viene mantenuta la posizione corrente nel codice. L'esecuzione viene ripresa a partire da
quella posizione la volta successiva che viene chiamato l'iteratore.
Nell'esempio seguente viene utilizzata una funzione iteratore. La funzione iteratore ha un' Yield istruzione che
si trova all'interno di un oggetto per... Ciclo successivo . Nel ListEvenNumbers Metodo ogni iterazione del corpo
dell' For Each istruzione crea una chiamata alla funzione iteratore, che procede all' Yield istruzione successiva.
Public Sub ListEvenNumbers()
For Each number As Integer In EvenSequence(5, 18)
Debug.Write(number & " ")
Next
Debug.WriteLine("")
' Output: 6 8 10 12 14 16 18
End Sub

Private Iterator Function EvenSequence(


ByVal firstNumber As Integer, ByVal lastNumber As Integer) _
As System.Collections.Generic.IEnumerable(Of Integer)

' Yield even numbers in the range.


For number = firstNumber To lastNumber
If number Mod 2 = 0 Then
Yield number
End If
Next
End Function

Per ulteriori informazioni, vedere iteratori, istruzione yielde iteratore.

Implementazione tecnica
Quando un For Each ... Next l'istruzione viene eseguita, Visual Basic valuta la raccolta solo una volta, prima
dell'avvio del ciclo. Se il blocco di istruzioni cambia element o group , queste modifiche non influiscono
sull'iterazione del ciclo.
Quando tutti gli elementi della raccolta sono stati assegnati successivamente a element , il For Each ciclo viene
arrestato e il controllo passa all'istruzione che segue l' Next istruzione.
Se Option deduce è on (impostazione predefinita), il Visual Basic compilatore può dedurre il tipo di dati di
element . Se è disattivata e element non è stata dichiarata al di fuori del ciclo, è necessario dichiararla nell'
For Each istruzione. Per dichiarare il tipo di dati di in element modo esplicito, utilizzare una As clausola. A
meno che il tipo di dati dell'elemento non sia definito al di fuori del For Each costrutto... Next , il relativo
ambito è il corpo del ciclo. Si noti che non è possibile dichiarare element sia all'esterno che all'interno del ciclo.
Facoltativamente, è possibile specificare element nell' Next istruzione. Ciò migliora la leggibilità del
programma, soprattutto se sono presenti cicli nidificati For Each . È necessario specificare la stessa variabile di
quella visualizzata nell' For Each istruzione corrispondente.
È consigliabile evitare di modificare il valore di element all'interno di un ciclo. Questa operazione può rendere
più difficile la lettura e il debug del codice. La modifica del valore di group non influisce sulla raccolta o sui
relativi elementi, che sono stati determinati quando il ciclo è stato immesso per la prima volta.
Quando si annidano i cicli, se Next viene rilevata un'istruzione di un livello di nidificazione esterno prima Next
di di un livello interno, il compilatore segnala un errore. Tuttavia, il compilatore può rilevare questo errore di
sovrapposizione solo se si specifica element in ogni Next istruzione.
Se il codice dipende dall'attraversamento di una raccolta in un ordine particolare, un For Each ciclo... Next non
è la scelta migliore, a meno che non si conoscano le caratteristiche dell'oggetto enumeratore esposto dalla
raccolta. L'ordine di attraversamento non è determinato dal Visual Basic, ma dal MoveNext metodo dell'oggetto
enumeratore. Pertanto, potrebbe non essere possibile stimare quale elemento della raccolta è il primo da
restituire in element o che è il successivo da restituire dopo un determinato elemento. È possibile ottenere
risultati più affidabili utilizzando una struttura di ciclo diversa, ad esempio For ... Next o Do ... Loop .
Il runtime deve essere in grado di convertire gli elementi di in group element . L' Option Strict istruzione []
controlla se sono consentite entrambe le conversioni verso un tipo di ingrandimento e più piccolo (
Option Strict è disattivato, il valore predefinito) o se sono consentite solo conversioni verso un tipo di
ingrandimento ( Option Strict è on). Per altre informazioni, vedere conversioniverso un tipo di dati più piccolo.
Il tipo di dati di group deve essere un tipo di riferimento che fa riferimento a una raccolta o a una matrice
enumerabile. In genere, ciò significa che group fa riferimento a un oggetto che implementa l' IEnumerable
interfaccia dello System.Collections spazio dei nomi o l' IEnumerable<T> interfaccia dello
System.Collections.Generic spazio dei nomi. System.Collections.IEnumerable definisce il GetEnumerator
metodo, che restituisce un oggetto enumeratore per la raccolta. L'oggetto enumeratore implementa l'
System.Collections.IEnumerator interfaccia dello System.Collections spazio dei nomi ed espone la Current
proprietà e i Reset MoveNext metodi e. Visual Basic utilizza questi per attraversare la raccolta.
conversioni verso un tipo di dati più piccolo
Quando Option Strict è impostato su, le conversioni verso un tipo di caratteri più On piccolo generano in
genere errori del compilatore. In un' For Each istruzione, tuttavia, le conversioni dagli elementi in group a
element vengono valutate e eseguite in fase di esecuzione e gli errori del compilatore causati da conversioni
verso un tipo di caratteri più piccolo vengono eliminati.
Nell'esempio seguente l'assegnazione di m come valore iniziale di n non viene compilata quando
Option Strict è impostata su on perché la conversione di un oggetto Long in un oggetto Integer è una
conversione verso un tipo di caratteri più piccolo. Nell' For Each istruzione, tuttavia, non viene segnalato alcun
errore del compilatore, anche se l'assegnazione a number richiede la stessa conversione da Long a Integer .
Nell' For Each istruzione che contiene un numero elevato, si verifica un errore di run-time quando ToInteger
viene applicato al numero elevato.

Option Strict On

Module Module1
Sub Main()
' The assignment of m to n causes a compiler error when
' Option Strict is on.
Dim m As Long = 987
'Dim n As Integer = m

' The For Each loop requires the same conversion but
' causes no errors, even when Option Strict is on.
For Each number As Integer In New Long() {45, 3, 987}
Console.Write(number & " ")
Next
Console.WriteLine()
' Output: 45 3 987

' Here a run-time error is raised because 9876543210


' is too large for type Integer.
'For Each number As Integer In New Long() {45, 3, 9876543210}
' Console.Write(number & " ")
'Next

Console.ReadKey()
End Sub
End Module

Chiamate IEnumerator
Quando viene avviata l'esecuzione di un For Each ciclo... Next Visual Basic verifica che faccia group
riferimento a un oggetto raccolta valido. In caso contrario, viene generata un'eccezione. In caso contrario,
chiama il MoveNext metodo e la Current proprietà dell'oggetto enumeratore per restituire il primo elemento. Se
MoveNext indica che non è presente alcun elemento successivo, ovvero se la raccolta è vuota, il For Each ciclo
viene arrestato e il controllo passa all'istruzione che segue l' Next istruzione. In caso contrario, Visual Basic
imposta sul element primo elemento ed esegue il blocco di istruzioni.
Ogni volta che Visual Basic rileva l' Next istruzione, viene restituito all' For Each istruzione. Anche in questo
caso chiama MoveNext e Current per restituire l'elemento successivo, quindi esegue di nuovo il blocco o
arresta il ciclo a seconda del risultato. Questo processo continua fino a MoveNext indicare che non è presente
alcun elemento successivo o che Exit For viene rilevata un'istruzione.
Modifica della raccolta. L'oggetto enumeratore restituito da GetEnumerator normalmente non consente di
modificare la raccolta aggiungendo, eliminando, sostituendo o riordinando gli elementi. Se si modifica la
raccolta dopo che è stato avviato un For Each ciclo... Next , l'oggetto enumeratore diventa non valido e il
tentativo successivo di accedere a un elemento causa un' InvalidOperationException eccezione.
Tuttavia, questo blocco di modifiche non è determinato dall'Visual Basic, bensì dall'implementazione dell'
IEnumerable interfaccia. È possibile implementare IEnumerable in modo da consentire la modifica durante
l'iterazione. Se si sta prendendo in considerazione questa modifica dinamica, assicurarsi di comprendere le
caratteristiche dell' IEnumerable implementazione nella raccolta in uso.
Modifica degli elementi della raccolta. La Current proprietà dell'oggetto enumeratore è ReadOnlye
restituisce una copia locale di ogni elemento della raccolta. Ciò significa che non è possibile modificare gli
elementi stessi in un For Each ciclo... Next . Eventuali modifiche apportate influiscono solo sulla copia locale da
Current e non vengono riflesse nella raccolta sottostante. Tuttavia, se un elemento è un tipo riferimento, è
possibile modificare i membri dell'istanza a cui fa riferimento. Nell'esempio seguente viene modificato il
BackColor membro di ogni thisControl elemento. Non è tuttavia possibile modificare thisControl se stesso.

Sub LightBlueBackground(thisForm As System.Windows.Forms.Form)


For Each thisControl In thisForm.Controls
thisControl.BackColor = System.Drawing.Color.LightBlue
Next thisControl
End Sub

Nell'esempio precedente è possibile modificare il BackColor membro di ogni thisControl elemento, sebbene
non sia possibile modificarlo thisControl .
Attraversamento di matrici. Poiché la Array classe implementa l' IEnumerable interfaccia, tutte le matrici
espongono il GetEnumerator metodo. Ciò significa che è possibile scorrere una matrice con un For Each ciclo...
Next . Tuttavia, è possibile leggere solo gli elementi della matrice. Non è possibile modificarli.

Esempio
Nell'esempio seguente vengono elencate tutte le cartelle presenti in C:\ Directory tramite la DirectoryInfo classe.

Dim dInfo As New System.IO.DirectoryInfo("c:\")


For Each dir As System.IO.DirectoryInfo In dInfo.GetDirectories()
Debug.WriteLine(dir.Name)
Next

Esempio
L'esempio seguente illustra una procedura per ordinare una raccolta. Nell'esempio vengono ordinate le istanze
di una Car classe archiviate in un oggetto List<T> . La classe Car implementa l'interfaccia IComparable<T>,
che richiede l'implementazione del metodo CompareTo.
Ogni chiamata al CompareTo metodo esegue un confronto singolo usato per l'ordinamento. Il codice scritto
dall'utente presente nel metodo CompareTo restituisce un valore per ogni confronto dell'oggetto corrente con
un altro oggetto. Il valore restituito è minore di zero se l'oggetto corrente è inferiore all'altro oggetto, maggiore
di zero se l'oggetto corrente è superiore all'altro oggetto e zero se sono uguali. In questo modo è possibile
definire nel codice i criteri di maggiore, minore e uguale.
Nel metodo ListCars l'istruzione cars.Sort() ordina l'elenco. Questa chiamata al metodo Sort di List<T>
determina la chiamata automatica al metodo CompareTo per gli oggetti Car in List .

Public Sub ListCars()

' Create some new cars.


Dim cars As New List(Of Car) From
{
New Car With {.Name = "car1", .Color = "blue", .Speed = 20},
New Car With {.Name = "car2", .Color = "red", .Speed = 50},
New Car With {.Name = "car3", .Color = "green", .Speed = 10},
New Car With {.Name = "car4", .Color = "blue", .Speed = 50},
New Car With {.Name = "car5", .Color = "blue", .Speed = 30},
New Car With {.Name = "car6", .Color = "red", .Speed = 60},
New Car With {.Name = "car7", .Color = "green", .Speed = 50}
}

' Sort the cars by color alphabetically, and then by speed


' in descending order.
cars.Sort()

' View all of the cars.


For Each thisCar As Car In cars
Debug.Write(thisCar.Color.PadRight(5) & " ")
Debug.Write(thisCar.Speed.ToString & " ")
Debug.Write(thisCar.Name)
Debug.WriteLine("")
Next

' Output:
' blue 50 car4
' blue 30 car5
' blue 20 car1
' green 50 car7
' green 10 car3
' red 60 car6
' red 50 car2
End Sub

Public Class Car


Implements IComparable(Of Car)

Public Property Name As String


Public Property Speed As Integer
Public Property Color As String

Public Function CompareTo(ByVal other As Car) As Integer _


Implements System.IComparable(Of Car).CompareTo
' A call to this method makes a single comparison that is
' used for sorting.

' Determine the relative order of the objects being compared.


' Sort by color alphabetically, and then by speed in
' descending order.

' Compare the colors.


Dim compare As Integer
compare = String.Compare(Me.Color, other.Color, True)

' If the colors are the same, compare the speeds.


If compare = 0 Then
compare = Me.Speed.CompareTo(other.Speed)

' Use descending order for speed.


compare = -compare
End If
End If

Return compare
End Function
End Class

Vedi anche
raccolte
Istruzione For...Next
Strutture di ciclo
Istruzione While...End While
Istruzione Do...Loop
Widening and Narrowing Conversions
Inizializzatori di oggetto: tipi denominati e tipi anonimi
Inizializzatori di insieme
Matrici
Istruzione For...Next (Visual Basic)
05/03/2021 • 15 minutes to read • Edit Online

Ripete un gruppo di istruzioni per un numero di volte specificato.

Sintassi
For counter [ As datatype ] = start To end [ Step step ]
[ statements ]
[ Continue For ]
[ statements ]
[ Exit For ]
[ statements ]
Next [ counter ]

Parti
PA RT E DESC RIZ IO N E

counter Obbligatorio nell' For istruzione. Variabile numerica.


Variabile di controllo per il ciclo. Per ulteriori informazioni,
vedere argomento Counter più avanti in questo argomento.

datatype facoltativo. Tipo di dati di counter . Per ulteriori


informazioni, vedere argomento Counter più avanti in
questo argomento.

start Obbligatorio. Espressione numerica. Il valore iniziale di


counter .

end Obbligatorio. Espressione numerica. Valore finale di


counter .

step facoltativo. Espressione numerica. Importo in base al quale


counter viene incrementato ogni volta nel ciclo.

statements facoltativo. Una o più istruzioni tra For e Next che


eseguono il numero di volte specificato.

Continue For facoltativo. Trasferisce il controllo alla successiva iterazione


del ciclo.

Exit For facoltativo. Trasferisce il controllo all'esterno del For ciclo.

Next Obbligatorio. Termina la definizione del For ciclo.


NOTE
La To parola chiave viene utilizzata in questa istruzione per specificare l'intervallo per il contatore. È anche possibile usare
questa parola chiave nell'oggetto Select... Istruzione case e nelle dichiarazioni di matrici. Per ulteriori informazioni sulle
dichiarazioni di matrici, vedere istruzione Dim.

Semplici esempi
Utilizzare una For struttura... Next quando si desidera ripetere un set di istruzioni per un numero di volte.
Nell'esempio seguente, la index variabile inizia con un valore pari a 1 e viene incrementata a ogni iterazione
del ciclo, terminando dopo il valore di index raggiunge 5.

For index As Integer = 1 To 5


Debug.Write(index.ToString & " ")
Next
Debug.WriteLine("")
' Output: 1 2 3 4 5

Nell'esempio seguente, la number variabile inizia da 2 e viene ridotta di 0,25 in ogni iterazione del ciclo,
terminando dopo il valore di number raggiunge 0. L' Step argomento di -.25 riduce il valore di 0,25 a ogni
iterazione del ciclo.

For number As Double = 2 To 0 Step -0.25


Debug.Write(number.ToString & " ")
Next
Debug.WriteLine("")
' Output: 2 1.75 1.5 1.25 1 0.75 0.5 0.25 0

TIP
Un po'... Istruzione End While o do... L'istruzione Loop funziona bene se non si conosce in anticipo il numero di volte in cui
eseguire le istruzioni nel ciclo. Tuttavia, quando si prevede di eseguire il ciclo un numero specifico di volte, un For ciclo...
Next rappresenta una scelta migliore. Il numero di iterazioni viene determinato quando si immette il ciclo per la prima
volta.

Annidamento di cicli
È possibile annidare For cicli inserendo un ciclo all'interno di un altro. Nell'esempio seguente vengono
illustrate le strutture annidate con For Next valori di passaggio diversi. Il ciclo esterno crea una stringa per
ogni iterazione del ciclo. Il ciclo interno decrementa una variabile del contatore di cicli per ogni iterazione del
ciclo.
For indexA = 1 To 3
' Create a new StringBuilder, which is used
' to efficiently build strings.
Dim sb As New System.Text.StringBuilder()

' Append to the StringBuilder every third number


' from 20 to 1 descending.
For indexB = 20 To 1 Step -3
sb.Append(indexB.ToString)
sb.Append(" ")
Next indexB

' Display the line.


Debug.WriteLine(sb.ToString)
Next indexA
' Output:
' 20 17 14 11 8 5 2
' 20 17 14 11 8 5 2
' 20 17 14 11 8 5 2

Quando si annidano cicli, ogni ciclo deve avere una counter variabile univoca.
È anche possibile annidare strutture di controllo di tipi diversi l'una all'altra. Per altre informazioni, vedere
strutture di controlli annidati.

Esci per e continua per


L' Exit For istruzione esce immediatamente da For ... Next esegue il ciclo e trasferisce il controllo
all'istruzione che segue l' Next istruzione.
L' Continue For istruzione trasferisce immediatamente il controllo all'iterazione successiva del ciclo. Per ulteriori
informazioni, vedere istruzione continue.
Nell'esempio seguente viene illustrato l'utilizzo delle Continue For istruzioni e Exit For .

For index As Integer = 1 To 100000


' If index is between 5 and 7, continue
' with the next iteration.
If index >= 5 AndAlso index <= 8 Then
Continue For
End If

' Display the index.


Debug.Write(index.ToString & " ")

' If index is 10, exit the loop.


If index = 10 Then
Exit For
End If
Next
Debug.WriteLine("")
' Output: 1 2 3 4 9 10

È possibile inserire un numero qualsiasi di Exit For istruzioni in un For ... Next loop. Se utilizzato all'interno
di For ... Next esegue il loop, Exit For esce dal ciclo più interno e trasferisce il controllo al successivo livello di
nidificazione.
Exit For viene spesso usato dopo la valutazione di una condizione, ad esempio in un If ... Then ... Else
struttura). Può essere utile usare Exit For per le condizioni seguenti:
La continuazione dell'iterazione non è necessaria o impossibile. Questa condizione può essere creata da
un valore errato o da una richiesta di terminazione.
A Try ... Catch ... Finally l'istruzione rileva un'eccezione. È possibile utilizzare Exit For alla fine del
Finally blocco.
Si dispone di un ciclo infinito, ovvero un ciclo che può eseguire un numero di volte elevato o addirittura
infinito. Se si rileva una condizione di questo tipo, è possibile utilizzare Exit For per eseguire l'escape
del ciclo. Per ulteriori informazioni, vedere ... Istruzione Loop.

Implementazione tecnica
Quando For viene avviato un ciclo... Next , Visual Basic valuta start , end e step . Visual Basic valuta questi
valori solo in questo momento e quindi assegna start a counter . Prima dell'esecuzione del blocco di
istruzioni, Visual Basic viene confrontato counter con end . Se counter è già maggiore del end valore (o
minore se step è negativo), il For ciclo termina e il controllo passa all'istruzione che segue l' Next istruzione.
In caso contrario, viene eseguito il blocco di istruzioni.
Ogni volta che Visual Basic rileva l' Next istruzione, viene incrementato counter di e viene step restituito all'
For istruzione. Anche in questo caso viene confrontato counter con end e di nuovo esegue il blocco o esce
dal ciclo, a seconda del risultato. Questo processo continua fino a quando non counter end Exit For vengono
rilevati i passaggi o un'istruzione.
Il ciclo non viene arrestato fino a quando non counter viene superato end . Se counter è uguale a end , il
ciclo continua. Il confronto che determina se eseguire il blocco è counter <= end se step è positivo e
counter >= end se step è negativo.

Se si modifica il valore di counter all'interno di un ciclo, il codice potrebbe essere più difficile da leggere ed
eseguire il debug. La modifica del valore di start , end o step non influisce sui valori di iterazione che sono
stati determinati quando il ciclo è stato immesso per la prima volta.
Se si annidano i cicli, il compilatore segnala un errore se rileva l' Next istruzione di un livello di nidificazione
esterno prima dell' Next istruzione di un livello interno. Tuttavia, il compilatore può rilevare questo errore di
sovrapposizione solo se si specifica counter in ogni Next istruzione.
Argomento Step
Il valore di step può essere positivo o negativo. Questo parametro determina l'elaborazione del ciclo in base
alla tabella seguente:

VA LO RE PA SSA GGIO IL C IC LO VIEN E ESEGUITO SE

Positivo o zero counter <= end

Negativo counter >= end

Il valore predefinito di step è 1.


Argomento contatore
La tabella seguente indica se counter definisce una nuova variabile locale con ambito per l'intero For…Next
ciclo. Questa decisione dipende dal fatto che datatype sia presente e che sia counter già definito.
RISULTATO ( SE COUNTER DEF IN ISC E UN A
N UO VA VA RIA B IL E LO C A L E C O N
A M B ITO P ER L 'IN T ERO FOR...NEXT
È DATATYPE P RESEN T E? È COUNTER GIÀ DEF IN ITO ? C IC LO )

No Sì No, perché counter è già definito. Se


l'ambito di counter non è locale alla
routine, viene generato un avviso in
fase di compilazione.

No No Sì. Il tipo di dati viene dedotto dalle


start espressioni, end e step .
Per informazioni sull'inferenza del tipo,
vedere istruzione Option deduce e
inferenza del tipo locale.

Sì Sì Sì, ma solo se la counter variabile


esistente è definita all'esterno della
routine. Tale variabile rimane separata.
Se l'ambito della variabile esistente
counter è locale alla procedura, si
verificherà un errore in fase di
compilazione.

Sì No Sì.

Il tipo di dati di counter determina il tipo di iterazione, che deve essere uno dei tipi seguenti:
Byte ,, SByte , UShort Short , UInteger , Integer , ULong , Long , Decimal , Single O Double .
Enumerazione dichiarata tramite un' istruzione enum.
Oggetto Object .
Tipo T che dispone degli operatori seguenti, dove B è un tipo che può essere utilizzato in un' Boolean
espressione.
Public Shared Operator >= (op1 As T, op2 As T) As B

Public Shared Operator <= (op1 As T, op2 As T) As B

Public Shared Operator - (op1 As T, op2 As T) As T

Public Shared Operator + (op1 As T, op2 As T) As T

Facoltativamente, è possibile specificare la counter variabile nell' Next istruzione. Questa sintassi migliora la
leggibilità del programma, soprattutto se sono presenti cicli nidificati For . È necessario specificare la variabile
visualizzata nell' For istruzione corrispondente.
Le start espressioni, e step possono restituire qualsiasi tipo di dati che viene ampliato al tipo di
end
counter . Se si utilizza un tipo definito dall'utente per counter , potrebbe essere necessario definire l' CType
operatore di conversione per convertire i tipi di start , end o nel step tipo di counter .

Esempio
Nell'esempio seguente vengono rimossi tutti gli elementi da un elenco generico. Anziché per ogni...
Nell'istruzione successiva, nell'esempio viene illustrata un' For istruzione... che esegue l' Next iterazione in
ordine decrescente. L'esempio usa questa tecnica perché il removeAt metodo fa sì che gli elementi dopo
l'elemento rimosso abbiano un valore di indice inferiore.
Dim lst As New List(Of Integer) From {10, 20, 30, 40}

For index As Integer = lst.Count - 1 To 0 Step -1


lst.RemoveAt(index)
Next

Debug.WriteLine(lst.Count.ToString)
' Output: 0

Esempio
Nell'esempio seguente viene iterata un'enumerazione dichiarata tramite un' istruzione enum.

Public Enum Mammals


Buffalo
Gazelle
Mongoose
Rhinoceros
Whale
End Enum

Public Sub ListSomeMammals()


For mammal As Mammals = Mammals.Gazelle To Mammals.Rhinoceros
Debug.Write(mammal.ToString & " ")
Next
Debug.WriteLine("")
' Output: Gazelle Mongoose Rhinoceros
End Sub

Esempio
Nell'esempio seguente, i parametri dell'istruzione usano una classe con overload di operatori per gli + -
operatori,, >= e <= .
Private Class Distance
Public Property Number() As Double

Public Sub New(ByVal number As Double)


Me.Number = number
End Sub

' Define operator overloads to support For...Next statements.


Public Shared Operator +(ByVal op1 As Distance, ByVal op2 As Distance) As Distance
Return New Distance(op1.Number + op2.Number)
End Operator

Public Shared Operator -(ByVal op1 As Distance, ByVal op2 As Distance) As Distance
Return New Distance(op1.Number - op2.Number)
End Operator

Public Shared Operator >=(ByVal op1 As Distance, ByVal op2 As Distance) As Boolean
Return (op1.Number >= op2.Number)
End Operator

Public Shared Operator <=(ByVal op1 As Distance, ByVal op2 As Distance) As Boolean
Return (op1.Number <= op2.Number)
End Operator
End Class

Public Sub ListDistances()


Dim distFrom As New Distance(10)
Dim distTo As New Distance(25)
Dim distStep As New Distance(4)

For dist As Distance = distFrom To distTo Step distStep


Debug.Write(dist.Number.ToString & " ")
Next
Debug.WriteLine("")

' Output: 10 14 18 22
End Sub

Vedi anche
List<T>
Strutture di ciclo
Istruzione While...End While
Istruzione Do...Loop
Strutture di controllo annidate
Istruzione Exit
raccolte
Istruzione Function (Visual Basic)
05/03/2021 • 15 minutes to read • Edit Online

Dichiara il nome, i parametri e il codice che definiscono una Function routine.

Sintassi
[ <attributelist> ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ] [ Async | Iterator ]
Function name [ (Of typeparamlist) ] [ (parameterlist) ] [ As returntype ] [ Implements implementslist |
Handles eventlist ]
[ statements ]
[ Exit Function ]
[ statements ]
End Function

Parti
attributelist

facoltativo. Vedere elenco attributi.


accessmodifier

facoltativo. Può essere uno dei seguenti:


Pubblica
Protetto
Friend
Privata
Protected Friend
Privato protetto
Vedere livelli di accesso in Visual Basic.
proceduremodifiers

facoltativo. Può essere uno dei seguenti:


Overload
Override
Overridable
NotOverridable
MustOverride
MustOverride Overrides

NotOverridable Overrides

Shared
facoltativo. Vedere Shared.
Shadows

facoltativo. Vedere Shadows.


Async

facoltativo. Vedere Async.


Iterator

facoltativo. Vedere iteratore.


name

Obbligatorio. Nome della procedura. Vedere Declared Element Names.


typeparamlist

facoltativo. Elenco di parametri di tipo per una routine generica. Vedere elenco dei tipi.
parameterlist

facoltativo. Elenco di nomi di variabili locali che rappresentano i parametri di questa procedura. Vedere
elenco di parametri.
returntype

Obbligatorio se Option Strict è On . Tipo di dati del valore restituito da questa procedura.
Implements

facoltativo. Indica che questa procedura implementa una o più Function procedure, ognuna delle quali è
definita in un'interfaccia implementata dalla classe o dalla struttura contenitore di questa procedura.
Vedere istruzione Implements.
implementslist

Necessario se si fornisce Implements . Elenco delle routine Function implementate.


implementedprocedure [ , implementedprocedure ... ]

Ogni implementedprocedure presenta la sintassi e le parti seguenti:


interface.definedname

PA RT E DESC RIZ IO N E

interface Obbligatorio. Nome di un'interfaccia implementata dalla


classe o dalla struttura contenitore di questa procedura.

definedname Obbligatorio. Nome mediante il quale la routine viene


definita in interface .

Handles

facoltativo. Indica che questa procedura può gestire uno o più eventi specifici. Vedere handle.
eventlist

Necessario se si fornisce Handles . Elenco di eventi gestiti da questa procedura.


eventspecifier [ , eventspecifier ... ]

Ogni eventspecifier presenta la sintassi e le parti seguenti:


eventvariable.event

PA RT E DESC RIZ IO N E

eventvariable Obbligatorio. Variabile oggetto dichiarata con il tipo di


dati della classe o della struttura che genera l'evento.

event Obbligatorio. Nome dell'evento gestito da questa


procedura.

statements

facoltativo. Blocco di istruzioni da eseguire all'interno di questa procedura.


End Function

Termina la definizione di questa procedura.

Commenti
Tutto il codice eseguibile deve trovarsi all'interno di una routine. Ogni procedura, a sua volta, viene dichiarata
all'interno di una classe, di una struttura o di un modulo a cui viene fatto riferimento come classe, struttura o
modulo contenitore.
Per restituire un valore al codice chiamante, utilizzare una Function stored procedure; in caso contrario,
utilizzare una Sub routine.

Definizione di una funzione


È possibile definire una Function procedura solo a livello di modulo. Pertanto, il contesto di dichiarazione per
una funzione deve essere una classe, una struttura, un modulo o un'interfaccia e non può essere un file di
origine, uno spazio dei nomi, una procedura o un blocco. Per altre informazioni, vedere Contesti delle
dichiarazioni e livelli di accesso predefiniti.
Function per impostazione predefinita, le procedure sono con accesso pubblico. È possibile modificare i livelli
di accesso con i modificatori di accesso.
Una Function procedura può dichiarare il tipo di dati del valore restituito dalla stored procedure. È possibile
specificare qualsiasi tipo di dati o il nome di un'enumerazione, una struttura, una classe o un'interfaccia. Se non
si specifica il returntype parametro, la procedura restituisce Object .
Se questa routine usa la Implements parola chiave, la classe o la struttura contenitore deve avere anche un'
Implements istruzione che segue immediatamente la relativa Class Structure istruzione o. L' Implements
istruzione deve includere ogni interfaccia specificata in implementslist . Tuttavia, il nome con cui un'interfaccia
definisce Function (in definedname ) non deve corrispondere al nome di questa procedura (in name ).

NOTE
È possibile utilizzare le espressioni lambda per definire espressioni di funzione inline. Per altre informazioni, vedere
espressione di funzione ed espressioni lambda.

Restituzione da una funzione


Quando la Function procedura viene restituita al codice chiamante, l'esecuzione continua con l'istruzione che
segue l'istruzione che ha chiamato la procedura.
Per restituire un valore da una funzione, è possibile assegnare il valore al nome della funzione o includerlo in un'
Return istruzione.

L' Return istruzione assegna simultaneamente il valore restituito e chiude la funzione, come illustrato
nell'esempio seguente.

Function MyFunction(ByVal j As Integer) As Double


Return 3.87 * j
End Function

Nell'esempio seguente viene assegnato il valore restituito al nome della funzione myFunction e quindi viene
utilizzata l' Exit Function istruzione per restituire.

Function MyFunction(ByVal j As Integer) As Double


MyFunction = 3.87 * j
Exit Function
End Function

Le Exit Function Return istruzioni e generano un'uscita immediata da una Function routine. Qualsiasi
numero di Exit Function Return istruzioni e può comparire in qualsiasi punto della procedura ed è possibile
combinare le Exit Function Return istruzioni e.
Se si utilizza Exit Function senza assegnare un valore a name , la stored procedure restituisce il valore
predefinito per il tipo di dati specificato in returntype . Se returntype non è specificato, la procedura restituisce
Nothing , che rappresenta il valore predefinito per Object .

Chiamata di una funzione


È possibile chiamare una Function stored procedure utilizzando il nome della procedura, seguito dall'elenco di
argomenti tra parentesi, in un'espressione. È possibile omettere le parentesi solo se non si forniscono
argomenti. Tuttavia, il codice è più leggibile se si includono sempre le parentesi.
È possibile chiamare una Function stored procedure nello stesso modo in cui si chiama qualsiasi funzione di
libreria, ad esempio Sqrt , Cos o ChrW .
È anche possibile chiamare una funzione usando la Call parola chiave. In tal caso, il valore restituito viene
ignorato. Call Nella maggior parte dei casi non è consigliabile usare la parola chiave. Per ulteriori informazioni,
vedere istruzione Call.
Visual Basic a volte riorganizza le espressioni aritmetiche per aumentare l'efficienza interna. Per questo motivo,
non è consigliabile utilizzare una Function stored procedure in un'espressione aritmetica quando la funzione
modifica il valore delle variabili nella stessa espressione.

Funzioni asincrone
La funzionalità asincrona consente di richiamare funzioni asincrone senza usare callback espliciti o suddividere
manualmente il codice in più funzioni o espressioni lambda.
Se si contrassegna una funzione con il modificatore Async , è possibile usare l'operatore await nella funzione.
Quando il controllo raggiunge un' Await espressione nella Async funzione, il controllo torna al chiamante e
l'avanzamento nella funzione viene sospeso fino al completamento dell'attività attesa. Al termine dell'attività,
l'esecuzione può riprendere nella funzione.
NOTE
Una Async routine restituisce al chiamante quando rileva il primo oggetto atteso che non è ancora completo o
raggiunge la fine della Async procedura, a seconda di quale si verifica per primo.

Una Async funzione può avere un tipo restituito di Task<TResult> o Task . Di seguito è riportato un esempio di
una Async funzione con un tipo restituito Task<TResult> .
Una Async funzione non può dichiarare parametri ByRef .
Un' istruzione Sub può anche essere contrassegnata con il Async modificatore. Viene utilizzato principalmente
per i gestori eventi, in cui non è possibile restituire un valore. Una Async Sub routine non può essere attesa e il
chiamante di una Async Sub routine non può intercettare le eccezioni generate dalla Sub procedura.
Per altre informazioni sulle Async funzioni, vedere programmazione asincrona con Async e await, flusso di
controllo in programmi asincronie tipi restituiti asincroni.

Funzioni iteratore
Una funzione iteratore esegue un'iterazione personalizzata su una raccolta, ad esempio un elenco o una matrice.
Una funzione iteratore usa l'istruzione yield per restituire un elemento alla volta. Quando viene raggiunta
un'istruzione yield , viene memorizzata la posizione corrente nel codice. L'esecuzione viene riavviata a partire da
quella posizione la volta successiva che viene chiamata la funzione iteratore.
È possibile chiamare un iteratore dal codice client usando un per ogni... Istruzione successiva .
Il tipo restituito di una funzione iteratore può essere IEnumerable , IEnumerable<T> , IEnumerator o
IEnumerator<T> .
Per ulteriori informazioni, vedere iteratori.

Esempio
Nell'esempio seguente viene utilizzata l' Function istruzione per dichiarare il nome, i parametri e il codice che
formano il corpo di una Function routine. Il ParamArray modificatore consente alla funzione di accettare un
numero variabile di argomenti.

Public Function CalcSum(ByVal ParamArray args() As Double) As Double


CalcSum = 0
If args.Length <= 0 Then Exit Function
For i As Integer = 0 To UBound(args, 1)
CalcSum += args(i)
Next i
End Function

Esempio
Nell'esempio seguente viene richiamata la funzione dichiarata nell'esempio precedente.
Module Module1

Sub Main()
' In the following function call, CalcSum's local variables
' are assigned the following values: args(0) = 4, args(1) = 3,
' and so on. The displayed sum is 10.
Dim returnedValue As Double = CalcSum(4, 3, 2, 1)
Console.WriteLine("Sum: " & returnedValue)
' Parameter args accepts zero or more arguments. The sum
' displayed by the following statements is 0.
returnedValue = CalcSum()
Console.WriteLine("Sum: " & returnedValue)
End Sub

Public Function CalcSum(ByVal ParamArray args() As Double) As Double


CalcSum = 0
If args.Length <= 0 Then Exit Function
For i As Integer = 0 To UBound(args, 1)
CalcSum += args(i)
Next i
End Function

End Module

Esempio
Nell'esempio seguente DelayAsync è un oggetto Async Function che ha un tipo restituito Task<TResult> .
DelayAsync ha un'istruzione Return che restituisce un numero intero. La dichiarazione di funzione di
DelayAsync deve quindi avere un tipo restituito Task(Of Integer) . Poiché il tipo restituito è Task(Of Integer) ,
la valutazione dell' Await espressione in DoSomethingAsync genera un numero intero. Questa operazione viene
illustrata in questa istruzione: Dim result As Integer = Await delayTask .
La startButton_Click procedura è un esempio di Async Sub procedura. Poiché DoSomethingAsync è una Async
funzione, l'attività per la chiamata a DoSomethingAsync deve essere attesa, come illustrato nell'istruzione
seguente: Await DoSomethingAsync() . La startButton_Click Sub procedura deve essere definita con il Async
modificatore perché contiene un' Await espressione.
' Imports System.Diagnostics
' Imports System.Threading.Tasks

' This Click event is marked with the Async modifier.


Private Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.Click
Await DoSomethingAsync()
End Sub

Private Async Function DoSomethingAsync() As Task


Dim delayTask As Task(Of Integer) = DelayAsync()
Dim result As Integer = Await delayTask

' The previous two statements may be combined into


' the following statement.
' Dim result As Integer = Await DelayAsync()

Debug.WriteLine("Result: " & result)


End Function

Private Async Function DelayAsync() As Task(Of Integer)


Await Task.Delay(100)
Return 5
End Function

' Output:
' Result: 5

Vedi anche
Istruzione Sub
Routine Function
Elenco parametri
Istruzione Dim
Istruzione Call
Di
Matrici di parametri
Procedura: Usare una classe generica
Risoluzione dei problemi relativi alle routine
Espressioni lambda
Espressione di funzione
Istruzione Get
05/03/2021 • 6 minutes to read • Edit Online

Dichiara una Get routine di proprietà utilizzata per recuperare il valore di una proprietà.

Sintassi
[ <attributelist> ] [ accessmodifier ] Get()
[ statements ]
End Get

Parti
T ERM IN E DEF IN IZ IO N E

attributelist facoltativo. Vedere elenco attributi.

accessmodifier Facoltativo al massimo una delle Get Set istruzioni e in


questa proprietà. Può essere uno dei seguenti:

- Protetto
- Amico
- Privata
- Protected Friend

Vedere livelli di accesso in Visual Basic.

statements facoltativo. Una o più istruzioni che vengono eseguite


quando Get viene chiamata la routine della proprietà.

End Get Obbligatorio. Termina la definizione della routine della Get


Proprietà.

Commenti
Ogni proprietà deve disporre di una Get routine Property, a meno che la proprietà non sia contrassegnata
come WriteOnly . La Get stored procedure viene utilizzata per restituire il valore corrente della proprietà.
Visual Basic chiama automaticamente la routine di una proprietà Get quando un'espressione richiede il valore
della proprietà.
Il corpo della dichiarazione di proprietà può contenere solo le Get routine e della proprietà Set tra l' istruzione
Property e l' End Property istruzione. Non è possibile archiviare un valore diverso da tali procedure. In
particolare, non è possibile archiviare il valore corrente della proprietà. È necessario archiviare questo valore
all'esterno della proprietà, perché se viene archiviato in una delle routine della proprietà, l'altra routine della
proprietà non potrà accedervi. L'approccio usuale consiste nell'archiviare il valore in una variabile privata
dichiarata allo stesso livello della proprietà. È necessario definire una Get routine all'interno della proprietà a
cui si applica.
Get Per impostazione predefinita, la procedura viene impostata sul livello di accesso della proprietà che lo
contiene, a meno che non si utilizzi accessmodifier nell' Get istruzione.

Regole
Livelli di accesso misti. Se si definisce una proprietà di lettura/scrittura, è possibile specificare
facoltativamente un livello di accesso diverso per la Get routine o Set , ma non per entrambi. In tal
caso, il livello di accesso della routine deve essere più restrittivo del livello di accesso della proprietà. Se,
ad esempio, la proprietà è dichiarata Friend , è possibile dichiarare la Get routine Private , ma non
Public .

Se si definisce una ReadOnly proprietà, la Get routine rappresenta l'intera proprietà. Non è possibile
dichiarare un livello di accesso diverso per Get , perché in questo caso verrebbero impostati due livelli di
accesso per la proprietà.
Tipo restituito. L' istruzione Property può dichiarare il tipo di dati del valore restituito. La Get stored
procedure restituisce automaticamente il tipo di dati. È possibile specificare qualsiasi tipo di dati o il nome
di un'enumerazione, una struttura, una classe o un'interfaccia.
Se l' Property istruzione non specifica returntype , la procedura restituisce Object .

Comportamento
Restituzione da una routine. Quando la Get procedura viene restituita al codice chiamante,
l'esecuzione continua all'interno dell'istruzione che ha richiesto il valore della proprietà.
Get le routine Property possono restituire un valore utilizzando l' istruzione return o assegnando il
valore restituito al nome della proprietà. Per ulteriori informazioni, vedere "valore restituito" nell'
istruzione Function.
Le Exit Property Return istruzioni e generano un'uscita immediata da una routine di proprietà.
Qualsiasi numero di Exit Property Return istruzioni e può comparire in qualsiasi punto della procedura
ed è possibile combinare le Exit Property Return istruzioni e.
Valore restituito. Per restituire un valore da una Get routine, è possibile assegnare il valore al nome
della proprietà o includerlo in un' istruzione Return. L' Return istruzione assegna simultaneamente il
Get valore restituito della routine e chiude la procedura.

Se si utilizza Exit Property senza assegnare un valore al nome della proprietà, la Get stored procedure
restituisce il valore predefinito per il tipo di dati della proprietà. Per ulteriori informazioni, vedere "valore
restituito" nell' istruzione Function.
Nell'esempio seguente vengono illustrati due modi in cui la proprietà quoteForTheDay di sola lettura può
restituire il valore contenuto nella variabile privata quoteValue .

Private quoteValue As String = "No quote assigned yet."

ReadOnly Property QuoteForTheDay() As String


Get
QuoteForTheDay = quoteValue
Exit Property
End Get
End Property
ReadOnly Property QuoteForTheDay() As String
Get
Return quoteValue
End Get
End Property

Esempio
Nell'esempio seguente viene utilizzata l' Get istruzione per restituire il valore di una proprietà.

Class propClass
' Define a private local variable to store the property value.
Private currentTime As String
' Define the read-only property.
Public ReadOnly Property DateAndTime() As String
Get
' The Get procedure is called automatically when the
' value of the property is retrieved.
currentTime = CStr(Now)
' Return the date and time As a string.
Return currentTime
End Get
End Property
End Class

Vedi anche
Istruzione set
Property Statement
Istruzione Exit
Oggetti e classi
Procedura dettagliata: definizione delle classi
Istruzione GoTo
05/03/2021 • 3 minutes to read • Edit Online

Viene diramato in modo incondizionato a una riga specificata in una procedura.

Sintassi
GoTo line

Parte
line
Obbligatorio. Qualsiasi etichetta di riga.

Commenti
L' GoTo istruzione può creare un ramo solo per le righe della routine in cui viene visualizzata. La riga deve avere
un'etichetta di linea GoTo a cui può fare riferimento. Per altre informazioni, vedere How to: Label statements.

NOTE
GoTo le istruzioni possono rendere difficile la lettura e la gestione del codice. Quando possibile, usare invece una
struttura di controllo. Per altre informazioni, vedere Flusso di controllo.

Non è possibile usare un' GoTo istruzione per creare un ramo dall'esterno di For ... Next , For Each ... Next ,.
SyncLock .. End SyncLock , Try .. Catch . ... Finally , With ... End With o Using ... End Using costruzione in
un'etichetta all'interno di.

Creazione di rami e tentativi di costruzione


All'interno di Try .. Catch . ... Finally costruzione, le regole seguenti si applicano alla diramazione con l' GoTo
istruzione.

B LO C C O O A REA DIRA M A Z IO N E IN DA L L 'EST ERN O DIRA M A Z IO N E DA L L 'IN T ERN O

Try blocco Solo da un Catch blocco della stessa Solo all'esterno dell'intera costruzione
costruzione 1

Catch blocco Mai consentito Solo all'esterno dell'intera costruzione


o al Try blocco della stessa
costruzione 1

Finally blocco Mai consentito Mai consentito

1 se uno Try ... Catch ... Finally la costruzione è annidata all'interno di un'altra, un Catch blocco può creare
rami nel Try blocco al proprio livello di annidamento, ma non in un altro Try blocco. Oggetto annidato Try ...
Catch ... Finally la costruzione deve essere completamente inclusa in Try un Catch blocco o della
costruzione all'interno della quale è annidata.
Nella figura seguente viene illustrata una Try costruzione annidata all'interno di un'altra. Vari rami tra i blocchi
delle due costruzioni sono indicati come validi o non validi.

Esempio
Nell'esempio seguente viene utilizzata l' GoTo istruzione per creare un ramo delle etichette di riga in una
procedura.

Sub GoToStatementDemo()
Dim number As Integer = 1
Dim sampleString As String
' Evaluate number and branch to appropriate label.
If number = 1 Then GoTo Line1 Else GoTo Line2
Line1:
sampleString = "Number equals 1"
GoTo LastLine
Line2:
' The following statement never gets executed because number = 1.
sampleString = "Number equals 2"
LastLine:
' Write "Number equals 1" in the Debug window.
Debug.WriteLine(sampleString)
End Sub

Vedi anche
Istruzione Do...Loop
Istruzione For...Next
Istruzione For Each...Next
Istruzione If...Then...Else
Istruzione Select...Case
Istruzione Try...Catch...Finally
Istruzione While...End While
Istruzione With...End With
Istruzione If...Then...Else (Visual Basic) |
05/03/2021 • 8 minutes to read • Edit Online

Esegue un gruppo di istruzioni in base a determinate condizioni, a seconda del valore di un'espressione.

Sintassi
' Multiline syntax:
If condition [ Then ]
[ statements ]
[ ElseIf elseifcondition [ Then ]
[ elseifstatements ] ]
[ Else
[ elsestatements ] ]
End If

' Single-line syntax:


If condition Then [ statements ] [ Else [ elsestatements ] ]

Collegamenti rapidi al codice di esempio


Questo articolo include diversi esempi che illustrano gli usi del If ... Then ... Else istruzione
Esempio di sintassi su più righe
Esempio di sintassi annidata
Esempio di sintassi a riga singola

Parti
condition
Obbligatorio. Espressione. Deve restituire True o oppure False a un tipo di dati convertibile in modo implicito
in Boolean .
Se l'espressione è una variabile Nullable Boolean che non restituisce alcunvalore, la condizione viene
considerata come se l'espressione è False e i ElseIf blocchi vengono valutati se esistono oppure il Else
blocco viene eseguito se esistente.
Then
Obbligatorio nella sintassi a riga singola; facoltativo nella sintassi su più righe.
statements
facoltativo. Una o più istruzioni If che seguono... Then che vengono eseguite se condition restituisce True .
elseifcondition
Obbligatorio se ElseIf è presente. Espressione. Deve restituire True o oppure False a un tipo di dati
convertibile in modo implicito in Boolean .
elseifstatements
facoltativo. Una o più istruzioni ElseIf che seguono... Then che vengono eseguite se elseifcondition
restituisce True .
elsestatements
facoltativo. Una o più istruzioni eseguite se nessuna condition espressione o precedente elseifcondition
restituisce True .
End If
Termina la versione multiriga di If ... Then ... Else blocco.

Commenti
Sintassi su più righe
Quando un If ... Then ... Else viene rilevata l'istruzione, condition viene testata. Se condition è True ,
vengono eseguite le istruzioni seguenti Then . Se condition è False , ogni ElseIf istruzione, se presente,
viene valutata in ordine. Quando True elseifcondition viene trovato un oggetto, vengono eseguite le
istruzioni immediatamente successive all'oggetto associato ElseIf . Se nessun elseifcondition True oggetto
restituisce o se non sono presenti ElseIf istruzioni, verranno eseguite le istruzioni seguenti Else . Dopo
l'esecuzione delle istruzioni che seguono Then , ElseIf o Else , l'esecuzione continua con l'istruzione
seguente End If .
Le ElseIf Else clausole e sono entrambe facoltative. È possibile avere tutte le ElseIf clausole desiderate in
If ... Then ... Else ma non ElseIf può comparire dopo una Else clausola. If ... Then ... Else le istruzioni
possono essere nidificate l'una all'altra.
Nella sintassi su più righe, l' If istruzione deve essere l'unica istruzione nella prima riga. Le ElseIf Else
istruzioni, e End If possono essere precedute solo da un'etichetta di riga. .. If . Then ... Else il blocco deve
terminare con un' End If istruzione.

TIP
L'oggetto Select... L'istruzione case può essere più utile quando si valuta una singola espressione con diversi valori
possibili.

Sintassi Single -Line


È possibile utilizzare la sintassi a riga singola per una singola condizione con codice da eseguire se è true.
Tuttavia, la sintassi a più righe fornisce maggiore struttura e flessibilità ed è più facile da leggere, gestire ed
eseguire il debug.
Then Di seguito viene esaminata la parola chiave per determinare se un'istruzione è a riga singola If . Se viene
visualizzato un valore diverso da un commento dopo Then sulla stessa riga, l'istruzione viene considerata come
un'istruzione a riga singola If . Se Then è assente, deve essere l'inizio di una riga a più righe If ... Then ...
Else .

Nella sintassi a riga singola è possibile eseguire più istruzioni come risultato di una If decisione... Then . Tutte
le istruzioni devono trovarsi sulla stessa riga ed essere separate da due punti.

Esempio di sintassi su più righe


Nell'esempio seguente viene illustrato l'utilizzo della sintassi multiriga di If ... Then ... Else istruzione.
Module Multiline
Public Sub Main()
'Create a Random object to seed our starting value
Dim randomizer As New Random()
'set our variable
Dim count As Integer = randomizer.Next(0, 5)

Dim message As String

'If count is zero, output will be no items


If count = 0 Then
message = "There are no items."
'If count is 1, output will be "There is 1 item.".
ElseIf count = 1 Then
message = "There is 1 item."
'If count is greater than 1, output will be "There are {count} items.", where {count} is replaced by
the value of count.
Else
message = $"There are {count} items."
End If

Console.WriteLine(message)
End Sub
End Module
'This example displays output like the following:
' There are 4 items.

Esempio di sintassi annidata


L'esempio seguente contiene un oggetto annidato If ... Then ... Else istruzioni.

Module Nested
Public Sub Main()
' Run the function as part of the WriteLine output.
Console.WriteLine("Time Check is " & CheckIfTime() & ".")
End Sub

Private Function CheckIfTime() As Boolean


' Determine the current day of week and hour of day.
Dim dayW As DayOfWeek = DateTime.Now.DayOfWeek
Dim hour As Integer = DateTime.Now.Hour

' Return True if Wednesday from 2 to 3:59 P.M.,


' or if Thursday from noon to 12:59 P.M.
If dayW = DayOfWeek.Wednesday Then
If hour = 14 Or hour = 15 Then
Return True
Else
Return False
End If
ElseIf dayW = DayOfWeek.Thursday Then
If hour = 12 Then
Return True
Else
Return False
End If
Else
Return False
End If
End Function
End Module
'This example displays output like the following:
'Time Check is False.
Esempio di sintassi Single-Line
Nell'esempio seguente viene illustrato l'utilizzo della sintassi a riga singola.

Module SingleLine
Public Sub Main()

'Create a Random object to seed our starting values


Dim randomizer As New Random()

Dim A As Integer = randomizer.Next(10, 20)


Dim B As Integer = randomizer.Next(0, 20)
Dim C As Integer = randomizer.Next(0, 5)

'Let's display the initial values for comparison


Console.WriteLine($"A value before If: {A}")
Console.WriteLine($"B value before If: {B}")
Console.WriteLine($"C value before If: {C}")

' If A > 10, execute the three colon-separated statements in the order
' that they appear
If A > 10 Then A = A + 1 : B = B + A : C = C + B

'If the condition is true, the values will be different


Console.WriteLine($"A value after If: {A}")
Console.WriteLine($"B value after If: {B}")
Console.WriteLine($"C value after If: {C}")

End Sub
End Module
'This example displays output like the following:
'A value before If: 11
'B value before If: 6
'C value before If: 3
'A value after If: 12
'B value after If: 18
'C value after If: 21

Vedi anche
Choose
Switch
#If... Direttive then... #Else
Istruzione Select...Case
Strutture di controllo annidate
Strutture decisionali
Operatori logici e bit per bit in Visual Basic
Operatore If
Istruzione Implements
05/03/2021 • 4 minutes to read • Edit Online

Specifica una o più interfacce o membri di interfaccia che devono essere implementati nella definizione della
classe o della struttura in cui vengono visualizzati.

Sintassi
Implements interfacename [, ...]
' -or-
Implements interfacename.interfacemember [, ...]

Parti
interfacename
Obbligatorio. Interfaccia le cui proprietà, routine ed eventi devono essere implementati dai membri
corrispondenti nella classe o nella struttura.
interfacemember
Obbligatorio. Membro di un'interfaccia implementata.

Commenti
Un'interfaccia è una raccolta di prototipi che rappresentano i membri (proprietà, routine ed eventi) che
l'interfaccia incapsula. Le interfacce contengono solo le dichiarazioni per i membri; le classi e le strutture
implementano questi membri. Per ulteriori informazioni, vedi Interfacce.
L' Implements istruzione deve seguire immediatamente l' Class Structure istruzione o.
Quando si implementa un'interfaccia, è necessario implementare tutti i membri dichiarati nell'interfaccia.
L'omissione di qualsiasi membro viene considerato un errore di sintassi. Per implementare un singolo membro,
è necessario specificare la parola chiave Implements , che è separata dall' Implements istruzione, quando si
dichiara il membro nella classe o nella struttura. Per ulteriori informazioni, vedi Interfacce.
Le classi possono usare implementazioni private di proprietà e procedure, ma questi membri sono accessibili
solo eseguendo il cast di un'istanza della classe di implementazione in una variabile dichiarata come tipo
dell'interfaccia.

Esempio
Nell'esempio seguente viene illustrato come utilizzare l' Implements istruzione per implementare i membri di
un'interfaccia. Definisce un'interfaccia denominata ICustomerInfo con un evento, una proprietà e una routine. La
classe customerInfo implementa tutti i membri definiti nell'interfaccia.
Public Interface ICustomerInfo
Event UpdateComplete()
Property CustomerName() As String
Sub UpdateCustomerStatus()
End Interface

Public Class customerInfo


Implements ICustomerInfo
' Storage for the property value.
Private customerNameValue As String
Public Event UpdateComplete() Implements ICustomerInfo.UpdateComplete
Public Property CustomerName() As String _
Implements ICustomerInfo.CustomerName
Get
Return customerNameValue
End Get
Set(ByVal value As String)
' The value parameter is passed to the Set procedure
' when the contents of this property are modified.
customerNameValue = value
End Set
End Property

Public Sub UpdateCustomerStatus() _


Implements ICustomerInfo.UpdateCustomerStatus
' Add code here to update the status of this account.
' Raise an event to indicate that this procedure is done.
RaiseEvent UpdateComplete()
End Sub
End Class

Si noti che la classe customerInfo Usa l' Implements istruzione in una riga separata del codice sorgente per
indicare che la classe implementa tutti i membri dell' ICustomerInfo interfaccia. Ogni membro della classe usa
quindi la Implements parola chiave come parte della dichiarazione del membro per indicare che implementa il
membro di interfaccia.

Esempio
Le due procedure seguenti illustrano come usare l'interfaccia implementata nell'esempio precedente. Per testare
l'implementazione, aggiungere queste procedure al progetto e chiamare la testImplements procedura.

Public Sub TestImplements()


' This procedure tests the interface implementation by
' creating an instance of the class that implements ICustomerInfo.
Dim cust As ICustomerInfo = New customerInfo()
' Associate an event handler with the event that is raised by
' the cust object.
AddHandler cust.UpdateComplete, AddressOf HandleUpdateComplete
' Set the CustomerName Property
cust.CustomerName = "Fred"
' Retrieve and display the CustomerName property.
MsgBox("Customer name is: " & cust.CustomerName)
' Call the UpdateCustomerStatus procedure, which raises the
' UpdateComplete event.
cust.UpdateCustomerStatus()
End Sub

Sub HandleUpdateComplete()
' This is the event handler for the UpdateComplete event.
MsgBox("Update is complete.")
End Sub
Vedi anche
Implementazioni
Istruzione Interface
Interfacce
Istruzione Imports (tipo e spazio dei nomi .NET)
05/03/2021 • 7 minutes to read • Edit Online

Consente di fare riferimento ai nomi dei tipi senza qualifica dello spazio dei nomi.

Sintassi
Imports [ aliasname = ] namespace
' -or-
Imports [ aliasname = ] namespace.element

Parti
T ERM IN E DEF IN IZ IO N E

aliasname facoltativo. Alias o nome di importazione a cui il codice può


fare riferimento al namespace posto della stringa di
qualificazione completa. Vedere Declared Element Names.

namespace Obbligatorio. Nome completo dello spazio dei nomi


importato. Può essere una stringa di spazi dei nomi annidati
a qualsiasi livello.

element facoltativo. Nome di un elemento di programmazione


dichiarato nello spazio dei nomi. Può essere qualsiasi
elemento contenitore.

Commenti
L' Imports istruzione consente di fare riferimento direttamente ai tipi contenuti in un determinato spazio dei
nomi.
È possibile specificare un singolo nome di spazio dei nomi o una stringa di spazi dei nomi annidati. Ogni spazio
dei nomi annidato è separato dallo spazio dei nomi di livello superiore successivo per un punto ( . ), come
illustrato nell'esempio seguente:

Imports System.Collections.Generic

Ogni file di origine può contenere un numero qualsiasi di Imports istruzioni. Devono seguire qualsiasi
dichiarazione di opzione, ad esempio l' Option Strict istruzione, e devono precedere qualsiasi dichiarazione di
elemento di programmazione, ad esempio Module istruzioni o Class .
È possibile usare Imports solo a livello di file. Ciò significa che il contesto di dichiarazione per l'importazione
deve essere un file di origine e non può essere uno spazio dei nomi, una classe, una struttura, un modulo,
un'interfaccia, una routine o un blocco.
Si noti che l' Imports istruzione non rende disponibili gli elementi di altri progetti e assembly per il progetto.
L'importazione non comporta l'impostazione di un riferimento. Rimuove solo la necessità di qualificare i nomi
già disponibili per il progetto. Per ulteriori informazioni, vedere "importazione di elementi contenitore" in
riferimenti a elementi dichiarati.

NOTE
È possibile definire istruzioni implicite Imports usando la pagina riferimenti, Progettazione progetti (Visual Basic). Per
ulteriori informazioni, vedere procedura: aggiungere o rimuovere spazi dei nomi importati (Visual Basic).

Alias di importazione
Un alias di importazione definisce l'alias per uno spazio dei nomi o un tipo. Gli alias di importazione sono utili
quando è necessario usare elementi con lo stesso nome dichiarati in uno o più spazi dei nomi. Per ulteriori
informazioni e un esempio, vedere "qualificazione di un nome di elemento" in riferimenti a elementi dichiarati.
Non è consigliabile dichiarare un membro a livello di modulo con lo stesso nome di aliasname . In tal caso, il
compilatore Visual Basic utilizza aliasname solo per il membro dichiarato e non lo riconosce più come alias di
importazione.
Sebbene la sintassi utilizzata per dichiarare un alias di importazione sia simile a quella utilizzata per
l'importazione di un prefisso dello spazio dei nomi XML, i risultati sono diversi. Un alias di importazione può
essere usato come espressione nel codice, mentre un prefisso dello spazio dei nomi XML può essere usato solo
nei valori letterali XML o nelle proprietà Axis XML come prefisso per un nome di attributo o di elemento
completo.
Nomi di elementi
Se si specifica element , deve rappresentare un elemento contenitore, ovvero un elemento di programmazione
che può contenere altri elementi. Gli elementi contenitore includono classi, strutture, moduli, interfacce ed
enumerazioni.
L'ambito degli elementi resi disponibili da un' Imports istruzione varia a seconda che si specifichi element . Se
si specificano solo namespace , tutti i membri denominati in modo univoco dello spazio dei nomi e i membri
degli elementi contenitore all'interno di tale spazio dei nomi sono disponibili senza qualificazione. Se si
specificano sia che namespace element , solo i membri di tale elemento saranno disponibili senza qualifica.

Esempio
Nell'esempio seguente vengono restituite tutte le cartelle nella directory C: \ utilizzando la DirectoryInfo classe:
Il codice non contiene Imports istruzioni all'inizio del file. Pertanto, i DirectoryInfo StringBuilder riferimenti, e
CrLf sono tutti completi con gli spazi dei nomi.

Public Function GetFolders() As String


' Create a new StringBuilder, which is used
' to efficiently build strings.
Dim sb As New System.Text.StringBuilder

Dim dInfo As New System.IO.DirectoryInfo("c:\")

' Obtain an array of directories, and iterate through


' the array.
For Each dir As System.IO.DirectoryInfo In dInfo.GetDirectories()
sb.Append(dir.Name)
sb.Append(Microsoft.VisualBasic.ControlChars.CrLf)
Next

Return sb.ToString
End Function
Esempio
Nell'esempio seguente vengono incluse Imports le istruzioni per gli spazi dei nomi a cui si fa riferimento.
Pertanto, non è necessario che i tipi siano completi con gli spazi dei nomi.

' Place Imports statements at the top of your program.


Imports System.Text
Imports System.IO
Imports Microsoft.VisualBasic.ControlChars

Public Function GetFolders() As String


Dim sb As New StringBuilder

Dim dInfo As New DirectoryInfo("c:\")


For Each dir As DirectoryInfo In dInfo.GetDirectories()
sb.Append(dir.Name)
sb.Append(CrLf)
Next

Return sb.ToString
End Function

Esempio
Nell'esempio seguente sono incluse Imports istruzioni che consentono di creare alias per gli spazi dei nomi a
cui si fa riferimento. I tipi sono qualificati con gli alias.

Imports systxt = System.Text


Imports sysio = System.IO
Imports ch = Microsoft.VisualBasic.ControlChars

Public Function GetFolders() As String


Dim sb As New systxt.StringBuilder

Dim dInfo As New sysio.DirectoryInfo("c:\")


For Each dir As sysio.DirectoryInfo In dInfo.GetDirectories()
sb.Append(dir.Name)
sb.Append(ch.CrLf)
Next

Return sb.ToString
End Function

Esempio
Nell'esempio seguente sono incluse Imports istruzioni per la creazione di alias per i tipi a cui si fa riferimento.
Gli alias vengono utilizzati per specificare i tipi.

Imports strbld = System.Text.StringBuilder


Imports dirinf = System.IO.DirectoryInfo
Public Function GetFolders() As String
Dim sb As New strbld

Dim dInfo As New dirinf("c:\")


For Each dir As dirinf In dInfo.GetDirectories()
sb.Append(dir.Name)
sb.Append(ControlChars.CrLf)
Next

Return sb.ToString
End Function

Vedi anche
Istruzione Namespace
Spazi dei nomi in Visual Basic
Riferimenti e istruzione Imports
Istruzione Imports (spazio dei nomi XML)
References to Declared Elements
Istruzione Imports (spazio dei nomi XML)
05/03/2021 • 7 minutes to read • Edit Online

Importa i prefissi degli spazi dei nomi XML da utilizzare nei valori letterali XML e nelle proprietà Axis XML.

Sintassi
Imports <xmlns:xmlNamespacePrefix = "xmlNamespaceName">

Parti
xmlNamespacePrefix
facoltativo. Stringa a cui possono fare riferimento gli elementi e gli attributi XML xmlNamespaceName . Se non
xmlNamespacePrefix viene specificato alcun oggetto, lo spazio dei nomi XML importato sarà lo spazio dei nomi
XML predefinito. Deve essere un identificatore XML valido. Per ulteriori informazioni, vedere nomi di elementi e
attributi XML dichiarati.
xmlNamespaceName
Obbligatorio. Stringa che identifica lo spazio dei nomi XML importato.

Commenti
È possibile utilizzare l' Imports istruzione per definire gli spazi dei nomi XML globali che è possibile utilizzare
con i valori letterali XML e le proprietà Axis XML o come parametri passati all' GetXmlNamespace operatore. Per
informazioni sull'uso dell' Imports istruzione per importare un alias che può essere usato in presenza di nomi
di tipo nel codice, vedere istruzione Imports (tipo e spazio dei nomi .NET). La sintassi per la dichiarazione di uno
spazio dei nomi XML tramite l' Imports istruzione è identica a quella utilizzata in XML. Pertanto, è possibile
copiare una dichiarazione dello spazio dei nomi da un file XML e utilizzarla in un' Imports istruzione.
I prefissi degli spazi dei nomi XML sono utili quando si desidera creare ripetutamente elementi XML che
appartengono allo stesso spazio dei nomi. Il prefisso dello spazio dei nomi XML dichiarato con l' Imports
istruzione è globale nel senso che è disponibile per tutto il codice del file. È possibile usarlo quando si creano
valori letterali dell'elemento XML e quando si accede alle proprietà Axis XML. Per altre informazioni, vedere
valore letterale elemento XML e Proprietà Axis XML.
Se si definisce uno spazio dei nomi XML globale senza un prefisso dello spazio dei nomi (ad esempio,), lo spazio
dei nomi Imports <xmlns="http://SomeNameSpace>" viene considerato lo spazio dei nomi XML predefinito. Lo
spazio dei nomi XML predefinito viene utilizzato per qualsiasi valore letterale elemento XML o proprietà asse
degli attributi XML che non specificano in modo esplicito uno spazio dei nomi. Lo spazio dei nomi predefinito
viene utilizzato anche se lo spazio dei nomi specificato è lo spazio dei nomi vuoto (ovvero xmlns="" ). Lo spazio
dei nomi XML predefinito non si applica agli attributi XML nei valori letterali XML o alle proprietà axis
dell'attributo XML che non dispongono di uno spazio dei nomi.
Gli spazi dei nomi XML definiti in un valore letterale XML, denominati spazi dei nomi XML locali, hanno la
precedenza sugli spazi dei nomi XML definiti dall' Imports istruzione come globali. Gli spazi dei nomi XML
definiti dall' Imports istruzione hanno la precedenza sugli spazi dei nomi XML importati per un progetto Visual
Basic. Se un valore letterale XML definisce uno spazio dei nomi XML, tale spazio dei nomi locale non si applica
alle espressioni incorporate.
Gli spazi dei nomi XML globali seguono le stesse regole di definizione e definizione dell'ambito di .NET
Framework spazi dei nomi. Di conseguenza, è possibile includere un' Imports istruzione per definire uno spazio
dei nomi XML globale ovunque sia possibile importare uno spazio dei nomi .NET Framework. Sono inclusi i file
di codice e gli spazi dei nomi importati a livello di progetto. Per informazioni sugli spazi dei nomi importati a
livello di progetto, vedere pagina riferimenti, Progettazione progetti (Visual Basic).
Ogni file di origine può contenere un numero qualsiasi di Imports istruzioni. Devono seguire le dichiarazioni di
opzioni, ad esempio l' Option Strict istruzione, e devono precedere le dichiarazioni degli elementi di
programmazione, ad esempio le Module Class istruzioni o.

Esempio
Nell'esempio seguente viene importato uno spazio dei nomi XML predefinito e uno spazio dei nomi XML
identificato con il prefisso ns . Viene quindi creato un valore letterale XML che utilizza entrambi gli spazi dei
nomi.

' Place Imports statements at the top of your program.


Imports <xmlns="http://DefaultNamespace">
Imports <xmlns:ns="http://NewNamespace">

Module Module1

Sub Main()
' Create element by using the default global XML namespace.
Dim inner = <innerElement/>

' Create element by using both the default global XML namespace
' and the namespace identified with the "ns" prefix.
Dim outer = <ns:outer>
<ns:innerElement></ns:innerElement>
<siblingElement></siblingElement>
<%= inner %>
</ns:outer>

' Display element to see its final form.


Console.WriteLine(outer)
End Sub

End Module

Questo codice visualizza il testo seguente:

<ns:outer xmlns="http://DefaultNamespace"
xmlns:ns="http://NewNamespace">
<ns:innerElement></ns:innerElement>
<siblingElement></siblingElement>
<innerElement />
</ns:outer>

Esempio
Nell'esempio seguente viene importato il prefisso dello spazio dei nomi XML ns . Viene quindi creato un valore
letterale XML che utilizza il prefisso dello spazio dei nomi e viene visualizzato il formato finale dell'elemento.
' Place Imports statements at the top of your program.
Imports <xmlns:ns="http://SomeNamespace">

Class TestClass1

Shared Sub TestPrefix()


' Create test using a global XML namespace prefix.
Dim inner2 = <ns:inner2/>

Dim test =
<ns:outer>
<ns:middle xmlns:ns="http://NewNamespace">
<ns:inner1/>
<%= inner2 %>
</ns:middle>
</ns:outer>

' Display test to see its final form.


Console.WriteLine(test)
End Sub

End Class

Questo codice visualizza il testo seguente:

<ns:outer xmlns:ns="http://SomeNamespace">
<ns:middle xmlns:ns="http://NewNamespace">
<ns:inner1 />
<inner2 xmlns="http://SomeNamespace" />
</ns:middle>
</ns:outer>

Si noti che il compilatore ha convertito il prefisso dello spazio dei nomi XML da un prefisso globale a una
definizione di prefisso locale.

Esempio
Nell'esempio seguente viene importato il prefisso dello spazio dei nomi XML ns . Il prefisso dello spazio dei
nomi viene quindi usato per creare un valore letterale XML e accedere al primo nodo figlio con il nome
completo ns:name .

Imports <xmlns:ns = "http://SomeNamespace">

Class TestClass4

Shared Sub TestPrefix()


Dim contact = <ns:contact>
<ns:name>Patrick Hines</ns:name>
</ns:contact>
Console.WriteLine(contact.<ns:name>.Value)
End Sub

End Class

Questo codice visualizza il testo seguente:


Patrick Hines

Vedi anche
Valore letterale di elemento XML
Proprietà Axis XML
Nomi di elementi e attributi XML dichiarati
Operatore GetXmlNamespace
Inherits Statement
05/03/2021 • 4 minutes to read • Edit Online

Fa in modo che la classe o l'interfaccia corrente erediti gli attributi, le variabili, le proprietà, le procedure e gli
eventi da un'altra classe o set di interfacce.

Sintassi
Inherits basetypenames

Parti
T ERM IN E DEF IN IZ IO N E

basetypenames Obbligatorio. Nome della classe da cui deriva questa classe.

-oppure-

Nomi delle interfacce da cui deriva questa interfaccia.


Utilizzare le virgole per separare più nomi.

Commenti
Se utilizzata, l' Inherits istruzione deve essere la prima riga non vuota non di commento in una definizione di
classe o di interfaccia. Deve seguire immediatamente l' Class istruzione o Interface .
È possibile utilizzare Inherits solo in una classe o in un'interfaccia. Ciò significa che il contesto di dichiarazione
per un'ereditarietà non può essere un file di origine, uno spazio dei nomi, una struttura, un modulo, una
procedura o un blocco.

Regole
Ereditarietà della classe. Se una classe utilizza l' Inherits istruzione, è possibile specificare una sola
classe di base.
Una classe non può ereditare da una classe annidata al suo interno.
Ereditarietà dell'interfaccia. Se un'interfaccia usa l' Inherits istruzione, è possibile specificare una o
più interfacce di base. È possibile ereditare da due interfacce anche se ognuna definisce un membro con
lo stesso nome. In tal caso, il codice di implementazione deve usare la qualificazione del nome per
specificare il membro che sta implementando.
Un'interfaccia non può ereditare da un'altra interfaccia con un livello di accesso più restrittivo.
Un'interfaccia, ad esempio, Public non può ereditare da un' Friend interfaccia.
Un'interfaccia non può ereditare da un'interfaccia annidata al suo interno.
Un esempio di ereditarietà della classe nel .NET Framework è la ArgumentException classe, che eredita dalla
SystemException classe. In questo modo vengono fornite ArgumentException tutte le proprietà e le procedure
predefinite richieste dalle eccezioni di sistema, ad esempio la Message proprietà e il ToString metodo.
Un esempio di ereditarietà dell'interfaccia nel .NET Framework è l' ICollection interfaccia, che eredita dall'
IEnumerable interfaccia. Questo fa ICollection in modo che erediti la definizione dell'enumeratore necessario per
attraversare una raccolta.

Esempio
Nell'esempio seguente viene utilizzata l' Inherits istruzione per mostrare in che modo una classe denominata
thisClass può ereditare tutti i membri di una classe di base denominata anotherClass .

Public Class thisClass


Inherits anotherClass
' Add code to override, overload, or extend members
' inherited from the base class.
' Add new variable, property, procedure, and event declarations.
End Class

Esempio
Nell'esempio seguente viene illustrata l'ereditarietà di più interfacce.

Public Interface thisInterface


Inherits IComparable, IDisposable, IFormattable
' Add new property, procedure, and event definitions.
End Interface

L'interfaccia denominata thisInterface include ora tutte le definizioni nelle IComparable interfacce, IDisposable
e, che IFormattable i membri ereditati forniscono rispettivamente per il confronto specifico del tipo di due
oggetti, il rilascio delle risorse allocate e l'espressione del valore di un oggetto come String . Una classe che
implementa thisInterface deve implementare tutti i membri di ogni interfaccia di base.

Vedi anche
MustInherit
NotInheritable
Oggetti e classi
Nozioni fondamentali sull'ereditarietà
Interfacce
Istruzione Interface (Visual Basic)
05/03/2021 • 11 minutes to read • Edit Online

Dichiara il nome di un'interfaccia e introduce le definizioni dei membri inclusi nell'interfaccia.

Sintassi
[ <attributelist> ] [ accessmodifier ] [ Shadows ] _
Interface name [ ( Of typelist ) ]
[ Inherits interfacenames ]
[ [ modifiers ] Property membername ]
[ [ modifiers ] Function membername ]
[ [ modifiers ] Sub membername ]
[ [ modifiers ] Event membername ]
[ [ modifiers ] Interface membername ]
[ [ modifiers ] Class membername ]
[ [ modifiers ] Structure membername ]
End Interface

Parti
T ERM IN E DEF IN IZ IO N E

attributelist facoltativo. Vedere elenco attributi.

accessmodifier facoltativo. Può essere uno dei seguenti:

- Pubblico
- Protetto
- Amico
- Privata
- Amico protetto
- Privato protetto

Vedere livelli di accesso in Visual Basic.

Shadows facoltativo. Vedere Shadows.

name Obbligatorio. Nome di questa interfaccia. Vedere Declared


Element Names.

Of facoltativo. Specifica che si tratta di un'interfaccia generica.

typelist Obbligatorio se si usa la parola chiave of . Elenco di


parametri di tipo per questa interfaccia. Facoltativamente,
ogni parametro di tipo può essere dichiarato Variant usando
In i Out modificatori generici e. Vedere elenco dei tipi.

Inherits facoltativo. Indica che questa interfaccia eredita gli attributi e


i membri di un'altra interfaccia o di altre interfacce. Vedere
istruzione Inherits.
T ERM IN E DEF IN IZ IO N E

interfacenames Obbligatorio se si usa l' Inherits istruzione. Nomi delle


interfacce da cui deriva questa interfaccia.

modifiers facoltativo. Modificatori appropriati per il membro di


interfaccia definito.

Property facoltativo. Definisce una proprietà che è un membro


dell'interfaccia.

Function facoltativo. Definisce una Function routine che è un


membro dell'interfaccia.

Sub facoltativo. Definisce una Sub routine che è un membro


dell'interfaccia.

Event facoltativo. Definisce un evento che è un membro


dell'interfaccia.

Interface facoltativo. Definisce un'interfaccia annidata all'interno di


questa interfaccia. La definizione dell'interfaccia annidata
deve terminare con un' End Interface istruzione.

Class facoltativo. Definisce una classe che è un membro


dell'interfaccia. La definizione della classe membro deve
terminare con un' End Class istruzione.

Structure facoltativo. Definisce una struttura che è un membro


dell'interfaccia. La definizione della struttura del membro
deve terminare con un' End Structure istruzione.

membername Obbligatorio per ogni proprietà, routine, evento, interfaccia,


classe o struttura definita come membro dell'interfaccia.
Nome del membro.

End Interface Termina la Interface definizione.

Commenti
Un' interfaccia definisce un set di membri, ad esempio proprietà e procedure, che possono essere implementate
da classi e strutture. L'interfaccia definisce solo le firme dei membri e non i rispettivi meccanismi interni.
Una classe o una struttura implementa l'interfaccia fornendo il codice per ogni membro definito dall'interfaccia.
Infine, quando l'applicazione crea un'istanza da tale classe o struttura, un oggetto esiste e viene eseguito in
memoria. Per ulteriori informazioni, vedere oggetti e classi e interfacce.
È possibile usare Interface solo a livello di spazio dei nomi o di modulo. Ciò significa che il contesto di
dichiarazione per un'interfaccia deve essere un file di origine, uno spazio dei nomi, una classe, una struttura, un
modulo o un'interfaccia e non può essere una routine o un blocco. Per altre informazioni, vedere Contesti delle
dichiarazioni e livelli di accesso predefiniti.
Per impostazione predefinita, le interfacce sono accessi Friend . È possibile modificare i livelli di accesso con i
modificatori di accesso. Per altre informazioni, vedere livelli di accesso in Visual Basic.
Regole
Annidamento di interfacce. È possibile definire un'interfaccia in un'altra. L'interfaccia esterna viene
chiamata interfaccia contenitore e l'interfaccia interna è chiamata interfaccia nidificata.
Dichiarazione del membro. Quando si dichiara una proprietà o una routine come membro di
un'interfaccia, si definisce solo la firma della proprietà o della routine. Sono inclusi il tipo di elemento
(proprietà o routine), i parametri e i tipi di parametro e il tipo restituito. Per questo motivo, nella
definizione del membro viene utilizzata solo una riga di codice e le istruzioni che terminano, ad esempio
End Function o, End Property non sono valide in un'interfaccia.

Al contrario, quando si definisce un'enumerazione o una struttura o una classe o un'interfaccia annidata, è
necessario includere i relativi membri dati.
Modificatori di membro. Non è possibile usare alcun modificatore di accesso quando si definiscono i
membri del modulo, né è possibile specificare un modificatore di routine condiviso o qualsiasi, ad
eccezione degli Overload. È possibile dichiarare qualsiasi membro con Shadowsed è possibile utilizzare
default quando si definisce una proprietà, nonché ReadOnly o WriteOnly.
Ereditarietà. Se l'interfaccia utilizza l' istruzione Inherits, è possibile specificare una o più interfacce di
base. È possibile ereditare da due interfacce anche se ognuna definisce un membro con lo stesso nome.
In tal caso, il codice di implementazione deve usare la qualificazione del nome per specificare il membro
che sta implementando.
Un'interfaccia non può ereditare da un'altra interfaccia con un livello di accesso più restrittivo.
Un'interfaccia, ad esempio, Public non può ereditare da un' Friend interfaccia.
Un'interfaccia non può ereditare da un'interfaccia annidata al suo interno.
Implementazione. Quando una classe utilizza l'istruzione Implements per implementare questa
interfaccia, deve implementare tutti i membri definiti all'interno dell'interfaccia. Inoltre, ogni firma nel
codice di implementazione deve corrispondere esattamente alla firma corrispondente definita in questa
interfaccia. Tuttavia, il nome del membro nel codice di implementazione non deve corrispondere al nome
del membro come definito nell'interfaccia.
Quando una classe implementa una routine, non può designare la procedura come Shared .
Proprietà predefinita. Un'interfaccia può specificare al massimo una proprietà come proprietà
predefinita, a cui è possibile fare riferimento senza utilizzare il nome della proprietà. Per specificare tale
proprietà, è necessario dichiararla con il modificatore predefinito .
Si noti che questo significa che un'interfaccia può definire una proprietà predefinita solo se eredita
nessuno.

Comportamento
Livello di accesso. Tutti i membri dell'interfaccia hanno in modo implicito l'accesso pubblico . Non è
possibile usare alcun modificatore di accesso per la definizione di un membro. Tuttavia, una classe che
implementa l'interfaccia può dichiarare un livello di accesso per ogni membro implementato.
Se si assegna un'istanza di classe a una variabile, il livello di accesso dei relativi membri può dipendere
dal fatto che il tipo di dati della variabile sia l'interfaccia sottostante o la classe di implementazione.
Questa condizione è illustrata nell'esempio seguente.
Public Interface IDemo
Sub DoSomething()
End Interface
Public Class implementIDemo
Implements IDemo
Private Sub DoSomething() Implements IDemo.DoSomething
End Sub
End Class
Dim varAsInterface As IDemo = New implementIDemo()
Dim varAsClass As implementIDemo = New implementIDemo()

Se si accede ai membri della classe tramite varAsInterface , tutti hanno accesso pubblico. Tuttavia, se si
accede ai membri tramite varAsClass , la Sub procedura doSomething ha accesso privato.
Ambito. Un'interfaccia è nell'ambito di tutti i relativi spazi dei nomi, classe, struttura o modulo.
L'ambito di ogni membro di interfaccia è l'intera interfaccia.
Vita. Un'interfaccia non ha una durata, né i relativi membri. Quando una classe implementa un'interfaccia
e un oggetto viene creato come un'istanza di tale classe, l'oggetto ha una durata all'interno
dell'applicazione in cui è in esecuzione. Per ulteriori informazioni, vedere "Lifetime" nell' istruzione Class.

Esempio
Nell'esempio seguente viene utilizzata l' Interface istruzione per definire un'interfaccia denominata
thisInterface , che deve essere implementata con un' Property istruzione e un' Function istruzione.

Public Interface thisInterface


Property ThisProp(ByVal thisStr As String) As Char
Function ThisFunc(ByVal thisInt As Integer) As Integer
End Interface

Si noti che Propertyle Function istruzioni e non introducono blocchi che terminano con End Property e
End Function all'interno dell'interfaccia. L'interfaccia definisce solo le firme dei relativi membri. I Property
blocchi completi e Function vengono visualizzati in una classe che implementa thisInterface .

Vedi anche
Interfacce
Istruzione Class
Istruzione Module
Istruzione Structure
Property Statement
Istruzione Function
Istruzione Sub
Generic Types in Visual Basic
Varianza nelle interfacce generiche
In
Out
Istruzione Mid
05/03/2021 • 2 minutes to read • Edit Online

Sostituisce un numero specificato di caratteri in una String variabile con caratteri di un'altra stringa.

Sintassi
Mid( _
ByRef Target As String, _
ByVal Start As Integer, _
Optional ByVal Length As Integer _
) = StringExpression

Parti
Target
Obbligatorio. Nome della String variabile da modificare.
Start
Obbligatorio. Espressione Integer . Posizione del carattere in in Target cui inizia la sostituzione del testo.
Start Usa un indice in base uno.

Length
facoltativo. Espressione Integer . Numero di caratteri da sostituire. Se omesso, String viene utilizzato tutto.
StringExpression
Obbligatorio. String espressione che sostituisce parte di Target .

Eccezioni
T IP O DI EC C EZ IO N E C O N DIZ IO N E

ArgumentException Start <= 0 o Length < 0.

Commenti
Il numero di caratteri sostituiti è sempre minore o uguale al numero di caratteri in Target .
Visual Basic dispone di una Mid funzione e di un' Mid istruzione. Questi elementi operano entrambi su un
numero specificato di caratteri in una stringa, ma la Mid funzione restituisce i caratteri mentre l' Mid istruzione
sostituisce i caratteri. Per altre informazioni, vedere Mid.

NOTE
L' MidB istruzione di versioni precedenti di Visual Basic sostituisce una sottostringa in byte, anziché caratteri. Viene
utilizzato principalmente per la conversione di stringhe in applicazioni DBCS (Double-byte character set). Tutte le stringhe
di Visual Basic sono in formato Unicode e MidB non sono più supportate.
Esempio
In questo esempio viene utilizzata l' Mid istruzione per sostituire un numero specificato di caratteri in una
variabile di stringa con caratteri di un'altra stringa.

Dim testString As String


' Initializes string.
testString = "The dog jumps"
' Returns "The fox jumps".
Mid(testString, 5, 3) = "fox"
' Returns "The cow jumps".
Mid(testString, 5) = "cow"
' Returns "The cow jumpe".
Mid(testString, 5) = "cow jumped over"
' Returns "The duc jumpe".
Mid(testString, 5, 3) = "duck"

Requisiti
Spazio dei nomi: Microsoft. VisualBasic
Modulo: Strings

Assembly: Libreria di runtime Visual Basic (in Microsoft.VisualBasic.dll)

Vedi anche
Mid
Stringhe
Introduzione alle stringhe in Visual Basic
Istruzione Module
05/03/2021 • 6 minutes to read • Edit Online

Dichiara il nome di un modulo e introduce la definizione di variabili, proprietà, eventi e procedure inclusi nel
modulo.

Sintassi
[ <attributelist> ] [ accessmodifier ] Module name
[ statements ]
End Module

Parti
attributelist
facoltativo. Vedere elenco attributi.
accessmodifier
facoltativo. Può essere uno dei seguenti:
Pubblica
Friend
Vedere livelli di accesso in Visual Basic.
name
Obbligatorio. Nome del modulo. Vedere Declared Element Names.
statements
facoltativo. Istruzioni che definiscono le variabili, le proprietà, gli eventi, le procedure e i tipi annidati di questo
modulo.
End Module
Termina la Module definizione.

Commenti
Un' Module istruzione definisce un tipo di riferimento disponibile in tutto il relativo spazio dei nomi. Un modulo
(talvolta denominato modulo standard) è simile a una classe ma con alcune importanti differenze. Ogni modulo
dispone esattamente di un'istanza e non è necessario crearlo o assegnarlo a una variabile. I moduli non
supportano l'ereditarietà né implementano le interfacce. Si noti che un modulo non è un tipo nel senso che una
classe o una struttura è: non è possibile dichiarare un elemento di programmazione per avere il tipo di dati di un
modulo.
È possibile usare Module solo a livello di spazio dei nomi. Ciò significa che il contesto di dichiarazione per un
modulo deve essere un file di origine o uno spazio dei nomi e non può essere una classe, una struttura, un
modulo, un'interfaccia, una routine o un blocco. Non è possibile annidare un modulo all'interno di un altro
modulo o all'interno di qualsiasi tipo. Per altre informazioni, vedere Contesti delle dichiarazioni e livelli di
accesso predefiniti.
Un modulo ha la stessa durata del programma. Poiché i relativi membri sono tutti Shared , hanno anche durate
uguali a quelle del programma.
Per impostazione predefinita, i moduli sono con accesso Friend . È possibile modificare i livelli di accesso con i
modificatori di accesso. Per altre informazioni, vedere livelli di accesso in Visual Basic.
Tutti i membri di un modulo sono implicitamente Shared .

Classi e moduli
Questi elementi presentano molte analogie, ma esistono anche alcune differenze importanti.
Terminologia. Le versioni precedenti di Visual Basic riconoscono due tipi di moduli: moduli di classe (file
con estensione CLS) e moduli standard (file con estensione BAS). La versione corrente chiama queste
classi e moduli, rispettivamente.
Membri condivisi. È possibile controllare se un membro di una classe è un membro condiviso o di
istanza.
Orientamento dell'oggetto. Le classi sono orientate agli oggetti, ma i moduli non lo sono. È quindi
possibile creare un'istanza di solo classi come oggetti. Per altre informazioni, vedere oggetti e classi.

Regole
Modificatori. Tutti i membri del modulo sono condivisiin modo implicito. Non è possibile usare la
Shared parola chiave quando si dichiara un membro e non è possibile modificare lo stato condiviso di
un membro.
Ereditarietà. Un modulo non può ereditare da un tipo diverso Object da, da cui tutti i moduli ereditano.
In particolare, un modulo non può ereditare da un altro modulo.
Non è possibile usare l' istruzione Inherits in una definizione di modulo, anche per specificare Object .
Proprietà predefinita. Non è possibile definire proprietà predefinite in un modulo. Per ulteriori
informazioni, vedere default.

Comportamento
Livello di accesso. All'interno di un modulo, è possibile dichiarare ogni membro con il proprio livello di
accesso. Per impostazione predefinita, i membri del modulo hanno accesso pubblico , ad eccezione delle
variabili e delle costanti, per impostazione predefinita l'accesso privato . Quando un modulo dispone di
un accesso più limitato di uno dei relativi membri, il livello di accesso del modulo specificato ha la
precedenza.
Ambito. Un modulo è nell'ambito dello spazio dei nomi.
L'ambito di ogni membro del modulo è l'intero modulo. Si noti che tutti i membri subiscono l'
innalzamento di livello del tipo, che ne determina l'innalzamento di livello allo spazio dei nomi
contenente il modulo. Per ulteriori informazioni, vedere promozione del tipo.
Qualificazione. È possibile avere più moduli in un progetto ed è possibile dichiarare membri con lo
stesso nome in due o più moduli. Tuttavia, è necessario qualificare qualsiasi riferimento a tale membro
con il nome del modulo appropriato se il riferimento è esterno al modulo. Per altre informazioni, vedere
References to Declared Elements.

Esempio
Public Module thisModule
Sub Main()
Dim userName As String = InputBox("What is your name?")
MsgBox("User name is " & userName)
End Sub
' Insert variable, property, procedure, and event declarations.
End Module

Vedere anche
Istruzione Class
Istruzione Namespace
Istruzione Structure
Istruzione Interface
Property Statement
Promozione tipo
Istruzione Namespace
05/03/2021 • 9 minutes to read • Edit Online

Dichiara il nome di uno spazio dei nomi e fa in modo che il codice sorgente che segue la dichiarazione venga
compilato in tale spazio dei nomi.

Sintassi
Namespace [Global.] { name | name.name }
[ componenttypes ]
End Namespace

Parti
Globale
facoltativo. Consente di definire uno spazio dei nomi all'esterno dello spazio dei nomi radice del progetto.
Vedere spazi dei nomi in Visual Basic.
name
Obbligatorio. Nome univoco che identifica lo spazio dei nomi. Deve essere un identificatore di Visual Basic
valido. Per ulteriori informazioni, vedere nomi di elementi dichiarati.
componenttypes
facoltativo. Elementi che costituiscono lo spazio dei nomi. Sono inclusi, tra gli altri, le enumerazioni, le strutture,
le interfacce, le classi, i moduli, i delegati e altri spazi dei nomi.
End Namespace
Termina un Namespace blocco.

Commenti
Gli spazi dei nomi vengono usati come sistema organizzativo. Forniscono un modo per classificare e presentare
gli elementi di programmazione esposti ad altri programmi e applicazioni. Si noti che uno spazio dei nomi non è
un tipo nel senso che una classe o una struttura è: non è possibile dichiarare un elemento di programmazione
per avere il tipo di dati di uno spazio dei nomi.
Tutti gli elementi di programmazione dichiarati dopo un' Namespace istruzione appartengono a tale spazio dei
nomi. Visual Basic continua a compilare elementi nell'ultimo spazio dei nomi dichiarato fino a quando non rileva
un' End Namespace istruzione o un'altra Namespace istruzione.
Se uno spazio dei nomi è già definito, anche all'esterno del progetto, è possibile aggiungervi elementi di
programmazione. A tale scopo, è possibile utilizzare un' Namespace istruzione per indirizzare Visual Basic
compilare elementi nello spazio dei nomi.
È possibile utilizzare un' Namespace istruzione solo a livello di file o di spazio dei nomi. Ciò significa che il
contesto di dichiarazione per uno spazio dei nomi deve essere un file di origine o un altro spazio dei nomi e non
può essere una classe, una struttura, un modulo, un'interfaccia o una routine. Per altre informazioni, vedere
Contesti delle dichiarazioni e livelli di accesso predefiniti.
È possibile dichiarare uno spazio dei nomi all'interno di un altro. Non esiste un limite limitato ai livelli di
annidamento che è possibile dichiarare, ma tenere presente che quando altro codice accede agli elementi
dichiarati nello spazio dei nomi più interno, deve usare una stringa di qualificazione contenente tutti i nomi degli
spazi dei nomi nella gerarchia di nidificazione.

Livello di accesso
Gli spazi dei nomi vengono considerati come se avessero un Public livello di accesso. È possibile accedere a
uno spazio dei nomi dal codice in qualsiasi punto dello stesso progetto, da altri progetti che fanno riferimento al
progetto e da qualsiasi assembly compilato dal progetto.
Gli elementi di programmazione dichiarati a livello di spazio dei nomi, ovvero in uno spazio dei nomi, ma non
all'interno di altri elementi, possono avere Public o Friend accedere Se non è specificato, il livello di accesso
di tale elemento usa Friend per impostazione predefinita. Gli elementi che è possibile dichiarare a livello di
spazio dei nomi includono classi, strutture, moduli, interfacce, enumerazioni e delegati. Per altre informazioni,
vedere Contesti delle dichiarazioni e livelli di accesso predefiniti.

Spazio dei nomi radice


Tutti i nomi degli spazi dei nomi nel progetto sono basati su uno spazio dei nomi radice. Visual Studio assegna il
nome del progetto come spazio dei nomi radice predefinito per tutto il codice del progetto. Se, ad esempio, il
progetto è denominato Payroll , i relativi elementi di programmazione appartengono allo spazio dei nomi
Payroll . Se si dichiara Namespace funding , il nome completo dello spazio dei nomi è Payroll.funding .

Se si desidera specificare uno spazio dei nomi esistente in un' Namespace istruzione, ad esempio nell'esempio
della classe di elenco generico, è possibile impostare lo spazio dei nomi radice su un valore null. A tale scopo,
fare clic su Proprietà progetto dal menu progetto , quindi deselezionare la voce spazio dei nomi radice in
modo che la casella sia vuota. Se questa operazione non è stata eseguita nell'esempio di classe di elenco
generico, il compilatore Visual Basic accetta System.Collections.Generic come nuovo spazio dei nomi all'interno
del progetto Payroll , con il nome completo di Payroll.System.Collections.Generic .
In alternativa, è possibile usare la Global parola chiave per fare riferimento a elementi di spazi dei nomi definiti
all'esterno del progetto. Questa operazione consente di mantenere il nome del progetto come spazio dei nomi
radice. In questo modo si riduce la possibilità di unire involontariamente gli elementi di programmazione
insieme a quelli degli spazi dei nomi esistenti. Per ulteriori informazioni, vedere la sezione "parola chiave Global
in nomi completi" in spazi dei nomi in Visual Basic.
La Global parola chiave può essere utilizzata anche in un'istruzione dello spazio dei nomi. Ciò consente di
definire uno spazio dei nomi all'esterno dello spazio dei nomi radice del progetto. Per ulteriori informazioni,
vedere la sezione "parola chiave Global nelle istruzioni dello spazio dei nomi" negli spazi dei nomi in Visual
Basic.
Risoluzione dei problemi. Lo spazio dei nomi radice può causare concatenazioni impreviste dei nomi degli
spazi dei nomi. Se si fa riferimento agli spazi dei nomi definiti all'esterno del progetto, il compilatore Visual Basic
può interpretarerli come spazi dei nomi annidati nello spazio dei nomi radice. In tal caso, il compilatore non
riconosce alcun tipo già definito negli spazi dei nomi esterni. Per evitare questo problema, impostare lo spazio
dei nomi radice su un valore null come descritto in "spazio dei nomi radice" oppure utilizzare la Global parola
chiave per accedere agli elementi degli spazi dei nomi esterni.

Attributi e modificatori
Non è possibile applicare attributi a uno spazio dei nomi. Un attributo fornisce informazioni ai metadati
dell'assembly, che non sono significativi per i classificatori di origine, ad esempio gli spazi dei nomi.
In uno spazio dei nomi non è possibile applicare alcun modificatore di accesso o di routine o altri modificatori.
Poiché non è un tipo, questi modificatori non sono significativi.
Esempio
Nell'esempio seguente vengono dichiarati due spazi dei nomi, uno annidato nell'altro.

Namespace n1
Namespace n2
Class a
' Insert class definition.
End Class
End Namespace
End Namespace

Esempio
Nell'esempio seguente vengono dichiarati più spazi dei nomi annidati su una sola riga ed è equivalente
all'esempio precedente.

Namespace n1.n2
Class a
' Insert class definition.
End Class
End Namespace

Esempio
Nell'esempio seguente viene accesso alla classe definita negli esempi precedenti.

Dim instance As New n1.n2.a

Esempio
Nell'esempio seguente viene definita la struttura di una nuova classe di elenco generica che viene aggiunta allo
System.Collections.Generic spazio dei nomi.

Namespace System.Collections.Generic
Class specialSortedList(Of T)
Inherits List(Of T)
' Insert code to define the special generic list class.
End Class
End Namespace

Vedi anche
Istruzione Imports (tipo e spazio dei nomi .NET)
Declared Element Names
Spazi dei nomi in Visual Basic
Istruzione On Error (Visual Basic)
05/03/2021 • 15 minutes to read • Edit Online

Abilita una routine di gestione degli errori e specifica il percorso della routine all'interno di una routine. può
essere usato anche per disabilitare una routine di gestione degli errori. L' On Error istruzione viene utilizzata
nella gestione degli errori non strutturata e può essere utilizzata al posto della gestione strutturata delle
eccezioni. La gestione strutturata delle eccezioni è incorporata in .NET, è in genere più efficiente ed è quindi
consigliabile quando si gestiscono errori di runtime nell'applicazione.
Senza la gestione degli errori o la gestione delle eccezioni, eventuali errori di run-time che si verificano sono
irreversibili: viene visualizzato un messaggio di errore e l'esecuzione viene arrestata.

NOTE
La Error parola chiave viene inoltre utilizzata nell' istruzione Error, supportata per la compatibilità con le versioni
precedenti.

Sintassi
On Error { GoTo [ line | 0 | -1 ] | Resume Next }

Parti
T ERM IN E DEF IN IZ IO N E

GoTo riga di Abilita la routine di gestione degli errori che inizia in


corrispondenza della riga specificata nell'argomento della
riga obbligatorio. L'argomento della riga è qualsiasi etichetta
di riga o numero di riga. Se si verifica un errore in fase di
esecuzione, controllare i rami alla riga specificata, rendendo
attivo il gestore degli errori. La riga specificata deve essere
nella stessa procedura dell' On Error istruzione oppure si
verificherà un errore in fase di compilazione.

GoTo 0 Disabilita il gestore degli errori abilitato nella procedura


corrente e lo reimposta su Nothing .

GoTo -1 Consente di disabilitare l'eccezione abilitata nella procedura


corrente e di reimpostarla su Nothing .

Resume Next Specifica che quando si verifica un errore in fase di


esecuzione, il controllo passa all'istruzione immediatamente
successiva all'istruzione in cui si è verificato l'errore e
l'esecuzione continua da quel punto. Utilizzare questo form
anziché On Error GoTo quando si accede a oggetti.

Commenti
NOTE
Si consiglia di utilizzare la gestione delle eccezioni strutturata nel codice, quando possibile, anziché utilizzare la gestione
delle eccezioni non strutturata e l' On Error istruzione. Per altre informazioni, vedere Istruzione Try...Catch...Finally.

Un gestore degli errori "Enabled" è uno attivato da un' On Error istruzione. Un gestore degli errori "attivo" è un
gestore abilitato che sta gestendo un errore.
Se si verifica un errore durante l'attivazione di un gestore errori (tra l'occorrenza dell'errore e un' Resume
Exit Sub istruzione,, Exit Function o Exit Property ), il gestore degli errori della procedura corrente non è in
grado di gestire l'errore. Il controllo torna alla procedura chiamante.
Se la procedura chiamante dispone di un gestore degli errori abilitato, viene attivata per gestire l'errore. Se
anche il gestore errori della procedura chiamante è attivo, il controllo passa di nuovo attraverso le routine di
chiamata precedenti fino a quando non viene trovato un gestore degli errori abilitato, ma inattivo. Se non viene
trovato alcun gestore di errori di questo tipo, l'errore è irreversibile nel punto in cui si è effettivamente verificato.
Ogni volta che il gestore degli errori passa di nuovo il controllo a una routine chiamante, tale procedura diventa
la routine corrente. Quando un errore viene gestito da un gestore degli errori in qualsiasi routine, l'esecuzione
riprende nella procedura corrente nel punto indicato dall' Resume istruzione.

NOTE
Una routine di gestione degli errori non è una Sub procedura o una Function procedura. Si tratta di una sezione di
codice contrassegnata da un'etichetta di riga o un numero di riga.

Proprietà Number
Le routine di gestione degli errori si basano sul valore della Number proprietà dell' Err oggetto per
determinare la cause dell'errore. La routine deve verificare o salvare i valori delle proprietà rilevanti nell' Err
oggetto prima che venga generato un altro errore o prima che venga chiamata una procedura che può causare
un errore. I valori delle proprietà nell' Err oggetto riflettono solo l'errore più recente. Il messaggio di errore
associato a Err.Number è contenuto in Err.Description .

Istruzione Throw
Un errore generato con il Err.Raise metodo imposta la Exception proprietà su un'istanza appena creata della
Exception classe. Per supportare la generazione di eccezioni di tipi di eccezioni derivate, Throw nel linguaggio è
supportata un'istruzione. Questo accetta un solo parametro che rappresenta l'istanza di eccezione da generare.
Nell'esempio seguente viene illustrato il modo in cui queste funzionalità possono essere utilizzate con il
supporto per la gestione delle eccezioni esistente:

On Error GoTo Handler


Throw New DivideByZeroException()
Handler:
If (TypeOf Err.GetException() Is DivideByZeroException) Then
' Code for handling the error is entered here.
End If

Si noti che l' On Error GoTo istruzione intrappola tutti gli errori, indipendentemente dalla classe Exception.

In seguito alla ripresa dell'errore


On Error Resume Next fa in modo che l'esecuzione continui con l'istruzione che segue l'istruzione che ha causato
l'errore di run-time o con l'istruzione immediatamente successiva alla chiamata più recente della routine che
contiene l' On Error Resume Next istruzione. Questa istruzione consente di continuare l'esecuzione nonostante
un errore di run-time. È possibile inserire la routine di gestione degli errori in cui si verifica l'errore anziché
trasferire il controllo a un'altra posizione all'interno della procedura. Un' On Error Resume Next istruzione
diventa inattiva quando viene chiamata un'altra procedura, quindi è consigliabile eseguire un'
On Error Resume Next istruzione in ogni routine chiamata se si desidera la gestione degli errori inline all'interno
di tale routine.

NOTE
Il On Error Resume Next costrutto può essere preferibile a On Error GoTo quando si gestiscono gli errori generati
durante l'accesso ad altri oggetti. Err Il controllo dopo ogni interazione con un oggetto comporta la rimozione
dell'ambiguità sull'oggetto a cui il codice ha eseguito l'accesso. È possibile essere certi dell'oggetto in cui è stato inserito il
codice di errore, nonché dell' Err.Number oggetto che ha generato in origine l'errore (l'oggetto specificato in
Err.Source ).

In errore GoTo 0
On Error GoTo 0 Disabilita la gestione degli errori nella procedura corrente. Non viene specificata la riga 0 come
inizio del codice di gestione degli errori, anche se la procedura contiene una riga con numero 0. Senza un'
On Error GoTo 0 istruzione, un gestore degli errori viene disabilitato automaticamente quando si esce da una
routine.

In errore GoTo-1
On Error GoTo -1 Disabilita l'eccezione nella routine corrente. Non specifica la riga 1 come inizio del codice di
gestione degli errori, anche se la procedura contiene una riga numerata-1. Senza un' On Error GoTo -1
istruzione, un'eccezione viene disabilitata automaticamente quando si esce da una routine.
Per impedire l'esecuzione di codice di gestione degli errori quando non si è verificato alcun errore, inserire un'
Exit Sub Exit Function istruzione, o Exit Property immediatamente prima della routine di gestione degli
errori, come nel frammento seguente:

Public Sub InitializeMatrix(ByVal Var1 As Object, ByVal Var2 As Object)


On Error GoTo ErrorHandler
' Insert code that might generate an error here
Exit Sub
ErrorHandler:
' Insert code to handle the error here
Resume Next
End Sub

In questo caso, il codice di gestione degli errori segue l' Exit Sub istruzione e precede l' End Sub istruzione per
separarla dal flusso di procedura. È possibile inserire il codice di gestione degli errori in qualsiasi punto di una
procedura.

Errori non intercettati


Gli errori non intercettati negli oggetti vengono restituiti all'applicazione di controllo quando l'oggetto è in
esecuzione come file eseguibile. All'interno dell'ambiente di sviluppo, gli errori non intercettati vengono
restituiti all'applicazione di controllo solo se sono impostate le opzioni corrette. Vedere la documentazione
dell'applicazione host per una descrizione delle opzioni da impostare durante il debug, come impostarle e se
l'host può creare classi.
Se si crea un oggetto che accede ad altri oggetti, è consigliabile tentare di gestire gli eventuali errori non gestiti
che passano di nuovo. Se non è possibile, eseguire il mapping dei codici di errore in Err.Number a uno dei
propri errori, quindi passarli di nuovo al chiamante dell'oggetto. È necessario specificare l'errore aggiungendo il
codice di errore alla VbObjectError costante. Se, ad esempio, il codice di errore è 1052, assegnarlo come segue:

Err.Number = vbObjectError + 1052

Cau t i on

Gli errori di sistema durante le chiamate alle librerie di collegamento dinamico (dll) di Windows non generano
eccezioni e non possono essere intercettati con Visual Basic l'intercettazione degli errori. Quando si chiamano le
funzioni DLL, è necessario controllare ogni valore restituito per l'esito positivo o negativo (in base alle specifiche
API) e, in caso di errore, controllare il valore nella Err proprietà dell'oggetto LastDLLError .

Esempio
In questo esempio viene innanzitutto utilizzata l' On Error GoTo istruzione per specificare il percorso di una
routine di gestione degli errori all'interno di una routine. Nell'esempio, un tentativo di dividere per zero genera
il numero di errore 6. L'errore viene gestito nella routine di gestione degli errori e il controllo viene quindi
restituito all'istruzione che ha causato l'errore. L' On Error GoTo 0 istruzione disattiva l'intercettazione degli
errori. Viene quindi On Error Resume Next utilizzata l'istruzione per rinviare l'intercettazione degli errori, in
modo che il contesto per l'errore generato dall'istruzione successiva possa essere noto per alcuni. Si noti che
Err.Clear viene usato per cancellare le Err proprietà dell'oggetto dopo che l'errore è stato gestito.

Public Sub OnErrorDemo()


On Error GoTo ErrorHandler ' Enable error-handling routine.
Dim x As Integer = 32
Dim y As Integer = 0
Dim z As Integer
z = x / y ' Creates a divide by zero error
On Error GoTo 0 ' Turn off error trapping.
On Error Resume Next ' Defer error trapping.
z = x / y ' Creates a divide by zero error again
If Err.Number = 6 Then
' Tell user what happened. Then clear the Err object.
Dim Msg As String
Msg = "There was an error attempting to divide by zero!"
MsgBox(Msg, , "Divide by zero error")
Err.Clear() ' Clear Err object fields.
End If
Exit Sub ' Exit to avoid handler.
ErrorHandler: ' Error-handling routine.
Select Case Err.Number ' Evaluate error number.
Case 6 ' Divide by zero error
MsgBox("You attempted to divide by zero!")
' Insert code to handle this error
Case Else
' Insert code to handle other situations here...
End Select
Resume Next ' Resume execution at the statement immediately
' following the statement where the error occurred.
End Sub

Requisiti
Spazio dei nomi: Microsoft. VisualBasic
Assembly: Libreria di runtime Visual Basic (in Microsoft.VisualBasic.dll)
Vedi anche
Err
Number
Description
LastDllError
Istruzione End
Istruzione Exit
Istruzione Resume
Messaggi di errore
Istruzione Try...Catch...Finally
Operator Statement
05/03/2021 • 10 minutes to read • Edit Online

Dichiara il simbolo dell'operatore, gli operandi e il codice che definiscono una routine di operatore in una classe
o una struttura.

Sintassi
[ <attrlist> ] Public [ Overloads ] Shared [ Shadows ] [ Widening | Narrowing ]
Operator operatorsymbol ( operand1 [, operand2 ]) [ As [ <attrlist> ] type ]
[ statements ]
[ statements ]
Return returnvalue
[ statements ]
End Operator

Parti
attrlist
facoltativo. Vedere elenco attributi.
Public
Obbligatorio. Indica che questa routine dell'operatore dispone di accesso pubblico .
Overloads
facoltativo. Vedere Overload.
Shared
Obbligatorio. Indica che questa routine dell'operatore è una procedura condivisa .
Shadows
facoltativo. Vedere Shadows.
Widening
Obbligatorio per un operatore di conversione, a meno che non si specifichi Narrowing . Indica che questa
routine dell'operatore definisce una conversione verso un tipo di contenuto più ampio . Vedere "conversioni
verso un tipo di ampliamento e riduzione" in questa pagina della guida.
Narrowing
Obbligatorio per un operatore di conversione, a meno che non si specifichi Widening . Indica che questa routine
dell'operatore definisce una conversione verso un tipo di caratteri più piccolo . Vedere "conversioni verso un
tipo di ampliamento e riduzione" in questa pagina della guida.
operatorsymbol
Obbligatorio. Simbolo o identificatore dell'operatore definito da questa routine di operatore.
operand1
Obbligatorio. Il nome e il tipo del singolo operando di un operatore unario (incluso un operatore di conversione)
o l'operando sinistro di un operatore binario.
operand2
Obbligatorio per gli operatori binari. Nome e tipo dell'operando di destra di un operatore binario.
operand1 e operand2 presentano la sintassi e le parti seguenti:
[ ByVal ] operandname [ As operandtype ]

PA RT E DESC RIZ IO N E

ByVal Facoltativo, ma il meccanismo di passaggio deve essere


ByVal.

operandname Obbligatorio. Nome della variabile che rappresenta questo


operando. Vedere Declared Element Names.

operandtype Facoltativo a meno che non Option Strict sia On . Tipo


di dati dell'operando.

type
Facoltativo a meno che non Option Strict sia On . Tipo di dati del valore restituito dalla routine dell'operatore.
statements
facoltativo. Blocco di istruzioni eseguite dalla stored procedure.
returnvalue
Obbligatorio. Valore restituito dalla routine Operator al codice chiamante.
End Operator
Obbligatorio. Termina la definizione di questa routine di operatore.

Commenti
È possibile utilizzare Operator solo in una classe o una struttura. Ciò significa che il contesto di dichiarazione
per un operatore non può essere un file di origine, uno spazio dei nomi, un modulo, un'interfaccia, una routine o
un blocco. Per altre informazioni, vedere Contesti delle dichiarazioni e livelli di accesso predefiniti.
Tutti gli operatori devono essere Public Shared . Non è possibile specificare ByRef , Optional o ParamArray
per uno degli operandi.
Non è possibile usare il simbolo dell'operatore o l'identificatore per mantenere un valore restituito. È necessario
utilizzare l' Return istruzione ed è necessario specificare un valore. Qualsiasi numero di Return istruzioni può
comparire in qualsiasi punto della procedura.
La definizione di un operatore in questo modo viene chiamata Overload degli operatori, indipendentemente dal
fatto che si usi la Overloads parola chiave. La tabella seguente elenca gli operatori che è possibile definire.

T IP O O P ERATO RI

Unaria + , - , IsFalse , IsTrue , Not

Binary + , - , * , / , \ , & , ^ , >> , << , = , <> , > , >= ,


< , <= , And , Like , Mod , Or , Xor

Conversione (unario) CType

Si noti che l'operatore = nell'elenco binario è l'operatore di confronto, non l'operatore di assegnazione.
Quando si definisce CType , è necessario specificare Widening o Narrowing .
Coppie corrispondenti
È necessario definire determinati operatori come coppie corrispondenti. Se si definisce uno degli operatori di
tale coppia, è necessario definire anche l'altro. Le coppie corrispondenti sono le seguenti:
= e <>

> e <

>= e <=

IsTrue e IsFalse

Restrizioni relative ai tipi di dati


Ogni operatore definito deve coinvolgere la classe o la struttura in cui viene definita. Ciò significa che la classe o
la struttura deve essere visualizzata come tipo di dati degli elementi seguenti:
Operando di un operatore unario.
Almeno uno degli operandi di un operatore binario.
L'operando o il tipo restituito di un operatore di conversione.
Alcuni operatori hanno restrizioni aggiuntive per i tipi di dati, come indicato di seguito:
Se si definiscono gli IsTrue IsFalse operatori e, devono entrambi restituire il Boolean tipo.
Se si definiscono gli << >> operatori e, devono entrambi specificare il Integer tipo per l'oggetto
operandtype di operand2 .

Il tipo restituito non deve corrispondere al tipo di uno degli operandi. Un operatore di confronto, ad esempio, =
<> può essere restituito Boolean anche se nessuno degli operandi è Boolean .

Operatori logici e bit per bit


Gli And Or operatori,, Not e Xor possono eseguire operazioni logiche o bit per bit in Visual Basic. Tuttavia, se
si definisce uno di questi operatori in una classe o una struttura, è possibile definire solo l'operazione bit per bit.
Non è possibile definire l' AndAlso operatore direttamente con un' Operator istruzione. Tuttavia, è possibile
usare AndAlso se sono state soddisfatte le condizioni seguenti:
È stato definito lo And stesso tipo di operando che si desidera utilizzare per AndAlso .
La definizione di And restituisce lo stesso tipo della classe o della struttura in cui è stato definito.
È stato definito l' IsFalse operatore sulla classe o sulla struttura in cui è stato definito And .

Analogamente, è possibile usare OrElse se è stato definito Or negli stessi operandi, con il tipo restituito della
classe o della struttura, ed è stato definito IsTrue sulla classe o sulla struttura.

Widening and Narrowing Conversions


Una conversione verso un tipo di caratteri più ampio viene sempre eseguita in fase di esecuzione, mentre una
conversione verso un tipo di caratteri più piccolo può avere esito negativo Per altre informazioni, vedere
Widening and Narrowing Conversions.
Se si dichiara una procedura di conversione Widening , il codice della procedura non deve generare errori. Ciò
comporta quanto segue:
Deve sempre restituire un valore valido di tipo type .
Deve gestire tutte le possibili eccezioni e altre condizioni di errore.
Deve gestire eventuali ritorni degli errori da qualsiasi routine chiamata.
Se è possibile che una procedura di conversione potrebbe non riuscire o che potrebbe causare un'eccezione non
gestita, è necessario dichiararla come Narrowing .

Esempio
Nell'esempio di codice seguente viene utilizzata l' Operator istruzione per definire il contorno di una struttura
che include routine di operatore per gli And operatori, Or , IsFalse e IsTrue . And e Or accettano due
operandi di tipo abc e tipo restituito abc . IsFalse e IsTrue accettano un solo operando di tipo abc e
restituiscono Boolean . Queste definizioni consentono al codice chiamante di usare And , AndAlso , Or e
OrElse con operandi di tipo abc .

Public Structure abc


Dim d As Date
Public Shared Operator And(ByVal x As abc, ByVal y As abc) As abc
Dim r As New abc
' Insert code to calculate And of x and y.
Return r
End Operator
Public Shared Operator Or(ByVal x As abc, ByVal y As abc) As abc
Dim r As New abc
' Insert code to calculate Or of x and y.
Return r
End Operator
Public Shared Operator IsFalse(ByVal z As abc) As Boolean
Dim b As Boolean
' Insert code to calculate IsFalse of z.
Return b
End Operator
Public Shared Operator IsTrue(ByVal z As abc) As Boolean
Dim b As Boolean
' Insert code to calculate IsTrue of z.
Return b
End Operator
End Structure

Vedi anche
Operatore IsFalse
Operatore IsTrue
Widening
Narrowing
Widening and Narrowing Conversions
Routine di operatore
Procedura: definire un operatore
Procedura: Definire un operatore di conversione
Procedura: chiamare una routine di operatore
Procedura: utilizzare una classe che definisce gli operatori
Istruzione Option <keyword>
05/03/2021 • 2 minutes to read • Edit Online

Introduce un'istruzione che specifica un'opzione del compilatore da applicare all'intero file di origine.

Commenti
Le opzioni del compilatore consentono di controllare se tutte le variabili devono essere dichiarate in modo
esplicito, se le conversioni di tipi più piccole devono essere esplicite o se le stringhe devono essere confrontate
come testo o come quantità binarie.
È possibile usare la parola chiave Option nei contesti seguenti:
Istruzione Option Compare
Istruzione Option Explicit
Option Infer (istruzione)
Option Strict Statement

Vedi anche
Parole chiave
Istruzione Option Compare
05/03/2021 • 6 minutes to read • Edit Online

Dichiara il metodo di confronto predefinito da usare durante il confronto dei dati di tipo stringa.

Sintassi
Option Compare { Binary | Text }

Parti
T ERM IN E DEF IN IZ IO N E

Binary facoltativo. Consente di eseguire confronti tra stringhe basati


su un criterio di ordinamento derivato dalle rappresentazioni
binarie interne dei caratteri.

Questo tipo di confronto è particolarmente utile se le


stringhe possono contenere caratteri che non devono essere
interpretati come testo. In questo caso, non è consigliabile
consentire che il confronto sia falsato da equivalenze
alfabetiche, ad esempio dalla mancata distinzione tra
maiuscole e minuscole.

Text facoltativo. Consente di eseguire confronti tra stringhe basati


su un criterio di ordinamento testuale senza distinzione tra
maiuscole e minuscole determinato dalle impostazioni locali
del sistema.

Questo tipo di confronto è utile se le stringhe contengono


tutti caratteri di testo e si vuole confrontarle prendendo in
considerazione le equivalenze alfabetiche, quali la mancata
distinzione tra maiuscole e minuscole e le lettere
strettamente correlate. Ad esempio, è possibile considerare
le lettere A e a equivalenti e fare in modo che le lettere
Ä e ä precedano B e b .

Commenti
Se usato, è necessario includere l'istruzione Option Compare in un file prima di tutte le altre istruzioni del codice
sorgente.
L'istruzione Option Compare specifica il metodo di confronto tra stringhe ( Binary o Text ). Il metodo di
confronto del testo predefinito è Binary .
Un confronto Binary confronta il valore numerico Unicode di ogni carattere in ciascuna stringa. Un confronto
Text confronta ogni carattere Unicode in base al relativo significato lessicale nelle impostazioni cultura
correnti.
Il criterio di ordinamento di Microsoft Windows è determinato dalla tabella codici. Per altre informazioni, vedere
Tabelle codici.
Nell'esempio seguente i caratteri nella tabella codici (ANSI 1252) per le lingue inglese ed europee vengono
ordinati usando Option Compare Binary , che determina un tipico ordinamento binario.
A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø

Se gli stessi caratteri nella stessa tabella codici venissero ordinati con Option Compare Text , si otterrebbe il
seguente ordinamento testuale.
(A=a) < (À = à) < (B=b) < (E=e) < (Ê = ê) < (Z=z) < (Ø = ø)

Quando non è presente un'istruzione Option Compare


Se il codice sorgente non contiene un' Option Compare istruzione, viene utilizzata l'impostazione Option
Compare nella pagina compilazione, Progettazione progetti (Visual Basic) . Se si usa il compilatore da riga di
comando, viene usata l'impostazione specificata dall'opzione del compilatore -OptionCompare ( .

NOTE
Nomi o percorsi visualizzati per alcuni elementi dell'interfaccia utente di Visual Studio nelle istruzioni seguenti potrebbero
essere diversi nel computer in uso. La versione di Visual Studio in uso e le impostazioni configurate determinano questi
elementi. Per altre informazioni, vedere Personalizzazione dell'IDE.

Per impostare Option Compare nell'IDE


1. In Esplora soluzioni selezionare un progetto. Scegliere Proprietà dal menu Progetto .
2. Fare clic sulla scheda Compila .
3. Impostare il valore nella casella Option Compare .
Quando si crea un progetto, l'impostazione Option Compare nella scheda Compila viene impostata
sull'impostazione Option Compare nella finestra di dialogo Opzioni . Per modificare questa impostazione,
scegliere Opzioni dal menu strumenti . Nella finestra di dialogo Opzioni espandere Progetti e soluzioni ,
quindi fare clic su Impostazioni predefinite di Visual Basic . L'impostazione predefinita iniziale in
impostazioni predefinite di Visual Basic è Binar y .
Per impostare Option Compare sulla riga di comando
Includere l'opzione del compilatore -OptionCompare ( nel comando vbc .

Esempio
Nell'esempio seguente viene usata l'istruzione Option Compare per impostare il confronto binario come metodo
predefinito per il confronto tra stringhe. Per usare questo codice, rimuovere il commento dall'istruzione
Option Compare Binary e inserirlo all'inizio del file di origine.

' Option Compare Binary

Console.WriteLine("A" < "a")


' Output: True

Esempio
Nell'esempio seguente viene usata l'istruzione Option Compare per impostare il criterio di ordinamento del testo
senza distinzione tra maiuscole e minuscole come metodo predefinito per il confronto tra stringhe. Per usare
questo codice, rimuovere il commento dall'istruzione Option Compare Text e inserirlo all'inizio del file di origine.
' Option Compare Text

Console.WriteLine("A" = "a")
' Output: True

Vedi anche
InStr
InStrRev
Replace
Split
StrComp
-optioncompare
Operatori di confronto
Comparison Operators in Visual Basic
Operatore Like
Funzioni per i valori stringa
Istruzione Option Explicit
Option Strict Statement
Istruzione Option Explicit (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Impone la dichiarazione esplicita di tutte le variabili in un file o consente dichiarazioni implicite delle variabili.

Sintassi
Option Explicit { On | Off }

Parti
On
facoltativo. Consente Option Explicit il controllo. Se On o Off non è specificato, il valore predefinito è On .
Off
facoltativo. Disabilita Option Explicit il controllo.

Commenti
Quando Option Explicit On o Option Explicit viene visualizzato in un file, è necessario dichiarare in modo
esplicito tutte le variabili usando le Dim ReDim istruzioni o. Se si tenta di utilizzare un nome di variabile non
dichiarato, si verificherà un errore in fase di compilazione. L' Option Explicit Off istruzione consente la
dichiarazione implicita delle variabili.
Se usato, è necessario includere l'istruzione Option Explicit in un file prima di tutte le altre istruzioni del codice
sorgente.

NOTE
Option Explicit Off Non è in genere consigliabile impostare su. È possibile digitare un nome di variabile in modo
errato in una o più posizioni e ciò può causare risultati imprevisti quando viene eseguito il programma.

Quando non è presente un'istruzione Option Explicit


Se il codice sorgente non contiene un' Option Explicit istruzione, viene utilizzata l'impostazione Option
Explicit nella pagina compilazione, Project Designer (Visual Basic) . Se viene usato il compilatore da riga di
comando, viene usata l'opzione del compilatore -OptionExplicit ( .
Per impostare l'opzione Explicit nell'IDE
1. In Esplora soluzioni selezionare un progetto. Scegliere Proprietà dal menu Progetto .
2. Fare clic sulla scheda Compila .
3. Impostare il valore nella casella Option Explicit .
Quando si crea un nuovo progetto, l'impostazione Option Explicit nella scheda Compila viene impostata
sull'impostazione Option Explicit nella finestra di dialogo impostazioni predefinite di Visual Basic . Per
accedere alla finestra di dialogo impostazioni predefinite di Visual Basic , scegliere Opzioni dal menu
strumenti . Nella finestra di dialogo Opzioni espandere Progetti e soluzioni , quindi fare clic su
Impostazioni predefinite di Visual Basic . L'impostazione predefinita iniziale in impostazioni predefinite di
Visual Basic è On .
Per impostare Option Explicit nella riga di comando
Includere l'opzione del compilatore -OptionExplicit ( nel comando vbc .

Esempio
Nell'esempio seguente viene utilizzata l' Option Explicit istruzione per forzare la dichiarazione esplicita di tutte
le variabili. Il tentativo di utilizzare una variabile non dichiarata genera un errore in fase di compilazione.

' Force explicit variable declaration.


Option Explicit On

Dim thisVar As Integer


thisVar = 10
' The following assignment produces a COMPILER ERROR because
' the variable is not declared and Option Explicit is On.
thisInt = 10 ' causes ERROR

Vedi anche
Istruzione Dim
Istruzione ReDim
Istruzione Option Compare
Option Strict Statement
-optioncompare
-optionexplicit
-optionstrict
Impostazioni predefinite di Visual Basic, Progetti, finestra di dialogo Opzioni
Option Infer (istruzione)
05/03/2021 • 8 minutes to read • Edit Online

Abilita l'uso dell'inferenza del tipo di variabile locale nelle variabili dichiaranti.

Sintassi
Option Infer { On | Off }

Parti
T ERM IN E DEF IN IZ IO N E

On facoltativo. Abilita l'inferenza del tipo di variabile locale.

Off facoltativo. Disabilita l'inferenza del tipo di variabile locale.

Commenti
Per impostare Option Infer in un file, digitare Option Infer On oppure Option Infer Off all'inizio del file,
prima di qualsiasi altro codice sorgente. Se il valore impostato per Option Infer in un file è in conflitto con il
valore impostato nell'IDE o sulla riga di comando, il valore nel file ha precedenza.
Quando si imposta Option Infer su On , è possibile dichiarare variabili locali senza dichiarare in modo esplicito
un tipo di dati. Tramite l'inferenza, il compilatore deriva il tipo di dati di una variabile dal tipo della relativa
espressione di inizializzazione.
Nella figura seguente, l'istruzione Option Infer è abilitata. La variabile nella dichiarazione Dim someVar = 2
viene dichiarata come Integer in base all'inferenza del tipo.
La schermata seguente mostra IntelliSense quando Option deduce è on:

Nella figura seguente, l'istruzione Option Infer è disabilitata. La variabile nella dichiarazione Dim someVar = 2
viene dichiarata come Object in base all'inferenza del tipo. In questo esempio, l'impostazione Option Strict è
impostata su off nella pagina compila, Progettazione progetti (Visual Basic).
La schermata seguente mostra IntelliSense quando Option dedurre è disattivato:
NOTE
Quando una variabile viene dichiarata come Object , il tipo di runtime può essere modificato mentre il programma è in
esecuzione. Visual Basic esegue operazioni denominate Boxing e unboxing per eseguire la conversione tra un oggetto
Object e un tipo di valore, il che rende l'esecuzione più lenta. Per informazioni su conversione boxing e unboxing, vedere
la specifica del linguaggio Visual Basic.

L'inferenza del tipo si applica a livello di routine e non si applica all'esterno di una routine in una classe, una
struttura, un modulo o un'interfaccia.
Per altre informazioni, vedere inferenza dei tipi locali.

Quando non è presente un'istruzione Option Infer


Se il codice sorgente non contiene un' Option Infer istruzione, viene utilizzata l' opzione deduce
impostazione nella pagina Compila, Progettazione progetti (Visual Basic) . Se viene usato il compilatore da riga
di comando, viene usata l'opzione del compilatore -optioninfer ( .
Per impostare Option Infer nell'IDE
1. In Esplora soluzioni selezionare un progetto. Scegliere Proprietà dal menu Progetto .
2. Fare clic sulla scheda Compila .
3. Impostare il valore nella casella Option dedurre .
Quando si crea un nuovo progetto, l'impostazione Option deduce nella scheda Compila viene impostata
sull'impostazione Option dedurre nella finestra di dialogo impostazioni predefinite di Visual Basic . Per
accedere alla finestra di dialogo impostazioni predefinite di Visual Basic , scegliere Opzioni dal menu
strumenti . Nella finestra di dialogo Opzioni espandere Progetti e soluzioni , quindi fare clic su
Impostazioni predefinite di Visual Basic . L'impostazione predefinita iniziale in impostazioni predefinite di
Visual Basic è On .
Per impostare Option Infer nella riga di comando
Includere l'opzione del compilatore -optioninfer ( nel comando vbc .

Tipi di dati e valori predefiniti


Nella tabella seguente vengono descritti i risultati di varie combinazioni della specifica del tipo di dati e
dell'inizializzatore in un'istruzione Dim .

IN IZ IA L IZ Z ATO RE
T IP O DI DAT I SP EC IF IC ATO ? SP EC IF IC ATO ? ESEM P IO RISULTATO
IN IZ IA L IZ Z ATO RE
T IP O DI DAT I SP EC IF IC ATO ? SP EC IF IC ATO ? ESEM P IO RISULTATO

No No Dim qty Se Option Strict è


disabilitato (impostazione
predefinita), la variabile è
impostata su Nothing .

Se Option Strict è
abilitato, si verifica un errore
in fase di compilazione.

No Sì Dim qty = 5 Se Option Infer è


abilitato (impostazione
predefinita), alla variabile
viene assegnato il tipo di
dati dell'inizializzatore.
Vedere inferenza del tipo
locale.

Se le istruzioni
Option Infer e
Option Strict sono
disabilitate, il tipo di dati
accettato dalla variabile è
Object .

Se Option Infer è
disabilitato e
Option Strict è abilitato,
si verifica un errore in fase
di compilazione.

Sì No Dim qty As Integer La variabile viene


inizializzata sul valore
predefinito per il tipo di
dati. Per ulteriori
informazioni, vedere
istruzione Dim.

Sì Sì Dim qty As Integer = 5 Se il tipo di dati


dell'inizializzatore non è
convertibile nel tipo di dati
specificato, si verifica un
errore in fase di
compilazione.

Esempio
Gli esempi seguenti illustrano come l'istruzione Option Infer permette di usare inferenza del tipo di variabile
locale.
' Enable Option Infer before trying these examples.

' Variable num is an Integer.


Dim num = 5

' Variable dbl is a Double.


Dim dbl = 4.113

' Variable str is a String.


Dim str = "abc"

' Variable pList is an array of Process objects.


Dim pList = Process.GetProcesses()

' Variable i is an Integer.


For i = 1 To 10
Console.WriteLine(i)
Next

' Variable item is a string.


Dim lst As New List(Of String) From {"abc", "def", "ghi"}

For Each item In lst


Console.WriteLine(item)
Next

' Variable namedCust is an instance of the Customer class.


Dim namedCust = New Customer With {.Name = "Blue Yonder Airlines",
.City = "Snoqualmie"}

' Variable product is an instance of an anonymous type.


Dim product = New With {Key .Name = "paperclips", .Price = 1.29}

' If customers is a collection of Customer objects in the following


' query, the inferred type of cust is Customer, and the inferred type
' of custs is IEnumerable(Of Customer).
Dim custs = From cust In customers
Where cust.City = "Seattle"
Select cust.Name, cust.ID

Esempio
L'esempio seguente dimostra che il tipo di runtime può differire quando una variabile viene identificata come
Object .

' Disable Option Infer when trying this example.

Dim someVar = 5
Console.WriteLine(someVar.GetType.ToString)

' If Option Infer is instead enabled, the following


' statement causes a run-time error. This is because
' someVar was implicitly defined as an integer.
someVar = "abc"
Console.WriteLine(someVar.GetType.ToString)

' Output:
' System.Int32
' System.String

Vedi anche
Istruzione Dim
Inferenza del tipo di variabile locale
Istruzione Option Compare
Istruzione Option Explicit
Option Strict Statement
Impostazioni predefinite di Visual Basic, Progetti, finestra di dialogo Opzioni
-optioninfer
Conversione boxing e unboxing
Option Strict Statement
05/03/2021 • 17 minutes to read • Edit Online

Limita le conversioni implicite dei tipi di dati solo per le conversioni verso un tipo di dati più ampio, non
consente l'associazione tardiva e impedisce la tipizzazione implicita che restituisce un Object tipo.

Sintassi
Option Strict { On | Off }

Parti
T ERM IN E DEF IN IZ IO N E

On facoltativo. Consente Option Strict il controllo.

Off facoltativo. Disabilita Option Strict il controllo.

Commenti
Quando Option Strict On o Option Strict viene visualizzato in un file, le condizioni seguenti generano un
errore in fase di compilazione:
Conversioni implicite verso un tipo di dati più piccolo
Associazione tardiva
Tipizzazione implicita che comporta un tipo Object

NOTE
Nelle configurazioni di avviso che è possibile impostare nella pagina compilazione, Progettazione progetti (Visual Basic),
sono disponibili tre impostazioni che corrispondono alle tre condizioni che provocano un errore in fase di compilazione.
Per informazioni sull'utilizzo di queste impostazioni, vedere per impostare le configurazioni di avviso nell'IDE più avanti in
questo argomento.

L' Option Strict Off istruzione disattiva il controllo degli errori e degli avvisi per tutte e tre le condizioni, anche
se le impostazioni IDE associate specificano di attivare questi errori o avvisi. L' Option Strict On istruzione
attiva il controllo di errori e avvisi per tutte e tre le condizioni, anche se le impostazioni IDE associate specificano
di disattivare questi errori o avvisi.
Se utilizzata, l' Option Strict istruzione deve essere visualizzata prima di qualsiasi altra istruzione di codice in
un file.
Quando si imposta Option Strict su On , Visual Basic verifica che i tipi di dati siano specificati per tutti gli
elementi di programmazione. I tipi di dati possono essere specificati in modo esplicito o specificati tramite
l'inferenza del tipo locale. È consigliabile specificare i tipi di dati per tutti gli elementi di programmazione, per i
motivi seguenti:
Abilita il supporto IntelliSense per le variabili e i parametri. Questo consente di visualizzare le relative
proprietà e altri membri durante la digitazione del codice.
Consente al compilatore di eseguire il controllo dei tipi. Il controllo dei tipi consente di trovare istruzioni
che possono avere esito negativo in fase di esecuzione a causa di errori di conversione del tipo. Identifica
inoltre le chiamate ai metodi su oggetti che non supportano tali metodi.
Accelera l'esecuzione del codice. Un motivo è che se non si specifica un tipo di dati per un elemento di
programmazione, il compilatore Visual Basic lo assegna al Object tipo. Il codice compilato potrebbe
dover eseguire la conversione tra Object e altri tipi di dati, riducendo così le prestazioni.

Errori di conversione implicita verso un tipo di restringimento


Questi errori si verificano in presenza di una conversione implicita verso un tipo di dati più piccolo.
Visual Basic possibile convertire molti tipi di dati in altri tipi di dati. È possibile che si verifichi una perdita di dati
quando il valore di un tipo di dati viene convertito in un tipo di dati con una precisione minore o con una
capacità minore. Si verifica un errore di run-time se tale conversione non riesce. Option Strict garantisce la
notifica in fase di compilazione di queste conversioni verso un tipo di caratteri più piccolo, in modo che sia
possibile evitarle. Per altre informazioni, vedere conversioni implicite ed esplicite e conversioni verso un tipo di
dati più piccolo e più ampio.
Le conversioni che possono causare errori includono conversioni implicite che si verificano nelle espressioni. Per
altre informazioni, vedere i seguenti argomenti:
Operatore +
Operatore + =
Operatore \ (Visual Basic)
Operatore/= (Visual Basic)
Tipo di dati Char
Quando si concatenano stringhe usando l' operatore&, tutte le conversioni alle stringhe vengono considerate
più estese. Pertanto, queste conversioni non generano un errore di conversione implicita verso un tipo di
caratteri più piccolo, anche se Option Strict è on.
Quando si chiama un metodo con un argomento con un tipo di dati diverso dal parametro corrispondente, una
conversione verso un tipo di dati più piccolo causa un errore in fase di compilazione se Option Strict è on. È
possibile evitare l'errore in fase di compilazione utilizzando una conversione verso un tipo di oggetto più ampio
o una conversione esplicita.
Gli errori di conversione implicita verso un tipo di caratteri più piccolo vengono eliminati in fase di compilazione
per le conversioni dagli elementi di una For Each…Next raccolta alla variabile di controllo del ciclo. Ciò si verifica
anche se Option Strict è on. Per ulteriori informazioni, vedere la sezione relativa alle conversioni verso un tipo
di dati più piccolo in per ciascuna... Istruzione successiva.

Errori di associazione tardiva


Un oggetto è ad associazione tardiva quando viene assegnato a una proprietà o a un metodo di una variabile
dichiarata di tipo Object . Per ulteriori informazioni, vedere associazione anticipata e tardiva.

Errori di tipo di oggetto implicito


Si verificano errori di tipo di oggetto implicito quando non è possibile dedurre un tipo appropriato per una
variabile dichiarata, pertanto viene dedotto il tipo Object . Questo errore si verifica principalmente quando si
usa un'istruzione Dim per dichiarare una variabile senza usare una clausola As e Option Infer è Off. Per
ulteriori informazioni, vedere l' istruzione Option deduce e la specifica del linguaggio Visual Basic.
Per i parametri del metodo, la As clausola è facoltativa se Option Strict è disattivata. Tuttavia, se uno dei
parametri usa una As clausola, è necessario che tutti lo usino. Se Option Strict è on, la As clausola è
obbligatoria per ogni definizione di parametro.
Se si dichiara una variabile senza usare una As clausola e la si imposta su Nothing , la variabile ha un tipo di
Object . In questo caso non si verifica alcun errore in fase di compilazione quando Option Strict è on e
Option Infer è on. Un esempio è Dim something = Nothing .

Tipi di dati e valori predefiniti


Nella tabella seguente vengono descritti i risultati di diverse combinazioni di specifica del tipo di dati e
dell'inizializzatore in un' istruzione Dim.

IN IZ IA L IZ Z ATO RE
T IP O DI DAT I SP EC IF IC ATO ? SP EC IF IC ATO ? ESEM P IO RISULTATO

No No Dim qty Se Option Strict è


disabilitato (impostazione
predefinita), la variabile è
impostata su Nothing .

Se Option Strict è
abilitato, si verifica un errore
in fase di compilazione.

No Sì Dim qty = 5 Se Option Infer è


abilitato (impostazione
predefinita), alla variabile
viene assegnato il tipo di
dati dell'inizializzatore.
Vedere inferenza del tipo
locale.

Se le istruzioni
Option Infer e
Option Strict sono
disabilitate, il tipo di dati
accettato dalla variabile è
Object .

Se Option Infer è
disabilitato e
Option Strict è abilitato,
si verifica un errore in fase
di compilazione.

Sì No Dim qty As Integer La variabile viene


inizializzata sul valore
predefinito per il tipo di
dati. Per ulteriori
informazioni, vedere
istruzione Dim.
IN IZ IA L IZ Z ATO RE
T IP O DI DAT I SP EC IF IC ATO ? SP EC IF IC ATO ? ESEM P IO RISULTATO

Sì Sì Dim qty As Integer = 5 Se il tipo di dati


dell'inizializzatore non è
convertibile nel tipo di dati
specificato, si verifica un
errore in fase di
compilazione.

Quando non è presente un'istruzione Option Strict


Se il codice sorgente non contiene un' Option Strict istruzione, viene utilizzata l'impostazione Option Strict
nella pagina compilazione, Progettazione progetti (Visual Basic) . Nella pagina Compila sono disponibili
impostazioni che consentono di controllare ulteriormente le condizioni che generano un errore.
Se si usa il compilatore da riga di comando, è possibile usare l'opzione del compilatore -OptionStrict ( per
specificare un'impostazione per Option Strict .
Per impostare Option Strict nell'IDE

NOTE
Nomi o percorsi visualizzati per alcuni elementi dell'interfaccia utente di Visual Studio nelle istruzioni seguenti potrebbero
essere diversi nel computer in uso. La versione di Visual Studio in uso e le impostazioni configurate determinano questi
elementi. Per altre informazioni, vedere Personalizzazione dell'IDE.

1. In Esplora soluzioni selezionare un progetto. Scegliere Proprietà dal menu Progetto .


2. Nella scheda Compila , impostare il valore nella casella Option Strict .
Per impostare le configurazioni di avviso nell'IDE
Quando si usa la pagina Compila, Progettazione progetti (Visual Basic) invece di un' Option Strict istruzione, è
possibile controllare ulteriormente le condizioni che generano errori. Nella sezione delle configurazioni di
avviso della pagina Compila sono presenti impostazioni che corrispondono alle tre condizioni che generano
un errore in fase di compilazione quando Option Strict è on. Queste impostazioni sono le seguenti:
Conversione implicita
Binding tardivo. La chiamata potrebbe non riuscire in fase di esecuzione.
Tipo implicito. Verrà utilizzato oggetto.
Quando si imposta Option Strict su On , tutte e tre queste impostazioni di configurazione degli avvisi vengono
impostate su Errore . Quando si imposta Option Strict su Off , tutte e tre le impostazioni vengono impostate su
Nessuno .
È possibile modificare singolarmente ogni impostazione di configurazione degli avvisi su Nessuno , Avviso o
Errore . Se tutte e tre le impostazioni di configurazione degli avvisi sono impostate su errore , On viene
visualizzato nella Option strict casella. Se tutti e tre sono impostati su None , Off viene visualizzato in questa
casella. Per qualsiasi altra combinazione di queste impostazioni, viene visualizzato (personalizzato) .
Per impostare l'impostazione predefinita Option Strict per i nuovi progetti
Quando si crea un progetto, l'impostazione Option Strict nella scheda Compila viene impostata
sull'impostazione Option Strict nella finestra di dialogo Opzioni .
Per impostare Option Strict in questa finestra di dialogo, scegliere Opzioni dal menu strumenti . Nella
finestra di dialogo Opzioni espandere Progetti e soluzioni , quindi fare clic su Impostazioni predefinite di
Visual Basic . L'impostazione predefinita iniziale in impostazioni predefinite di Visual Basic è Off .
Per impostare Option Strict nella riga di comando
Includere l'opzione del compilatore -OptionStrict ( nel comando vbc .

Esempio
Negli esempi seguenti vengono illustrati gli errori in fase di compilazione causati da conversioni di tipi implicite
che sono conversioni verso un tipo di testo più piccolo. Questa categoria di errori corrisponde alla condizione di
conversione implicita nella pagina Compila .

' If Option Strict is on, this implicit narrowing


' conversion causes a compile-time error.
' The commented statements below use explicit
' conversions to avoid a compile-time error.
Dim cyclists As Long = 5
Dim bicycles As Integer = cyclists
'Dim bicycles As Integer = CType(cyclists, Integer)
'Dim bicycles As Integer = CInt(cyclists)
'Dim bicycles As Integer = Convert.ToInt32(cyclists)

' If Option Strict is on, this implicit narrowing


' conversion causes a compile-time error.
' The commented statements below use explicit
' conversions to avoid a compile-time error.
Dim charVal As Char = "a"
'Dim charVal As Char = "a"c
'Dim charVal As Char = CType("a", Char)

' If Option Strict is on, a compile-time error occurs.


' If Option Strict is off, the string is implicitly converted
' to a Double, and then is added to the other number.
Dim myAge As Integer = "34" + 6

' If Option Strict is on, a compile-time error occurs.


' If Option Strict is off, the floating-point number
' is implicitly converted to a Long.
Dim num = 123.45 \ 10

Esempio
Nell'esempio seguente viene illustrato un errore in fase di compilazione causato dall'associazione tardiva.
Questa categoria di errori corrisponde all' associazione tardiva; la chiamata potrebbe non riuscire in
fase di esecuzione nella pagina Compila .

' If Option Strict is on, this late binding


' causes a compile-time error. If Option Strict
' is off, the late binding instead causes a
' run-time error.
Dim punchCard As New Object
punchCard.Column = 5

Esempio
Negli esempi seguenti vengono illustrati gli errori causati da variabili dichiarate con un tipo implicito di Object .
Questa categoria di errori corrisponde al tipo implicito . la condizione presuppone l'oggetto nella pagina di
compilazione .

' If Option Strict is on and Option Infer is off,


' this Dim statement without an As clause
' causes a compile-time error.
Dim cardReaders = 5

' If Option Strict is on, a compile-time error occurs.


' If Option Strict is off, the variable is set to Nothing.
Dim dryWall

' If Option Strict is on, this parameter without an


' As clause causes a compile-time error.
Private Sub DetectIntergalacticRange(ByVal photonAttenuation)

End Sub

Vedi anche
Widening and Narrowing Conversions
Conversioni implicite ed esplicite
Compilazione (pagina), Creazione progetti (Visual Basic)
Istruzione Option Explicit
CString
Procedura: accedere ai membri di un oggetto
Espressioni incorporate in XML
Conversione di tipo relaxed del delegato
Associazione tardiva nelle soluzioni Office
-optionstrict
Impostazioni predefinite di Visual Basic, Progetti, finestra di dialogo Opzioni
Property Statement
05/03/2021 • 10 minutes to read • Edit Online

Dichiara il nome di una proprietà e le routine della proprietà usate per archiviare e recuperare il valore della
proprietà.

Sintassi
[ <attributelist> ] [ Default ] [ accessmodifier ]
[ propertymodifiers ] [ Shared ] [ Shadows ] [ ReadOnly | WriteOnly ] [ Iterator ]
Property name ( [ parameterlist ] ) [ As returntype ] [ Implements implementslist ]
[ <attributelist> ] [ accessmodifier ] Get
[ statements ]
End Get
[ <attributelist> ] [ accessmodifier ] Set ( ByVal value As returntype [, parameterlist ] )
[ statements ]
End Set
End Property
- or -
[ <attributelist> ] [ Default ] [ accessmodifier ]
[ propertymodifiers ] [ Shared ] [ Shadows ] [ ReadOnly | WriteOnly ]
Property name ( [ parameterlist ] ) [ As returntype ] [ Implements implementslist ]

Parti
attributelist

facoltativo. Elenco di attributi che si applicano a questa proprietà o a questa Get Set routine. Vedere
elenco attributi.
Default

facoltativo. Specifica che questa proprietà è la proprietà predefinita della classe o della struttura in cui è
definita. Le proprietà predefinite devono accettare parametri e possono essere impostate e recuperate
senza specificare il nome della proprietà. Se si dichiara la proprietà come Default , non è possibile
utilizzare Private sulla proprietà o su una delle relative routine di proprietà.
accessmodifier

Facoltativo nell' Property istruzione e al massimo una delle Get Set istruzioni e. Può essere uno dei
seguenti:
Pubblica
Protetto
Friend
Privata
Protected Friend
Privato protetto
Vedere livelli di accesso in Visual Basic.
propertymodifiers

facoltativo. Può essere uno dei seguenti:


Overload
Override
Overridable
NotOverridable
MustOverride
MustOverride Overrides

NotOverridable Overrides

Shared

facoltativo. Vedere Shared.


Shadows

facoltativo. Vedere Shadows.


ReadOnly

facoltativo. Vedere ReadOnly.


WriteOnly

facoltativo. Vedere WriteOnly.


Iterator

facoltativo. Vedere iteratore.


name

Obbligatorio. Nome della proprietà. Vedere Declared Element Names.


parameterlist

facoltativo. Elenco di nomi di variabili locali che rappresentano i parametri di questa proprietà e possibili
parametri aggiuntivi della Set procedura. Vedere elenco di parametri.
returntype

Obbligatorio se Option Strict è On . Tipo di dati del valore restituito da questa proprietà.
Implements

facoltativo. Indica che questa proprietà implementa una o più proprietà, ognuna delle quali è definita in
un'interfaccia implementata dalla classe o dalla struttura contenitore di questa proprietà. Vedere
istruzione Implements.
implementslist

Necessario se si fornisce Implements . Elenco delle proprietà implementate.


implementedproperty [ , implementedproperty ... ]

Ogni implementedproperty presenta la sintassi e le parti seguenti:


interface.definedname

PA RT E DESC RIZ IO N E

interface Obbligatorio. Nome di un'interfaccia implementata dalla


classe o dalla struttura contenitore di questa proprietà.

definedname Obbligatorio. Nome in base al quale è definita la


proprietà interface .

Get

facoltativo. Obbligatorio se la proprietà è contrassegnata ReadOnly . Avvia una Get routine di proprietà
utilizzata per restituire il valore della proprietà. L' Get istruzione non viene utilizzata con le proprietà
implementate automaticamente.
statements

facoltativo. Blocco di istruzioni da eseguire all'interno Get della Set routine o.


End Get

Termina la Get routine della proprietà.


Set

facoltativo. Obbligatorio se la proprietà è contrassegnata WriteOnly . Avvia una Set routine di proprietà
utilizzata per archiviare il valore della proprietà. L' Set istruzione non viene utilizzata con le proprietà
implementate automaticamente.
End Set

Termina la Set routine della proprietà.


End Property

Termina la definizione di questa proprietà.

Commenti
L' Property istruzione introduce la dichiarazione di una proprietà. Una proprietà può avere una Get routine
(sola lettura), una Set routine (solo scrittura) o entrambe (lettura/scrittura). È possibile omettere Get la Set
procedura e quando si usa una proprietà implementata automaticamente. Per altre informazioni, vedere
Proprietà implementate automaticamente.
È possibile usare Property solo a livello di classe. Ciò significa che il contesto di dichiarazione per una proprietà
deve essere una classe, una struttura, un modulo o un'interfaccia e non può essere un file di origine, uno spazio
dei nomi, una procedura o un blocco. Per altre informazioni, vedere Contesti delle dichiarazioni e livelli di
accesso predefiniti.
Per impostazione predefinita, le proprietà usano l'accesso pubblico. È possibile modificare il livello di accesso di
una proprietà con un modificatore di accesso nell' Property istruzione ed è possibile modificare
facoltativamente una delle routine di proprietà a un livello di accesso più restrittivo.
Visual Basic passa un parametro alla Set routine durante le assegnazioni di proprietà. Se non si specifica un
parametro per Set , il Integrated Development Environment (IDE) utilizza un parametro implicito denominato
value . Questo parametro include il valore da assegnare alla proprietà. Questo valore viene in genere archiviato
in una variabile locale privata e restituito ogni volta che Get viene chiamata la stored procedure.
Regole
Livelli di accesso misti. Se si definisce una proprietà di lettura/scrittura, è possibile specificare
facoltativamente un livello di accesso diverso per la Get routine o Set , ma non per entrambi. In tal
caso, il livello di accesso della routine deve essere più restrittivo del livello di accesso della proprietà. Se,
ad esempio, la proprietà è dichiarata Friend , è possibile dichiarare la Set routine Private , ma non
Public .

Se si definisce una ReadOnly proprietà o WriteOnly , l'unica routine della proprietà ( Get o Set
rispettivamente) rappresenta tutta la proprietà. Non è possibile dichiarare un livello di accesso diverso
per una procedura di questo tipo, perché imposta due livelli di accesso per la proprietà.
Tipo restituito. L' Property istruzione può dichiarare il tipo di dati del valore restituito. È possibile
specificare qualsiasi tipo di dati o il nome di un'enumerazione, una struttura, una classe o un'interfaccia.
Se non si specifica returntype , la proprietà restituisce Object .
Implementazione. Se questa proprietà Usa la Implements parola chiave, la classe o la struttura
contenitore deve avere un' Implements istruzione immediatamente successiva all' Class Structure
istruzione o. L' Implements istruzione deve includere ogni interfaccia specificata in implementslist .
Tuttavia, il nome con cui un'interfaccia definisce Property (in definedname ) non deve essere uguale al
nome di questa proprietà (in name ).

Comportamento
Restituzione da una routine di proprietà. Quando la Get Set procedura o restituisce al codice
chiamante, l'esecuzione continua con l'istruzione che segue l'istruzione che lo ha richiamato.
Le Exit Property Return istruzioni e generano un'uscita immediata da una routine di proprietà.
Qualsiasi numero di Exit Property Return istruzioni e può comparire in qualsiasi punto della procedura
ed è possibile combinare le Exit Property Return istruzioni e.
Valore restituito. Per restituire un valore da una Get routine, è possibile assegnare il valore al nome
della proprietà o includerlo in un' Return istruzione. Nell'esempio seguente viene assegnato il valore
restituito al nome della proprietà quoteForTheDay , quindi viene utilizzata l' Exit Property istruzione per
restituire.

Private quoteValue As String = "No quote assigned yet."

ReadOnly Property QuoteForTheDay() As String


Get
QuoteForTheDay = quoteValue
Exit Property
End Get
End Property

Se si utilizza Exit Property senza assegnare un valore a name , la Get stored procedure restituisce il
valore predefinito per il tipo di dati della proprietà.
L' Return istruzione, allo stesso tempo, assegna il Get valore restituito della routine e chiude la
procedura. Nell'esempio riportato di seguito viene illustrata questa situazione.

Private quoteValue As String = "No quote assigned yet."


ReadOnly Property QuoteForTheDay() As String
Get
Return quoteValue
End Get
End Property

Esempio
Nell'esempio seguente viene dichiarata una proprietà in una classe.

Class Class1
' Define a local variable to store the property value.
Private propertyValue As String
' Define the property.
Public Property Prop1() As String
Get
' The Get property procedure is called when the value
' of a property is retrieved.
Return propertyValue
End Get
Set(ByVal value As String)
' The Set property procedure is called when the value
' of a property is modified. The value to be assigned
' is passed in the argument to Set.
propertyValue = value
End Set
End Property
End Class

Vedi anche
Proprietà implementate automaticamente
Oggetti e classi
Istruzione Get
Istruzione set
Elenco parametri
Default
Istruzioni Q-Z
05/03/2021 • 2 minutes to read • Edit Online

Nella tabella seguente è incluso un elenco di istruzioni del linguaggio Visual Basic.

RaiseEvent ReDim REM RemoveHandler

Riprendi Ritorno Select...Case Set

Stop Struttura Sub SyncLock

Quindi Generare Prova... Rileva... Infine Usando

While...End While Con... Termina con Rendimento

Vedi anche
Istruzioni A-E
Istruzioni F-P
Riferimenti al linguaggio Visual Basic
Istruzione RaiseEvent
05/03/2021 • 7 minutes to read • Edit Online

Attiva un evento dichiarato a livello di modulo all'interno di una classe, un form o un documento.

Sintassi
RaiseEvent eventname[( argumentlist )]

Parti
eventname
Obbligatorio. Nome dell'evento da attivare.
argumentlist
facoltativo. Elenco delimitato da virgole di variabili, matrici o espressioni. L' argumentlist argomento deve
essere racchiuso tra parentesi. Se non è presente alcun argomento, le parentesi devono essere omesse.

Commenti
Il valore richiesto eventname è il nome di un evento dichiarato all'interno del modulo. Segue Visual Basic
convenzioni di denominazione delle variabili.
Se l'evento non è stato dichiarato all'interno del modulo in cui viene generato, si verifica un errore. Nel
frammento di codice seguente viene illustrata una dichiarazione di evento e una procedura in cui viene generato
l'evento.

' Declare an event at module level.


Event LogonCompleted(ByVal UserName As String)

Sub Logon(ByVal UserName As String)


' Raise the event.
RaiseEvent LogonCompleted(UserName)
End Sub

Non è possibile usare RaiseEvent per generare eventi non dichiarati in modo esplicito nel modulo. Ad esempio,
tutti i form ereditano un Click evento da e non System.Windows.Forms.Form possono essere generati
utilizzando RaiseEvent in un formato derivato. Se si dichiara un Click evento nel modulo modulo, viene
ombreggiato l'evento del modulo Click . È comunque possibile richiamare l'evento del form chiamando Click il
OnClick metodo.
Per impostazione predefinita, un evento definito in Visual Basic genera i relativi gestori eventi nell'ordine in cui
vengono stabilite le connessioni. Poiché gli eventi possono avere ByRef parametri, un processo che si connette
in ritardo può ricevere parametri che sono stati modificati da un gestore eventi precedente. Dopo l'esecuzione
dei gestori di eventi, il controllo viene restituito alla subroutine che ha generato l'evento.
NOTE
Gli eventi non condivisi non devono essere generati all'interno del costruttore della classe in cui sono dichiarati. Sebbene
tali eventi non causino errori in fase di esecuzione, potrebbero non essere rilevati dai gestori eventi associati. Usare il
Shared modificatore per creare un evento condiviso se è necessario generare un evento da un costruttore.

NOTE
È possibile modificare il comportamento predefinito degli eventi definendo un evento personalizzato. Per gli eventi
personalizzati, l' RaiseEvent istruzione richiama la funzione di RaiseEvent accesso dell'evento. Per ulteriori
informazioni sugli eventi personalizzati, vedere istruzione Event.

Esempio
Negli esempi seguenti, gli eventi vengono usati per il conto alla rovescia dei secondi, da 10 a 0. Nel codice
vengono illustrati diversi metodi, proprietà e istruzioni correlati agli eventi, inclusa l' RaiseEvent istruzione.
La classe che genera un evento viene definita origine e i metodi che lo elaborano vengono definiti gestori eventi.
Un'origine eventi può disporre di più gestori per gli eventi generati. Quando la classe genera l'evento, lo stesso
evento viene generato in tutte le classi per cui è stato scelto di gestire eventi per tale istanza dell'oggetto.
Nell'esempio vengono usati anche un form ( Form1 ) con un pulsante ( Button1 ) e una casella di testo ( TextBox1
). Quando si fa clic sul pulsante, nella prima casella di testo viene visualizzato il conto alla rovescia dei secondi da
10 a 0. Al termine dei 10 secondi, nella prima casella di testo viene visualizzato "Done".
Il codice di Form1 specifica gli stati di inizio e fine del form. Contiene inoltre il codice eseguito quando vengono
generati gli eventi.
Per usare questo esempio, aprire un nuovo progetto di applicazione Windows, aggiungere un pulsante
denominato Button1 e una casella di testo denominata TextBox1 al form principale, denominato Form1 . Fare
quindi clic con il pulsante destro del mouse sul form e scegliere Visualizza codice per aprire l'editor di codice.
Aggiungere una WithEvents variabile alla sezione delle dichiarazioni della Form1 classe.

Private WithEvents mText As TimerState

Esempio
Aggiungere il codice seguente al codice per Form1 : Sostituire eventuali procedure duplicate che possono
esistere, ad esempio Form_Load o Button_Click .
Private Sub Form1_Load() Handles MyBase.Load
Button1.Text = "Start"
mText = New TimerState
End Sub
Private Sub Button1_Click() Handles Button1.Click
mText.StartCountdown(10.0, 0.1)
End Sub

Private Sub mText_ChangeText() Handles mText.Finished


TextBox1.Text = "Done"
End Sub

Private Sub mText_UpdateTime(ByVal Countdown As Double


) Handles mText.UpdateTime

TextBox1.Text = Format(Countdown, "##0.0")


' Use DoEvents to allow the display to refresh.
My.Application.DoEvents()
End Sub

Class TimerState
Public Event UpdateTime(ByVal Countdown As Double)
Public Event Finished()
Public Sub StartCountdown(ByVal Duration As Double,
ByVal Increment As Double)
Dim Start As Double = DateAndTime.Timer
Dim ElapsedTime As Double = 0

Dim SoFar As Double = 0


Do While ElapsedTime < Duration
If ElapsedTime > SoFar + Increment Then
SoFar += Increment
RaiseEvent UpdateTime(Duration - SoFar)
End If
ElapsedTime = DateAndTime.Timer - Start
Loop
RaiseEvent Finished()
End Sub
End Class

Premere F5 per eseguire l'esempio precedente e fare clic sul pulsante Avvia . Nella prima casella di testo viene
avviato il conto alla rovescia dei secondi. Al termine dei 10 secondi, nella prima casella di testo viene visualizzato
"Done".

NOTE
Il My.Application.DoEvents metodo non elabora gli eventi esattamente allo stesso modo del modulo. Per consentire al
modulo di gestire direttamente gli eventi, è possibile utilizzare il multithreading. Per altre informazioni, vedere Threading
gestito.

Vedi anche
Eventi
Istruzione Event
Istruzione AddHandler
Istruzione RemoveHandler
Selettori
Istruzione ReDim (Visual Basic)
05/03/2021 • 8 minutes to read • Edit Online

Rialloca lo spazio di archiviazione per una variabile di matrice.

Sintassi
ReDim [ Preserve ] name(boundlist) [ , name(boundlist) [, ... ] ]

Parti
T ERM IN E DEF IN IZ IO N E

Preserve facoltativo. Modificatore utilizzato per conservare i dati nella


matrice esistente quando si modifica soltanto la grandezza
dell'ultima dimensione.

name Obbligatorio. Nome della variabile di matrice. Vedere


Declared Element Names.

boundlist Obbligatorio. Elenco di limiti relativi a ogni dimensione della


matrice ridefinita.

Commenti
È possibile utilizzare l'istruzione ReDim per modificare una o più dimensioni di una matrice che è stata già
dichiarata. Se si dispone di una matrice di grandi dimensioni e alcuni degli elementi di questa non sono più
necessari, ReDim consente di liberare memoria riducendo le dimensioni della matrice. D’altra parte, se la
matrice necessita di più elementi, ReDim è in grado di aggiungerli.
L'istruzione ReDim è destinata solo alle matrici. Non è valida per valori scalari (variabili che contengono un
unico valore), raccolte o strutture. Tenere presente che se l'utente dichiara che una variabile è di tipo Array ,
l'istruzione ReDim non dispone di sufficienti informazioni sulla tipologia e non può creare la nuova matrice.
Si può usare ReDim solo a livello di routine. Pertanto, il contesto della dichiarazione relativo alla variabile deve
essere una routine. Di conseguenza, non può essere un file di origine, uno spazio dei nomi, un'interfaccia, una
classe, una struttura, un modulo o un blocco. Per altre informazioni, vedere Contesti delle dichiarazioni e livelli di
accesso predefiniti.

Regole
Variabili multiple. È possibile ridimensionare diverse variabili di matrice nella stessa istruzione di
dichiarazione e specificare le name boundlist parti e per ogni variabile. Nel caso di più variabili, è
possibile separarle mediante virgole.
Limiti della matrice. Ogni voce in boundlist può specificare i limiti inferiore e superiore della
dimensione. Il limite inferiore è sempre pari a 0 (zero). Il limite superiore rappresenta il valore di indice
più alto possibile per la dimensione, non la lunghezza della dimensione (vale a dire, il limite superiore più
uno). L'indice di ogni dimensione può variare tra 0 e il relativo valore di limite superiore.
Il numero di dimensioni in boundlist deve corrispondere al numero originale di dimensioni (livello)
della matrice.
Tipi di dati. L' ReDim istruzione non può modificare il tipo di dati di una variabile di matrice o dei
relativi elementi.
Inizializzazione. L' ReDim istruzione non può fornire nuovi valori di inizializzazione per gli elementi
della matrice.
Rank . L' ReDim istruzione non può modificare il rango (numero di dimensioni) della matrice.
Ridimensionamento con Preser ve. Se si utilizza Preserve , è possibile ridimensionare solo l'ultima
dimensione della matrice. Per ogni dimensione, è necessario specificare il limite della matrice esistente.
Ad esempio, se la matrice contiene solo una dimensione, è possibile ridimensionarla e mantenere tutto il
contenuto della matrice, poiché si sta modificando l'ultima e unica dimensione. Tuttavia, se la matrice
dispone di due o più dimensioni e si utilizza Preserve , è possibile modificare i valori soltanto per l'ultima
dimensione.
Proprietà. È possibile utilizzare ReDim su una proprietà che include una matrice di valori.

Comportamento
Sostituzione di matrici. ReDim rilascia la matrice esistente e crea una nuova matrice con lo stesso
rango. La nuova matrice sostituisce quella rilasciata nella variabile di matrice.
Inizializzazione senza Preser ve. Se non si specifica Preserve , ReDim Inizializza gli elementi della
nuova matrice usando il valore predefinito per il tipo di dati.
Inizializzazione con Preser ve. Se si specifica Preserve , Visual Basic copia gli elementi dalla matrice
esistente alla nuova matrice.

Esempio
Nell'esempio seguente viene aumentata la grandezza dell'ultima dimensione di una matrice dinamica senza
perdere i dati presenti nella matrice; in seguito, viene ridotta la dimensione con perdita di dati parziali. Infine,
viene ridotta la dimensione del relativo valore originale e vengono inizializzati di nuovo tutti gli elementi della
matrice.

Dim intArray(10, 10, 10) As Integer


ReDim Preserve intArray(10, 10, 20)
ReDim Preserve intArray(10, 10, 15)
ReDim intArray(10, 10, 10)

L'istruzione Dim crea una nuova matrice con tre dimensioni. Ogni dimensione viene dichiarata con un limite
pari a 10. In questo modo l'indice della matrice per ogni dimensione può essere compreso tra 0 e 10. Nella
seguente discussione, si fa riferimento alle tre dimensioni come livello, riga e colonna.
La prima ReDim crea una nuova matrice che sostituisce quella esistente nella intArray di variabile. ReDim
copia tutti gli elementi dalla matrice esistente in quella nuova. Inoltre, consente di aggiungere altre 10 colonne
alla fine di ogni riga di tutti i livelli e consente di inizializzare gli elementi in queste nuove colonne su 0 (valore
predefinito) di Integer , ovvero il tipo di elemento della matrice.
La seconda ReDim crea una nuova matrice e copia tutti gli elementi adeguati. Tuttavia, cinque colonne vengono
perse alla fine di ogni riga relativa a ogni livello. Ciò non rappresenta un problema se l'utente non ha più la
necessità di utilizzare tali colonne. La riduzione delle dimensioni di una grande matrice può liberare memoria
che non è più necessaria.
La terza ReDim crea una nuova matrice e rimuove altre cinque colonne dalla fine di ogni riga relativa a ogni
livello. Questa volta non copia gli elementi esistenti. Questa istruzione consente di ripristinare le dimensioni
originali della matrice. Dal momento che l'istruzione non include il modificatore Preserve , imposta i valori
predefiniti originali di tutti gli elementi della matrice.
Per altri esempi, vedere matrici.

Vedi anche
IndexOutOfRangeException
Istruzione Const
Istruzione Dim
Istruzione Erase
Nothing
Matrici
Istruzione REM (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Utilizzato per includere osservazioni esplicative nel codice sorgente di un programma.

Sintassi
REM comment
' comment

Parti
comment
facoltativo. Testo di qualsiasi commento che si desidera includere. È necessario uno spazio tra la REM parola
chiave e comment .

Commenti
È possibile inserire un' REM istruzione da solo su una riga oppure è possibile inserirla in una riga che segue
un'altra istruzione. L' REM istruzione deve essere l'ultima istruzione della riga. Se segue un'altra istruzione,
l'oggetto REM deve essere separato dall'istruzione da uno spazio.
È possibile utilizzare le virgolette singole ( ' ) anziché REM . Questo vale se il commento segue un'altra
istruzione sulla stessa riga o si trova da solo su una riga.

NOTE
Non è possibile continuare un' REM istruzione utilizzando una sequenza di continuazione di riga ( _ ). Una volta che
viene avviato un commento, il compilatore non esamina i caratteri per un significato speciale. Per un commento su più
righe, usare un'altra REM istruzione o un simbolo di commento ( ' ) in ogni riga.

Esempio
Nell'esempio seguente viene illustrata l' REM istruzione, che viene utilizzata per includere osservazioni
esplicative in un programma. Viene inoltre illustrata l'alternativa di utilizzare il carattere virgoletta singola ( ' )
anziché REM .

Dim demoStr1, demoStr2 As String


demoStr1 = "Hello" REM Comment after a statement using REM.
demoStr2 = "Goodbye" ' Comment after a statement using the ' character.
REM This entire line is a comment.
' This entire line is also a comment.

Vedi anche
Commenti nel codice
Procedura: Interrompere e combinare istruzioni nel codice
Istruzione RemoveHandler
05/03/2021 • 2 minutes to read • Edit Online

Rimuove l'associazione tra un evento e un gestore eventi.

Sintassi
RemoveHandler event, AddressOf eventhandler

Parti
T ERM IN E DEF IN IZ IO N E

event Nome dell'evento da gestire.

eventhandler Nome della stored procedure che gestisce attualmente


l'evento.

Commenti
Le AddHandler RemoveHandler istruzioni e consentono di avviare e arrestare la gestione degli eventi per un
evento specifico in qualsiasi momento durante l'esecuzione del programma.

NOTE
Per gli eventi personalizzati, l' RemoveHandler istruzione richiama la funzione di RemoveHandler accesso dell'evento. Per
ulteriori informazioni sugli eventi personalizzati, vedere istruzione Event.

Esempio
Sub TestEvents()
Dim Obj As New Class1
' Associate an event handler with an event.
AddHandler Obj.Ev_Event, AddressOf EventHandler
' Call the method to raise the event.
Obj.CauseSomeEvent()
' Stop handling events.
RemoveHandler Obj.Ev_Event, AddressOf EventHandler
' This event will not be handled.
Obj.CauseSomeEvent()
End Sub

Sub EventHandler()
' Handle the event.
MsgBox("EventHandler caught event.")
End Sub

Public Class Class1


' Declare an event.
Public Event Ev_Event()
Sub CauseSomeEvent()
' Raise an event.
RaiseEvent Ev_Event()
End Sub
End Class

Vedere anche
Istruzione AddHandler
Selettori
Istruzione Event
Eventi
Istruzione Resume
05/03/2021 • 3 minutes to read • Edit Online

Riprende l'esecuzione al termine di una routine di gestione degli errori.


Si consiglia di utilizzare la gestione delle eccezioni strutturata nel codice, quando possibile, anziché utilizzare la
gestione delle eccezioni non strutturata e le On Error Resume istruzioni e. Per altre informazioni, vedere
Istruzione Try...Catch...Finally.

Sintassi
Resume [ Next | line ]

Parti
Resume
Obbligatorio. Se l'errore si è verificato nella stessa procedura del gestore degli errori, l'esecuzione riprende con
l'istruzione che ha causato l'errore. Se l'errore si è verificato in una routine chiamata, l'esecuzione riprende in
corrispondenza dell'istruzione che ha eseguito l'ultima chiamata alla routine che contiene la routine di gestione
degli errori.
Next
facoltativo. Se l'errore si è verificato nella stessa procedura del gestore degli errori, l'esecuzione riprende con
l'istruzione immediatamente successiva all'istruzione che ha causato l'errore. Se l'errore si è verificato in una
routine chiamata, l'esecuzione riprende con l'istruzione immediatamente successiva all'istruzione che ha
eseguito l'ultima chiamata alla routine che contiene la routine di gestione degli errori (o On Error Resume Next
istruzione).
line
facoltativo. L'esecuzione riprende in corrispondenza della riga specificata nell' line argomento obbligatorio. L'
line argomento è un'etichetta di riga o un numero di riga e deve essere nella stessa procedura del gestore
degli errori.

Commenti
NOTE
Si consiglia di utilizzare la gestione delle eccezioni strutturata nel codice, quando possibile, anziché utilizzare la gestione
delle eccezioni non strutturata e le On Error Resume istruzioni e. Per altre informazioni, vedere Istruzione
Try...Catch...Finally.

Se si utilizza un' Resume istruzione in un punto qualsiasi di una routine di gestione degli errori, si verificherà un
errore.
L' Resume istruzione non può essere utilizzata in nessuna routine che contiene un' Try...Catch...Finally
istruzione.

Esempio
In questo esempio viene utilizzata l' Resume istruzione per terminare la gestione degli errori in una stored
procedure e quindi riprendere l'esecuzione con l'istruzione che ha causato l'errore. Viene generato l'errore
numero 55 per illustrare l'uso dell' Resume istruzione.

Sub ResumeStatementDemo()
On Error GoTo ErrorHandler ' Enable error-handling routine.
Dim x As Integer = 32
Dim y As Integer = 0
Dim z As Integer
z = x / y ' Creates a divide by zero error
Exit Sub ' Exit Sub to avoid error handler.
ErrorHandler: ' Error-handling routine.
Select Case Err.Number ' Evaluate error number.
Case 6 ' "Divide by zero" error.
y = 1 ' Sets the value of y to 1 and tries the calculation again.
Case Else
' Handle other situations here....
End Select
Resume ' Resume execution at same line
' that caused the error.
End Sub

Requisiti
Spazio dei nomi: Microsoft. VisualBasic
Assembly: Libreria di runtime Visual Basic (in Microsoft.VisualBasic.dll)

Vedi anche
Istruzione Try...Catch...Finally
Istruzione Error
Istruzione On Error
Istruzione Return (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Restituisce il controllo al codice che ha chiamato Function una Sub routine,, Get , Set o Operator .

Sintassi
Return
' -or-
Return expression

Parte
expression
Obbligatorio in una Function Get procedura, o Operator . Espressione che rappresenta il valore da restituire
al codice chiamante.

Commenti
In una Sub Set routine o l' Return istruzione è equivalente a un' Exit Sub istruzione o Exit Property e
expression non deve essere fornita.
In una Function Get routine, o Operator , l' Return istruzione deve includere expression e expression deve
restituire un tipo di dati convertibile nel tipo restituito della routine. In una Function Get routine o è inoltre
possibile assegnare un'espressione al nome della stored procedure per fungere da valore restituito e quindi
eseguire un' Exit Function Exit Property istruzione o. In una Operator procedura è necessario utilizzare
Return expression .

È possibile includere tutte Return le istruzioni appropriate nella stessa procedura.

NOTE
Il codice in un Finally blocco viene eseguito dopo Return che un'istruzione in un Try Catch blocco o viene
rilevata, ma prima dell' Return esecuzione dell'istruzione. Un' Return istruzione non può essere inclusa in un Finally
blocco.

Esempio
Nell'esempio seguente l'istruzione viene utilizzata Return più volte per tornare al codice chiamante quando la
procedura non deve eseguire altre operazioni.
Public Function GetAgePhrase(ByVal age As Integer) As String
If age > 60 Then Return "Senior"
If age > 40 Then Return "Middle-aged"
If age > 20 Then Return "Adult"
If age > 12 Then Return "Teen-aged"
If age > 4 Then Return "School-aged"
If age > 1 Then Return "Toddler"
Return "Infant"
End Function

Vedi anche
Istruzione Function
Istruzione Sub
Istruzione Get
Istruzione set
Operator Statement
Property Statement
Istruzione Exit
Istruzione Try...Catch...Finally
Istruzione Select...Case (Visual Basic)
05/03/2021 • 7 minutes to read • Edit Online

Esegue uno dei diversi gruppi di istruzioni, a seconda del valore di un'espressione.

Sintassi
Select [ Case ] testexpression
[ Case expressionlist
[ statements ] ]
[ Case Else
[ elsestatements ] ]
End Select

Parti
T ERM IN E DEF IN IZ IO N E

testexpression Obbligatorio. Espressione. Deve restituire uno dei tipi di dati


elementari ( Boolean , Byte , Char , Date , Double ,
Decimal , Integer , Long , Object , SByte , Short ,
Single , String , UInteger , ULong e UShort ).
T ERM IN E DEF IN IZ IO N E

expressionlist Obbligatorio in un' Case istruzione. Elenco di clausole di


espressione che rappresentano i valori delle corrispondenze
per testexpression . Più clausole Expression sono
separate da virgole. Ogni clausola può assumere uno dei
seguenti formati:

- expression1 To expression2
-[ Is ] espressione comparisonoperator
- espressione

Usare la To parola chiave per specificare i limiti di un


intervallo di valori di corrispondenza per testexpression .
Il valore di expression1 deve essere minore o uguale al
valore di expression2 .

Usare la Is parola chiave con un operatore di confronto (


= , <> , < , <= , > o >= ) per specificare una
restrizione sui valori di corrispondenza per testexpression
. Se la Is parola chiave non viene specificata, viene inserita
automaticamente prima di comparisonoperator.

Il form che specifica solo expression viene considerato


come un caso speciale nel Is formato in cui
comparisonoperator è il segno di uguale ( = ). Questo form
viene valutato come testexpression = expression .

Le espressioni in expressionlist possono essere di


qualsiasi tipo di dati, purché siano convertibili in modo
implicito nel tipo di testexpression e l'oggetto
appropriato comparisonoperator è valido per i due tipi con
cui viene usato.

statements facoltativo. Una o più istruzioni Case che seguono


l'esecuzione se testexpression corrisponde a qualsiasi
clausola in expressionlist .

elsestatements facoltativo. Una o più istruzioni che seguono l' Case Else
esecuzione se testexpression non corrisponde ad alcuna
clausola in expressionlist di una delle Case istruzioni.

End Select Termina la definizione della Select costruzione... Case .

Commenti
Se testexpression corrisponde Case expressionlist a qualsiasi clausola, le istruzioni che seguono tale Case
istruzione vengono eseguite fino alla successiva Case Case Else istruzione, o End Select . Il controllo passa
quindi all'istruzione che segue End Select . Se testexpression corrisponde expressionlist a una clausola in
più di una Case clausola, vengono eseguite solo le istruzioni che seguono la prima corrispondenza.
L' Case Else istruzione viene utilizzata per introdurre l'oggetto elsestatements da eseguire se non viene
trovata alcuna corrispondenza tra testexpression e una expressionlist clausola in nessuna delle altre Case
istruzioni. Sebbene non sia obbligatorio, è consigliabile avere un' Case Else istruzione nella Select Case
costruzione per gestire testexpression i valori imprevisti. Se nessuna Case expressionlist clausola
corrisponde testexpression e non è presente alcuna Case Else istruzione, il controllo passa all'istruzione che
segue End Select .
È possibile utilizzare più espressioni o intervalli in ogni Case clausola. La riga seguente, ad esempio, è valida.
Case 1 To 4, 7 To 9, 11, 13, Is > maxNumber

NOTE
La Is parola chiave usata nelle Case Case Else istruzioni e non è uguale all' operatore is, che viene usato per il
confronto dei riferimenti agli oggetti.

È possibile specificare intervalli e più espressioni per le stringhe di caratteri. Nell'esempio seguente, Case trova
la corrispondenza con qualsiasi stringa esattamente uguale a "mele", ha un valore compreso tra "Nuts" e "soup"
in ordine alfabetico o contiene lo stesso valore del valore corrente di testItem .
Case "apples", "nuts" To "soup", testItem

L'impostazione di Option Compare può influire sui confronti tra stringhe. In Option Compare Text le stringhe
"mele" e "mele" si confrontano come uguali, ma in non lo Option Compare Binary sono.

NOTE
Un' Case istruzione con più clausole può presentare il comportamento noto come corto circuito. Visual Basic valuta le
clausole da sinistra a destra e se una corrisponde a testexpression , le clausole rimanenti non vengono valutate. Il
cortocircuito può migliorare le prestazioni, ma può produrre risultati imprevisti se si prevede che ogni espressione in
expressionlist venga valutata. Per ulteriori informazioni sul corto circuito, vedere espressioni booleane.

Se il codice all'interno di un Case Case Else blocco di istruzioni o non richiede l'esecuzione di altre istruzioni
nel blocco, può uscire dal blocco utilizzando l' Exit Select istruzione. Questa operazione trasferisce
immediatamente il controllo all'istruzione seguente End Select .
Select Case le costruzioni possono essere nidificate. Ogni costruzione annidata Select Case deve avere un'
End Select istruzione corrispondente e deve essere completamente contenuta all'interno di un singolo Case
Case Else blocco di istruzioni o della Select Case costruzione esterna in cui è annidato.

Esempio
Nell'esempio seguente viene utilizzata una Select Case costruzione per scrivere una riga corrispondente al
valore della variabile number . La seconda Case istruzione contiene il valore che corrisponde al valore corrente
di number , quindi viene eseguita l'istruzione che scrive "between 6 and 8 Inclusive".

Dim number As Integer = 8


Select Case number
Case 1 To 5
Debug.WriteLine("Between 1 and 5, inclusive")
' The following is the only Case clause that evaluates to True.
Case 6, 7, 8
Debug.WriteLine("Between 6 and 8, inclusive")
Case 9 To 10
Debug.WriteLine("Equal to 9 or 10")
Case Else
Debug.WriteLine("Not between 1 and 10, inclusive")
End Select

Vedi anche
Choose
Istruzione End
Istruzione If...Then...Else
Istruzione Option Compare
Istruzione Exit
Istruzione Set (Visual Basic)
05/03/2021 • 5 minutes to read • Edit Online

Dichiara una Set routine della proprietà usata per assegnare un valore a una proprietà.

Sintassi
[ <attributelist> ] [ accessmodifier ] Set (ByVal value [ As datatype ])
[ statements ]
End Set

Parti
attributelist
facoltativo. Vedere elenco attributi.
accessmodifier
Facoltativo al massimo una delle Get Set istruzioni e in questa proprietà. Può essere uno dei seguenti:
Protetto
Friend
Privata
Protected Friend

Vedere livelli di accesso in Visual Basic.


value
Obbligatorio. Parametro che contiene il nuovo valore per la proprietà.
datatype
Obbligatorio se Option Strict è On . Tipo di dati del value parametro. Il tipo di dati specificato deve
corrispondere al tipo di dati della proprietà in cui Set è dichiarata questa istruzione.
statements
facoltativo. Una o più istruzioni che vengono eseguite quando Set viene chiamata la routine della proprietà.
End Set
Obbligatorio. Termina la definizione della routine della Set Proprietà.

Commenti
Ogni proprietà deve disporre di una Set routine Property, a meno che la proprietà non sia contrassegnata
come ReadOnly . La Set procedura viene utilizzata per impostare il valore della proprietà.
Visual Basic chiama automaticamente la routine di una proprietà Set quando un'istruzione di assegnazione
fornisce un valore da archiviare nella proprietà.
Visual Basic passa un parametro alla Set routine durante le assegnazioni di proprietà. Se non si specifica un
parametro per Set , il Integrated Development Environment (IDE) utilizza un parametro implicito denominato
value . Il parametro include il valore da assegnare alla proprietà. Questo valore viene in genere archiviato in
una variabile locale privata e restituito ogni volta che Get viene chiamata la stored procedure.
Il corpo della dichiarazione di proprietà può contenere solo le Get routine e della proprietà Set tra l' istruzione
Property e l' End Property istruzione. Non è possibile archiviare un valore diverso da tali procedure. In
particolare, non è possibile archiviare il valore corrente della proprietà. È necessario archiviare questo valore
all'esterno della proprietà, perché se viene archiviato in una delle routine della proprietà, l'altra routine della
proprietà non potrà accedervi. L'approccio usuale consiste nell'archiviare il valore in una variabile privata
dichiarata allo stesso livello della proprietà. È necessario definire una Set routine all'interno della proprietà a
cui si applica.
Set Per impostazione predefinita, la procedura viene impostata sul livello di accesso della proprietà che lo
contiene, a meno che non si utilizzi accessmodifier nell' Set istruzione.

Regole
Livelli di accesso misti. Se si definisce una proprietà di lettura/scrittura, è possibile specificare
facoltativamente un livello di accesso diverso per la Get routine o Set , ma non per entrambi. In tal
caso, il livello di accesso della routine deve essere più restrittivo del livello di accesso della proprietà. Se,
ad esempio, la proprietà è dichiarata Friend , è possibile dichiarare la Set routine Private , ma non
Public .

Se si definisce una WriteOnly proprietà, la Set routine rappresenta l'intera proprietà. Non è possibile
dichiarare un livello di accesso diverso per Set , perché in questo caso verrebbero impostati due livelli di
accesso per la proprietà.

Comportamento
Restituzione da una routine di proprietà. Quando la Set procedura viene restituita al codice
chiamante, l'esecuzione continua seguendo l'istruzione che ha fornito il valore da archiviare.
Set le routine di proprietà possono restituire utilizzando l'istruzione return o l' istruzione Exit.
Le Exit Property Return istruzioni e generano un'uscita immediata da una routine di proprietà.
Qualsiasi numero di Exit Property Return istruzioni e può comparire in qualsiasi punto della procedura
ed è possibile combinare le Exit Property Return istruzioni e.

Esempio
Nell'esempio seguente viene utilizzata l' Set istruzione per impostare il valore di una proprietà.

Class propClass
Private propVal As Integer
Property Prop1() As Integer
Get
Return propVal
End Get
Set(ByVal value As Integer)
propVal = value
End Set
End Property
End Class

Vedi anche
Istruzione Get
Property Statement
Istruzione Sub
Routine Property
Istruzione Stop (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Sospende l'esecuzione.

Sintassi
Stop

Osservazioni
È possibile inserire Stop istruzioni in qualsiasi punto delle procedure per sospendere l'esecuzione. L'utilizzo
dell' Stop istruzione è simile all'impostazione di un punto di interruzione nel codice.
L' Stop istruzione sospende l'esecuzione, ma, a differenza di End , non chiude alcun file né cancella alcuna
variabile, a meno che non venga rilevata in un file eseguibile compilato (exe).

NOTE
Se l' Stop istruzione viene rilevata nel codice in esecuzione all'esterno del Integrated Development Environment (IDE), il
debugger viene richiamato. Questo vale indipendentemente dal fatto che il codice sia stato compilato in modalità debug o
al dettaglio.

Esempio
In questo esempio viene utilizzata l' Stop istruzione per sospendere l'esecuzione per ogni iterazione del
For...Next ciclo.

Dim i As Integer
For i = 1 To 10
Debug.WriteLine(i)
' Stop during each iteration and wait for user to resume.
Stop
Next i

Vedi anche
Istruzione End
Istruzione Structure
05/03/2021 • 10 minutes to read • Edit Online

Dichiara il nome di una struttura e introduce la definizione delle variabili, delle proprietà, degli eventi e delle
procedure incluse nella struttura.

Sintassi
[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ Partial ] _
Structure name [ ( Of typelist ) ]
[ Implements interfacenames ]
[ datamemberdeclarations ]
[ methodmemberdeclarations ]
End Structure

Parti
T ERM IN E DEF IN IZ IO N E

attributelist facoltativo. Vedere elenco attributi.

accessmodifier facoltativo. Può essere uno dei seguenti:

- Pubblico
- Protetto
- Amico
- Privata
- Amico protetto
- Privato protetto

Vedere livelli di accesso in Visual Basic.

Shadows facoltativo. Vedere Shadows.

Partial facoltativo. Indica una definizione parziale della struttura.


Vedere parziale.

name Obbligatorio. Nome della struttura. Vedere Declared Element


Names.

Of facoltativo. Specifica che si tratta di una struttura generica.

typelist Obbligatorio se si usa la parola chiave of . Elenco di


parametri di tipo per questa struttura. Vedere elenco dei tipi.

Implements facoltativo. Indica che questa struttura implementa i membri


di una o più interfacce. Vedere istruzione Implements.

interfacenames Obbligatorio se si usa l' Implements istruzione. Nomi delle


interfacce implementate da questa struttura.
T ERM IN E DEF IN IZ IO N E

datamemberdeclarations Obbligatorio. Zero o più Const Dim istruzioni,, Enum o


che Event dichiarano i membri dati della struttura.

methodmemberdeclarations facoltativo. Zero o più dichiarazioni di Function routine,


Operator , Property o Sub , che vengono utilizzate
come membri del metodo della struttura.

End Structure Obbligatorio. Termina la Structure definizione.

Commenti
L' Structure istruzione definisce un tipo di valore composto che è possibile personalizzare. Una struttura è una
generalizzazione del tipo definito dall'utente (UDT) delle versioni precedenti di Visual Basic. Per altre
informazioni, vedere Structures.
Le strutture supportano molte delle stesse funzionalità delle classi. Ad esempio, le strutture possono avere
proprietà e procedure, possono implementare interfacce e possono avere costruttori con parametri. Tuttavia,
esistono differenze significative tra le strutture e le classi in aree quali ereditarietà, dichiarazioni e utilizzo.
Inoltre, le classi sono tipi di riferimento e le strutture sono tipi di valore. Per altre informazioni, vedere strutture e
classi.
È possibile usare Structure solo a livello di spazio dei nomi o di modulo. Ciò significa che il contesto di
dichiarazione per una struttura deve essere un file di origine, uno spazio dei nomi, una classe, una struttura, un
modulo o un'interfaccia e non può essere una routine o un blocco. Per altre informazioni, vedere Contesti delle
dichiarazioni e livelli di accesso predefiniti.
Per impostazione predefinita, le strutture sono accessi Friend . È possibile modificare i livelli di accesso con i
modificatori di accesso. Per altre informazioni, vedere livelli di accesso in Visual Basic.

Regole
Annidamento. È possibile definire una struttura in un'altra. La struttura esterna viene chiamata struttura
che lo contiene e la struttura interna viene chiamata struttura annidata. Tuttavia, non è possibile accedere
ai membri di una struttura annidata tramite la struttura che lo contiene. È invece necessario dichiarare
una variabile del tipo di dati della struttura nidificata.
Dichiarazione del membro. È necessario dichiarare ogni membro di una struttura. Un membro di
struttura non può essere protetto o Protected Friend perché non può ereditare da una struttura. La
struttura stessa, tuttavia, può essere Protected o Protected Friend .
È possibile dichiarare zero o più variabili non condivise oppure eventi non condivisi o non personalizzati
in una struttura. Non è possibile avere solo costanti, proprietà e procedure, anche se alcune di esse non
sono condivise.
Inizializzazione. Non è possibile inizializzare il valore di un membro dati non condiviso di una struttura
come parte della relativa dichiarazione. È necessario inizializzare tale membro dati tramite un costruttore
con parametri sulla struttura oppure assegnare un valore al membro dopo aver creato un'istanza della
struttura.
Ereditarietà. Una struttura non può ereditare da un tipo diverso ValueType da, da cui ereditano tutte le
strutture. In particolare, una struttura non può ereditare da un'altra.
Non è possibile usare l' istruzione Inherits in una definizione di struttura, neanche per specificare
ValueType .
Implementazione. Se la struttura usa l' istruzione Implements, è necessario implementare ogni
membro definito da ogni interfaccia specificata in interfacenames .
Proprietà predefinita. Una struttura può specificare al massimo una proprietà come proprietà
predefinita, usando il modificatore predefinito . Per ulteriori informazioni, vedere default.

Comportamento
Livello di accesso. All'interno di una struttura, è possibile dichiarare ogni membro con il proprio livello
di accesso. Per impostazione predefinita, tutti i membri della struttura sono con accesso pubblico . Si noti
che se la struttura ha un livello di accesso più limitato, questo limita automaticamente l'accesso ai relativi
membri, anche se si modificano i livelli di accesso con i modificatori di accesso.
Ambito. Una struttura è nell'ambito di tutti gli spazi dei nomi, la classe, la struttura o il modulo che lo
contiene.
L'ambito di ogni membro della struttura è l'intera struttura.
Vita. Una struttura non ha una durata. Ogni istanza di tale struttura ha invece una durata indipendente
da tutte le altre istanze.
Il ciclo di vita di un'istanza inizia quando viene creato da una nuova clausola di operatore . Termina
quando termina la durata della variabile che lo include.
Non è possibile estendere la durata di un'istanza della struttura. Un modulo fornisce un'approssimazione
alla funzionalità della struttura statica. Per ulteriori informazioni, vedere istruzione Module.
I membri della struttura hanno durate a seconda della modalità e della posizione in cui vengono
dichiarati. Per ulteriori informazioni, vedere "Lifetime" nell' istruzione Class.
Qualificazione. Il codice esterno a una struttura deve qualificare il nome di un membro con il nome
della struttura.
Se il codice all'interno di una struttura annidata crea un riferimento non qualificato a un elemento di
programmazione, Visual Basic cerca prima l'elemento nella struttura nidificata, quindi nella struttura che
lo contiene e così via fino all'elemento contenitore più esterno. Per altre informazioni, vedere References
to Declared Elements.
Consumo di memoria. Come per tutti i tipi di dati compositi, non è possibile calcolare in modo sicuro il
consumo di memoria totale di una struttura aggiungendo le allocazioni di archiviazione nominale dei
relativi membri. Inoltre, non è possibile presupporre in modo sicuro che l'ordine di archiviazione in
memoria sia uguale all'ordine di dichiarazione. Se è necessario controllare il layout di archiviazione di
una struttura, è possibile applicare l' StructLayoutAttribute attributo all' Structure istruzione.

Esempio
Nell'esempio seguente viene utilizzata l' Structure istruzione per definire un set di dati correlati per un
dipendente. Mostra l'uso dei Public membri, Friend e Private per riflettere la riservatezza degli elementi di
dati. Vengono inoltre illustrati i membri della procedura, della proprietà e dell'evento.
Public Structure employee
' Public members, accessible from throughout declaration region.
Public firstName As String
Public middleName As String
Public lastName As String
' Friend members, accessible from anywhere within the same assembly.
Friend employeeNumber As Integer
Friend workPhone As Long
' Private members, accessible only from within the structure itself.
Private homePhone As Long
Private level As Integer
Private salary As Double
Private bonus As Double
' Procedure member, which can access structure's private members.
Friend Sub CalculateBonus(ByVal rate As Single)
bonus = salary * CDbl(rate)
End Sub
' Property member to return employee's eligibility.
Friend ReadOnly Property Eligible() As Boolean
Get
Return level >= 25
End Get
End Property
' Event member, raised when business phone number has changed.
Public Event ChangedWorkPhone(ByVal newPhone As Long)
End Structure

Per altre informazioni su come usare Structure i, vedere variabile di struttura.

Vedi anche
Istruzione Class
Istruzione Interface
Istruzione Module
Istruzione Dim
Istruzione Const
Istruzione Enum
Istruzione Event
Operator Statement
Property Statement
Strutture e classi
Istruzione Sub (Visual Basic)
05/03/2021 • 12 minutes to read • Edit Online

Dichiara il nome, i parametri e il codice che definiscono una Sub routine.

Sintassi
[ <attributelist> ] [ Partial ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ] [ Async ]
Sub name [ (Of typeparamlist) ] [ (parameterlist) ] [ Implements implementslist | Handles eventlist ]
[ statements ]
[ Exit Sub ]
[ statements ]
End Sub

Parti
attributelist

facoltativo. Vedere elenco attributi.


Partial

facoltativo. Indica la definizione di un metodo parziale. Vedere metodi parziali.


accessmodifier

facoltativo. Può essere uno dei seguenti:


Pubblica
Protetto
Friend
Privata
Protected Friend
Privato protetto
Vedere livelli di accesso in Visual Basic.
proceduremodifiers

facoltativo. Può essere uno dei seguenti:


Overload
Override
Overridable
NotOverridable
MustOverride
MustOverride Overrides
NotOverridable Overrides

Shared

facoltativo. Vedere Shared.


Shadows

facoltativo. Vedere Shadows.


Async

facoltativo. Vedere Async.


name

Obbligatorio. Nome della procedura. Vedere Declared Element Names. Per creare una routine del
costruttore per una classe, impostare il nome di una Sub stored procedure sulla New parola chiave. Per
altre informazioni, vedere durata degli oggetti: come creare ed eliminare definitivamente oggetti.
typeparamlist

facoltativo. Elenco di parametri di tipo per una routine generica. Vedere elenco dei tipi.
parameterlist

facoltativo. Elenco di nomi di variabili locali che rappresentano i parametri di questa procedura. Vedere
elenco di parametri.
Implements

facoltativo. Indica che questa procedura implementa una o più Sub procedure, ognuna delle quali è
definita in un'interfaccia implementata dalla classe o dalla struttura contenitore di questa procedura.
Vedere istruzione Implements.
implementslist

Necessario se si fornisce Implements . Elenco delle routine Sub implementate.


implementedprocedure [ , implementedprocedure ... ]

Ogni implementedprocedure presenta la sintassi e le parti seguenti:


interface.definedname

PA RT E DESC RIZ IO N E

interface Obbligatorio. Nome di un'interfaccia implementata dalla


classe o dalla struttura contenitore di questa procedura.

definedname Obbligatorio. Nome mediante il quale la routine viene


definita in interface .

Handles

facoltativo. Indica che questa procedura può gestire uno o più eventi specifici. Vedere handle.
eventlist

Necessario se si fornisce Handles . Elenco di eventi gestiti da questa procedura.


eventspecifier [ , eventspecifier ... ]
Ogni eventspecifier presenta la sintassi e le parti seguenti:
eventvariable.event

PA RT E DESC RIZ IO N E

eventvariable Obbligatorio. Variabile oggetto dichiarata con il tipo di


dati della classe o della struttura che genera l'evento.

event Obbligatorio. Nome dell'evento gestito da questa


procedura.

statements

facoltativo. Blocco di istruzioni da eseguire all'interno di questa procedura.


End Sub

Termina la definizione di questa procedura.

Commenti
Tutto il codice eseguibile deve trovarsi all'interno di una routine. Utilizzare una Sub stored procedure quando
non si desidera restituire un valore al codice chiamante. Utilizzare una Function procedura quando si desidera
restituire un valore.

Definizione di una routine Sub


È possibile definire una Sub procedura solo a livello di modulo. Il contesto di dichiarazione per una routine Sub
deve pertanto essere una classe, una struttura, un modulo o un'interfaccia e non può essere un file di origine,
uno spazio dei nomi, una procedura o un blocco. Per altre informazioni, vedere Contesti delle dichiarazioni e
livelli di accesso predefiniti.
Sub per impostazione predefinita, le procedure sono con accesso pubblico. È possibile modificare i livelli di
accesso usando i modificatori di accesso.
Se la routine usa la Implements parola chiave, la classe o la struttura contenitore deve avere un' Implements
istruzione che segue immediatamente la relativa Class Structure istruzione o. L' Implements istruzione deve
includere ogni interfaccia specificata in implementslist . Tuttavia, il nome con cui un'interfaccia definisce Sub
(in definedname ) non deve corrispondere al nome di questa procedura (in name ).

Restituzione da una routine Sub


Quando una Sub procedura viene restituita al codice chiamante, l'esecuzione continua con l'istruzione
successiva all'istruzione che lo ha chiamato.
Nell'esempio seguente viene illustrato un ritorno da una Sub routine.

Sub mySub(ByVal q As String)


Return
End Sub

Le Exit Sub Return istruzioni e generano un'uscita immediata da una Sub routine. Qualsiasi numero di
Exit Sub Return istruzioni e può comparire in qualsiasi punto della procedura ed è possibile combinare le
Exit Sub Return istruzioni e.
Chiamata a una procedura secondaria
Per chiamare una Sub stored procedure, utilizzare il nome della stored procedure in un'istruzione e quindi
seguire tale nome con l'elenco di argomenti racchiuso tra parentesi. È possibile omettere le parentesi solo se
non si forniscono argomenti. Tuttavia, il codice è più leggibile se si includono sempre le parentesi.
Una Sub routine e una Function procedura possono avere parametri ed eseguire una serie di istruzioni.
Tuttavia, una Function routine restituisce un valore e una Sub procedura non lo è. Pertanto, non è possibile
utilizzare una Sub stored procedure in un'espressione.
È possibile utilizzare la Call parola chiave quando si chiama una Sub routine, ma tale parola chiave non è
consigliata per la maggior parte degli utilizzi. Per ulteriori informazioni, vedere istruzione Call.
Visual Basic a volte riorganizza le espressioni aritmetiche per aumentare l'efficienza interna. Per questo motivo,
se nell'elenco di argomenti sono incluse espressioni che chiamano altre routine, non è necessario presupporre
che tali espressioni verranno richiamate in un ordine particolare.

Procedure secondarie asincrone


Utilizzando la funzionalità asincrona, è possibile richiamare funzioni asincrone senza utilizzare callback espliciti o
suddividere manualmente il codice tra più funzioni o espressioni lambda.
Se si contrassegna una routine con il modificatore Async , è possibile usare l'operatore await nella procedura.
Quando il controllo raggiunge un' Await espressione nella Async routine, il controllo torna al chiamante e lo
stato di avanzamento della procedura viene sospeso fino al completamento dell'attività attesa. Al termine
dell'attività, l'esecuzione può riprendere nella procedura.

NOTE
Una Async routine viene restituita al chiamante quando viene rilevato il primo oggetto atteso che non è ancora
completo o viene raggiunta la fine della Async procedura, a seconda di quale si verifica per primo.

È anche possibile contrassegnare un' istruzione di funzione con il Async modificatore. Una Async funzione può
avere un tipo restituito di Task<TResult> o Task . Un esempio più avanti in questo argomento illustra una Async
funzione con tipo restituito Task<TResult> .
Async``Sub le stored procedure vengono utilizzate principalmente per i gestori eventi, in cui non è possibile
restituire un valore. Una Async Sub routine non può essere attesa e il chiamante di una Async Sub stored
procedure non può intercettare le eccezioni Sub generate dalla procedura.
Una Async routine non può dichiarare parametri ByRef .
Per altre informazioni sulle Async procedure, vedere programmazione asincrona con Async e await, flusso di
controllo in programmi asincronie tipi restituiti asincroni.

Esempio
Nell'esempio seguente viene utilizzata l' Sub istruzione per definire il nome, i parametri e il codice che formano
il corpo di una Sub routine.
Sub ComputeArea(ByVal length As Double, ByVal width As Double)
' Declare local variable.
Dim area As Double
If length = 0 Or width = 0 Then
' If either argument = 0 then exit Sub immediately.
Exit Sub
End If
' Calculate area of rectangle.
area = length * width
' Print area to Immediate window.
Debug.WriteLine(area)
End Sub

Esempio
Nell'esempio seguente DelayAsync è un oggetto Async Function che ha un tipo restituito Task<TResult> .
DelayAsync ha un'istruzione Return che restituisce un numero intero. La dichiarazione di funzione di
DelayAsync deve pertanto avere un tipo restituito di Task(Of Integer) . Poiché il tipo restituito è
Task(Of Integer) , la valutazione dell' Await espressione in DoSomethingAsync produce un Integer, come
illustrato nell'istruzione seguente: Dim result As Integer = Await delayTask .
La startButton_Click procedura è un esempio di Async Sub procedura. Poiché DoSomethingAsync è una Async
funzione, l'attività per la chiamata a DoSomethingAsync deve essere attesa, come illustrato nell'istruzione
seguente: Await DoSomethingAsync() . La startButton_Click Sub procedura deve essere definita con il Async
modificatore perché contiene un' Await espressione.

' Imports System.Diagnostics


' Imports System.Threading.Tasks

' This Click event is marked with the Async modifier.


Private Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.Click
Await DoSomethingAsync()
End Sub

Private Async Function DoSomethingAsync() As Task


Dim delayTask As Task(Of Integer) = DelayAsync()
Dim result As Integer = Await delayTask

' The previous two statements may be combined into


' the following statement.
' Dim result As Integer = Await DelayAsync()

Debug.WriteLine("Result: " & result)


End Function

Private Async Function DelayAsync() As Task(Of Integer)


Await Task.Delay(100)
Return 5
End Function

' Output:
' Result: 5

Vedi anche
Istruzione Implements
Istruzione Function
Elenco parametri
Istruzione Dim
Istruzione Call
Di
Matrici di parametri
Procedura: Usare una classe generica
Risoluzione dei problemi relativi alle routine
Metodi parziali
Istruzione SyncLock
05/03/2021 • 9 minutes to read • Edit Online

Acquisisce un blocco esclusivo per un blocco di istruzioni prima di eseguire il blocco.

Sintassi
SyncLock lockobject
[ block ]
End SyncLock

Parti
lockobject
Obbligatorio. Espressione che restituisce un riferimento a un oggetto.
block
facoltativo. Blocco di istruzioni da eseguire quando viene acquisito il blocco.
End SyncLock
Termina un SyncLock blocco.

Commenti
L' SyncLock istruzione garantisce che più thread non eseguano contemporaneamente il blocco di istruzioni.
SyncLock impedisce l'immissione del blocco da parte di ogni thread finché nessun altro thread lo esegue.
L'uso più comune di SyncLock è quello di proteggere i dati dall'aggiornamento simultaneo di più di un thread.
Se le istruzioni che modificano i dati devono andare al completamento senza interruzioni, inserirle all'interno di
un SyncLock blocco.
Un blocco di istruzioni protetto da un blocco esclusivo viene talvolta definito sezione critica.

Regole
Diramazione. Non è possibile eseguire il branching in un SyncLock blocco dall'esterno del blocco.
Valore dell'oggetto Lock. Il valore di lockobject non può essere Nothing . È necessario creare l'oggetto
Lock prima di utilizzarlo in un' SyncLock istruzione.
Non è possibile modificare il valore di lockobject durante l'esecuzione di un SyncLock blocco. Il
meccanismo richiede che l'oggetto Lock rimanga invariato.
Non è possibile usare l'operatore await in un SyncLock blocco.

Comportamento
Meccanismo. Quando un thread raggiunge l' SyncLock istruzione, valuta l' lockobject espressione e
sospende l'esecuzione fino a quando non acquisisce un blocco esclusivo sull'oggetto restituito
dall'espressione. Quando un altro thread raggiunge l' SyncLock istruzione, non acquisisce un blocco fino
a quando il primo thread non esegue l' End SyncLock istruzione.
Dati protetti. Se lockobject è una Shared variabile, il blocco esclusivo impedisce a un thread in qualsiasi
istanza della classe di eseguire il SyncLock blocco mentre un altro thread lo esegue. Questa operazione
protegge i dati condivisi tra tutte le istanze.
Se lockobject è una variabile di istanza (non Shared ), il blocco impedisce a un thread in esecuzione
nell'istanza corrente di eseguire il SyncLock blocco contemporaneamente a un altro thread nella stessa
istanza. Ciò consente di proteggere i dati gestiti dalla singola istanza.
Acquisizione e rilascio. Un SyncLock blocco si comporta come una Try...Finally costruzione in cui il
Try blocco acquisisce un blocco esclusivo su lockobject e il blocco lo Finally rilascia. Per questo
motivo, il SyncLock blocco garantisce il rilascio del blocco, indipendentemente dal modo in cui si esce dal
blocco. Questo vale anche nel caso di un'eccezione non gestita.
Chiamate del Framework. Il SyncLock blocco acquisisce e rilascia il blocco esclusivo chiamando i Enter
metodi e Exit della Monitor classe nello System.Threading spazio dei nomi.

Procedure di programmazione
L' lockobject espressione deve sempre restituire un oggetto che appartiene esclusivamente alla classe. È
necessario dichiarare una Private variabile oggetto per proteggere i dati appartenenti all'istanza corrente o
una Private Shared variabile oggetto per proteggere i dati comuni a tutte le istanze.
Non utilizzare la Me parola chiave per fornire un oggetto Lock per i dati dell'istanza. Se il codice esterno alla
classe dispone di un riferimento a un'istanza della classe, può utilizzare tale riferimento come oggetto Lock per
un SyncLock blocco completamente diverso da quello dell'utente, proteggendo i dati diversi. In questo modo, la
classe e l'altra classe potrebbero bloccarsi reciprocamente dall'esecuzione dei blocchi non correlati SyncLock .
Analogamente, il blocco su una stringa può essere problematico perché qualsiasi altro codice nel processo che
utilizza la stessa stringa condividerà lo stesso blocco.
Non è inoltre consigliabile utilizzare il Me.GetType metodo per fornire un oggetto Lock per i dati condivisi.
Questo perché GetType restituisce sempre lo stesso Type oggetto per un nome di classe specificato. Il codice
esterno può chiamare GetType sulla classe e ottenere lo stesso oggetto di blocco in uso. In questo modo le due
classi si bloccano tra loro i SyncLock blocchi.

Esempi
Descrizione
Nell'esempio seguente viene illustrata una classe che gestisce un semplice elenco di messaggi. Include i
messaggi in una matrice e l'ultimo elemento usato della matrice in una variabile. La addAnotherMessage
procedura incrementa l'ultimo elemento e archivia il nuovo messaggio. Queste due operazioni sono protette
dalle SyncLock istruzioni e End SyncLock , perché una volta che l'ultimo elemento è stato incrementato, il nuovo
messaggio deve essere archiviato prima che qualsiasi altro thread possa incrementare nuovamente l'ultimo
elemento.
Se la classe condivide un elenco di messaggi tra tutte le relative istanze, le variabili
simpleMessageList
messagesList e messagesLast verrebbero dichiarate come Shared . In questo caso, la variabile messagesLock
deve anche essere Shared , in modo che sia presente un singolo oggetto Lock usato da ogni istanza.
Codice
Class simpleMessageList
Public messagesList() As String = New String(50) {}
Public messagesLast As Integer = -1
Private messagesLock As New Object
Public Sub addAnotherMessage(ByVal newMessage As String)
SyncLock messagesLock
messagesLast += 1
If messagesLast < messagesList.Length Then
messagesList(messagesLast) = newMessage
End If
End SyncLock
End Sub
End Class

Descrizione
Nell'esempio seguente vengono usati i thread e SyncLock . Finché l' SyncLock istruzione è presente, il blocco di
istruzioni è una sezione critica e balance mai diventa un numero negativo. È possibile impostare come
commento SyncLock le End SyncLock istruzioni e per vedere l'effetto dell'uscita dalla SyncLock parola chiave.
Codice
Imports System.Threading

Module Module1

Class Account
Dim thisLock As New Object
Dim balance As Integer

Dim r As New Random()

Public Sub New(ByVal initial As Integer)


balance = initial
End Sub

Public Function Withdraw(ByVal amount As Integer) As Integer


' This condition will never be true unless the SyncLock statement
' is commented out:
If balance < 0 Then
Throw New Exception("Negative Balance")
End If

' Comment out the SyncLock and End SyncLock lines to see
' the effect of leaving out the SyncLock keyword.
SyncLock thisLock
If balance >= amount Then
Console.WriteLine("Balance before Withdrawal : " & balance)
Console.WriteLine("Amount to Withdraw : -" & amount)
balance = balance - amount
Console.WriteLine("Balance after Withdrawal : " & balance)
Return amount
Else
' Transaction rejected.
Return 0
End If
End SyncLock
End Function

Public Sub DoTransactions()


For i As Integer = 0 To 99
Withdraw(r.Next(1, 100))
Next
End Sub
End Class

Sub Main()
Dim threads(10) As Thread
Dim acc As New Account(1000)

For i As Integer = 0 To 9
Dim t As New Thread(New ThreadStart(AddressOf acc.DoTransactions))
threads(i) = t
Next

For i As Integer = 0 To 9
threads(i).Start()
Next
End Sub

End Module

Commenti

Vedi anche
System.Threading.Monitor
System.Threading.Interlocked
Panoramica delle primitive di sincronizzazione
Istruzione Then
05/03/2021 • 2 minutes to read • Edit Online

Introduce un blocco di istruzioni da compilare o eseguire se una condizione testata è true.

Commenti
È possibile usare la parola chiave Then nei contesti seguenti:
#If... Quindi... #Else direttiva
Istruzione If...Then...Else

Vedi anche
Parole chiave
Istruzione Throw (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Genera un'eccezione all'interno di una routine.

Sintassi
Throw [ expression ]

Parte
expression
Fornisce informazioni sull'eccezione da generare. Facoltativo quando si trova in un' Catch istruzione, in caso
contrario obbligatorio.

Commenti
L' Throw istruzione genera un'eccezione che può essere gestita con codice di gestione delle eccezioni strutturato
( Try ... Catch ... Finally ) o codice di gestione delle eccezioni non strutturato ( On Error GoTo ). È possibile
usare l' Throw istruzione per intercettare gli errori all'interno del codice perché Visual Basic sposta lo stack di
chiamate fino a trovare il codice di gestione delle eccezioni appropriato.
Un'istruzione Throw senza espressione può essere utilizzata solo in un' Catch istruzione, nel qual caso
l'istruzione genera nuovamente l'eccezione attualmente gestita dall' Catch istruzione.
L' Throw istruzione Reimposta lo stack di chiamate per l' expression eccezione. Se expression non viene
specificato, lo stack di chiamate viene lasciato invariato. È possibile accedere allo stack di chiamate per
l'eccezione tramite la StackTrace Proprietà.

Esempio
Nel codice seguente viene utilizzata l' Throw istruzione per generare un'eccezione:

' Throws a new exception.


Throw New System.Exception("An exception has occurred.")

Vedi anche
Istruzione Try...Catch...Finally
Istruzione On Error
Istruzione Try...Catch...Finally (Visual Basic)
02/11/2020 • 23 minutes to read • Edit Online

Consente di gestire alcuni o tutti i possibili errori che possono verificarsi in un blocco di codice specifico, mentre
è ancora in esecuzione il codice.

Sintassi
Try
[ tryStatements ]
[ Exit Try ]
[ Catch [ exception [ As type ] ] [ When expression ]
[ catchStatements ]
[ Exit Try ] ]
[ Catch ... ]
[ Finally
[ finallyStatements ] ]
End Try

Parti
T ERM IN E DEF IN IZ IO N E

tryStatements Facoltativa. Istruzioni in cui può verificarsi un errore. Può


essere un'istruzione composta.

Catch Facoltativa. Sono Catch consentiti più blocchi. Se si verifica


un'eccezione durante l'elaborazione del Try blocco, ogni
Catch istruzione viene esaminata in ordine testuale per
determinare se gestisce l'eccezione, con exception la
rappresentazione dell'eccezione generata.

exception Facoltativa. Qualsiasi nome di variabile. Il valore iniziale di


exception corrisponde al valore dell'errore generato.
Utilizzato con Catch per specificare l'errore rilevato. Se
omesso, l' Catch istruzione rileva qualsiasi eccezione.

type Facoltativa. Specifica il tipo di filtro di classe. Se il valore di


exception è del tipo specificato da type o di un tipo
derivato, l'identificatore viene associato all'oggetto Exception.

When Facoltativa. Un' Catch istruzione con una When clausola


intercetta le eccezioni solo quando expression restituisce
True . Una When clausola viene applicata solo dopo avere
verificato il tipo di eccezione e expression può fare
riferimento all'identificatore che rappresenta l'eccezione.
T ERM IN E DEF IN IZ IO N E

expression Facoltativa. Deve essere convertibile in modo implicito in


Boolean . Qualsiasi espressione che descrive un filtro
generico. Usato in genere per filtrare in base al numero di
errore. Usato con When la parola chiave per specificare le
circostanze in cui viene rilevato l'errore.

catchStatements Facoltativa. Istruzioni per gestire gli errori che si verificano


nel blocco associato Try . Può essere un'istruzione
composta.

Exit Try Facoltativa. Parola chiave che si interrompe dalla


Try...Catch...Finally struttura. L'esecuzione riprende
con il codice immediatamente successivo all' End Try
istruzione. L' Finally istruzione verrà comunque eseguita.
Non consentito nei Finally blocchi.

Finally Facoltativa. Un Finally blocco viene sempre eseguito


quando l'esecuzione lascia una parte dell' Try...Catch
istruzione.

finallyStatements Facoltativa. Istruzioni che vengono eseguite dopo


l'elaborazione di tutti gli altri errori.

End Try Termina la Try...Catch...Finally struttura.

Commenti
Se si prevede che una particolare eccezione possa verificarsi durante una particolare sezione di codice, inserire il
codice in un Try blocco e usare un Catch blocco per mantenere il controllo e gestire l'eccezione, se si verifica.
Un' Try…Catch istruzione è costituita Try da un blocco seguito da una o più Catch clausole, che specificano i
gestori per varie eccezioni. Quando viene generata un'eccezione in un Try blocco, Visual Basic cerca l' Catch
istruzione che gestisce l'eccezione. Se Catch non viene trovata alcuna istruzione corrispondente, Visual Basic
esamina il metodo che ha chiamato il metodo corrente e così via fino allo stack di chiamate. Se non Catch viene
trovato alcun blocco, Visual Basic Visualizza un messaggio di eccezione non gestita per l'utente e interrompe
l'esecuzione del programma.
In un'istruzione è possibile utilizzare più di un' Catch istruzione Try…Catch . In tal caso, l'ordine delle Catch
clausole è significativo perché vengono esaminate in ordine. Intercettare le eccezioni più specifiche prima di
quelle meno specifiche.
Le Catch condizioni dell'istruzione seguenti sono le meno specifiche e intercettano tutte le eccezioni che
derivano dalla Exception classe. In genere, è consigliabile usare una di queste varianti come ultimo Catch
blocco nella Try...Catch...Finally struttura, dopo avere intercettato tutte le eccezioni specifiche previste. Il
flusso di controllo non può mai raggiungere un Catch blocco che segue una di queste varianti.
type È Exception , ad esempio: Catch ex As Exception

L'istruzione non ha alcuna exception variabile, ad esempio: Catch


Quando un' Try…Catch…Finally istruzione è annidata in un altro Try blocco, Visual Basic esamina prima ogni
Catch istruzione nel blocco più interno Try . Se non Catch viene trovata alcuna istruzione corrispondente, la
ricerca procede alle Catch istruzioni del Try…Catch…Finally blocco esterno.
Le variabili locali di un Try blocco non sono disponibili in un Catch blocco perché sono blocchi separati. Se si
desidera utilizzare una variabile in più di un blocco, dichiarare la variabile all'esterno della
Try...Catch...Finally struttura.

TIP
L' Try…Catch…Finally istruzione è disponibile come frammento di codice IntelliSense. In Gestione frammenti di codice
espandere modelli di codice-if, for each, tr y catch, Proper ty e così via , quindi gestione degli errori (eccezioni) .
Per altre informazioni, vedere Code Snippets (Frammenti di codice).

Blocco finally
Se si dispone di una o più istruzioni che devono essere eseguite prima di uscire dalla Try struttura, utilizzare un
Finally blocco. Il controllo passa al Finally blocco immediatamente prima che venga passato all'esterno della
Try…Catch struttura. Questo vale anche se si verifica un'eccezione in qualsiasi punto all'interno della Try
struttura.
Un Finally blocco è utile per l'esecuzione di codice che deve essere eseguito anche se si verifica un'eccezione.
Il controllo viene passato al Finally blocco indipendentemente dal modo in cui il Try...Catch blocco viene
chiuso.
Il codice in un Finally blocco viene eseguito anche se il codice rileva un' Return istruzione in un Try blocco o
Catch . Il controllo non passa da un Try Catch blocco o al blocco corrispondente Finally nei casi seguenti:

Nel blocco o viene rilevata un' istruzione End Try Catch .


StackOverflowExceptionViene generata un'eccezione nel Try Catch blocco o.
Non è possibile trasferire in modo esplicito l'esecuzione in un Finally blocco. Il trasferimento dell'esecuzione
da un Finally blocco non è valido, ad eccezione di un'eccezione.
Se un' Try istruzione non contiene almeno un Catch blocco, deve contenere un Finally blocco.

TIP
Se non è necessario intercettare eccezioni specifiche, l' Using istruzione si comporta come un Try…Finally blocco e
garantisce l'eliminazione delle risorse, indipendentemente dalla modalità di uscita dal blocco. Questo vale anche con
un'eccezione non gestita. Per ulteriori informazioni, vedere istruzione using.

Argomento Exception
L' Catch exception argomento Block è un'istanza della Exception classe o una classe che deriva dalla
Exception classe. L' Exception istanza della classe corrisponde all'errore che si è verificato nel Try blocco.
Le proprietà dell' Exception oggetto consentono di identificare la ragione e la posizione di un'eccezione. Ad
esempio, la StackTrace proprietà elenca i metodi chiamati che hanno generato l'eccezione, consentendo di
individuare la posizione in cui si è verificato l'errore nel codice. MessageRestituisce un messaggio che descrive
l'eccezione. HelpLinkRestituisce un collegamento a un file della Guida associato. InnerExceptionRestituisce l'
Exception oggetto che ha causato l'eccezione corrente oppure restituisce Nothing se non è presente alcun
oggetto originale Exception .

Considerazioni sull'utilizzo di un try... Istruzione catch


Utilizzare un' Try…Catch istruzione solo per segnalare l'occorrenza di eventi di programma insoliti o imprevisti.
Di seguito sono riportati alcuni motivi:
Il rilevamento delle eccezioni in fase di esecuzione comporta un sovraccarico aggiuntivo ed è
probabilmente più lento rispetto al controllo preliminare per evitare eccezioni.
Se un Catch blocco non viene gestito correttamente, l'eccezione potrebbe non essere segnalata
correttamente agli utenti.
La gestione delle eccezioni rende un programma più complesso.
Non è sempre necessaria un' Try…Catch istruzione per verificare la presenza di una condizione che potrebbe
verificarsi. Nell'esempio seguente viene verificata l'esistenza di un file prima di tentare di aprirlo. In questo
modo si riduce la necessità di intercettare un'eccezione generata dal OpenText metodo.

Private Sub TextFileExample(ByVal filePath As String)

' Verify that the file exists.


If System.IO.File.Exists(filePath) = False Then
Console.Write("File Not Found: " & filePath)
Else
' Open the text file and display its contents.
Dim sr As System.IO.StreamReader =
System.IO.File.OpenText(filePath)

Console.Write(sr.ReadToEnd)

sr.Close()
End If
End Sub

Verificare che il codice in Catch blocchi possa segnalare correttamente le eccezioni agli utenti, sia tramite la
registrazione thread-safe che i messaggi appropriati. In caso contrario, le eccezioni potrebbero rimanere
sconosciute.

Metodi asincroni
Se si contrassegna un metodo con il modificatore Async , è possibile usare l'operatore await nel metodo.
Un'istruzione con l' Await operatore sospende l'esecuzione del metodo fino al completamento dell'attività
attesa. L'attività rappresenta il lavoro attualmente in fase di esecuzione. Quando l'attività associata all' Await
operatore termina, l'esecuzione riprende nello stesso metodo. Per altre informazioni, vedere flusso di controllo
in programmi asincroni.
Un'attività restituita da un metodo asincrono può terminare con uno stato di errore, a indicare che è stata
completata a causa di un'eccezione non gestita. Un'attività può inoltre terminare con uno stato annullato, il che
comporta la generazione OperationCanceledException di un'eccezione dall'espressione await. Per intercettare
entrambi i tipi di eccezione, inserire l' Await espressione associata all'attività in un Try blocco e intercettare
l'eccezione nel Catch blocco. Un esempio è disponibile più avanti in questo argomento.
Un'attività può essere in uno stato di errore perché più eccezioni erano responsabili dell'errore. Ad esempio,
l'attività può essere il risultato di una chiamata a Task.WhenAll. Quando si attende tale attività, l'eccezione
rilevata è solo una delle eccezioni e non è possibile prevedere quale eccezione verrà rilevata. Un esempio è
disponibile più avanti in questo argomento.
Un' Await espressione non può trovarsi all'interno di un Catch blocco o di un Finally blocco.

Iterators
Una funzione o una funzione di accesso iteratore Get esegue un'iterazione personalizzata su una raccolta. Un
iteratore usa un'istruzione yield per restituire ogni elemento della raccolta uno alla volta. Si chiama una funzione
iteratore usando un per ogni... Istruzione successiva.
Un' Yield istruzione può trovarsi all'interno di un Try blocco. Un Try blocco che contiene un' Yield
istruzione può contenere Catch blocchi e può avere un Finally blocco. Per un esempio, vedere la sezione
"blocchi try in Visual Basic" degli iteratori .
Un' Yield istruzione non può trovarsi all'interno di un Catch blocco o di un Finally blocco.
Se il For Each corpo (all'esterno della funzione iteratore) genera un'eccezione, un Catch blocco nella funzione
iteratore non viene eseguito, ma Finally viene eseguito un blocco nella funzione iteratore. Un Catch blocco
all'interno di una funzione iteratore intercetta solo le eccezioni che si verificano all'interno della funzione
iteratore.

Situazioni di attendibilità parziale


In situazioni di attendibilità parziale, ad esempio un'applicazione ospitata in una condivisione di rete, non
Try...Catch...Finally rileva le eccezioni di sicurezza che si verificano prima che venga richiamato il metodo
che contiene la chiamata. Nell'esempio seguente, quando lo si inserisce in una condivisione server e si esegue
da questa posizione, viene generato l'errore "System. Security. SecurityException: request failed". Per ulteriori
informazioni sulle eccezioni di sicurezza, vedere la SecurityException classe.

Try
Process.Start("http://www.microsoft.com")
Catch ex As Exception
MsgBox("Can't load Web page" & vbCrLf & ex.Message)
End Try

In una situazione di attendibilità parziale, è necessario inserire l' Process.Start istruzione in un oggetto
separato Sub . La chiamata iniziale a Sub avrà esito negativo. In questo modo, è possibile Try...Catch
intercettarlo prima Sub che venga avviato l'oggetto che contiene Process.Start e l'eccezione di sicurezza
prodotta.

Esempi
Struttura di try... Rileva... Infine
Nell'esempio seguente viene illustrata la struttura dell' Try...Catch...Finally istruzione.
Public Sub TryExample()
' Declare variables.
Dim x As Integer = 5
Dim y As Integer = 0

' Set up structured error handling.


Try
' Cause a "Divide by Zero" exception.
x = x \ y

' This statement does not execute because program


' control passes to the Catch block when the
' exception occurs.
MessageBox.Show("end of Try block")
Catch ex As Exception
' Show the exception's message.
MessageBox.Show(ex.Message)

' Show the stack trace, which is a list of methods


' that are currently executing.
MessageBox.Show("Stack Trace: " & vbCrLf & ex.StackTrace)
Finally
' This line executes whether or not the exception occurs.
MessageBox.Show("in Finally block")
End Try
End Sub

Eccezione in un metodo chiamato da un blocco try


Nell'esempio seguente, il CreateException metodo genera un'eccezione NullReferenceException . Il codice che
genera l'eccezione non si trova in un Try blocco. Pertanto, il CreateException metodo non gestisce l'eccezione.
Il RunSample metodo gestisce l'eccezione perché la chiamata al CreateException metodo si trova in un Try
blocco.
Nell'esempio sono incluse Catch istruzioni per diversi tipi di eccezioni, ordinate dal più specifico al più
generale.

Public Sub RunSample()


Try
CreateException()
Catch ex As System.IO.IOException
' Code that reacts to IOException.
Catch ex As NullReferenceException
MessageBox.Show("NullReferenceException: " & ex.Message)
MessageBox.Show("Stack Trace: " & vbCrLf & ex.StackTrace)
Catch ex As Exception
' Code that reacts to any other exception.
End Try
End Sub

Private Sub CreateException()


' This code throws a NullReferenceException.
Dim obj = Nothing
Dim prop = obj.Name

' This code also throws a NullReferenceException.


'Throw New NullReferenceException("Something happened.")
End Sub

Istruzione catch when


Nell'esempio seguente viene illustrato come utilizzare un' Catch When istruzione per filtrare in un'espressione
condizionale. Se l'espressione condizionale restituisce True , viene eseguito il codice nel Catch blocco.
Private Sub WhenExample()
Dim i As Integer = 5

Try
Throw New ArgumentException()
Catch e As OverflowException When i = 5
Console.WriteLine("First handler")
Catch e As ArgumentException When i = 4
Console.WriteLine("Second handler")
Catch When i = 5
Console.WriteLine("Third handler")
End Try
End Sub
' Output: Third handler

Istruzioni try nidificate


Nell'esempio seguente è Try…Catch presente un'istruzione contenuta in un Try blocco. Il Catch blocco interno
genera un'eccezione la cui InnerException proprietà è impostata sull'eccezione originale. Il Catch blocco
esterno segnala la propria eccezione e l'eccezione interna.

Private Sub InnerExceptionExample()


Try
Try
' Set a reference to a StringBuilder.
' The exception below does not occur if the commented
' out statement is used instead.
Dim sb As System.Text.StringBuilder
'Dim sb As New System.Text.StringBuilder

' Cause a NullReferenceException.


sb.Append("text")
Catch ex As Exception
' Throw a new exception that has the inner exception
' set to the original exception.
Throw New ApplicationException("Something happened :(", ex)
End Try
Catch ex2 As Exception
' Show the exception.
Console.WriteLine("Exception: " & ex2.Message)
Console.WriteLine(ex2.StackTrace)

' Show the inner exception, if one is present.


If ex2.InnerException IsNot Nothing Then
Console.WriteLine("Inner Exception: " & ex2.InnerException.Message)
Console.WriteLine(ex2.StackTrace)
End If
End Try
End Sub

Gestione delle eccezioni per i metodi asincroni


L'esempio seguente illustra la gestione delle eccezioni per i metodi asincroni. Per intercettare un'eccezione che si
applica a un'attività asincrona, l' Await espressione si trova in un Try blocco del chiamante e l'eccezione viene
rilevata nel Catch blocco.
Rimuovere il commento dalla riga Throw New Exception nell'esempio per illustrare la gestione delle eccezioni.
L'eccezione viene rilevata nel Catch blocco, la proprietà dell'attività IsFaulted viene impostata su True e la
proprietà dell'attività Exception.InnerException viene impostata sull'eccezione.
Rimuovere il commento dalla riga Throw New OperationCancelledException per illustrare cosa accade quando si
annulla un processo asincrono. L'eccezione viene rilevata nel Catch blocco e la proprietà dell'attività
IsCanceled viene impostata su True . Tuttavia, in alcune condizioni che non si applicano a questo esempio,
IsFaulted è impostato su True e IsCanceled è impostato su False .

Public Async Function DoSomethingAsync() As Task


Dim theTask As Task(Of String) = DelayAsync()

Try
Dim result As String = Await theTask
Debug.WriteLine("Result: " & result)
Catch ex As Exception
Debug.WriteLine("Exception Message: " & ex.Message)
End Try

Debug.WriteLine("Task IsCanceled: " & theTask.IsCanceled)


Debug.WriteLine("Task IsFaulted: " & theTask.IsFaulted)
If theTask.Exception IsNot Nothing Then
Debug.WriteLine("Task Exception Message: " &
theTask.Exception.Message)
Debug.WriteLine("Task Inner Exception Message: " &
theTask.Exception.InnerException.Message)
End If
End Function

Private Async Function DelayAsync() As Task(Of String)


Await Task.Delay(100)

' Uncomment each of the following lines to


' demonstrate exception handling.

'Throw New OperationCanceledException("canceled")


'Throw New Exception("Something happened.")
Return "Done"
End Function

' Output when no exception is thrown in the awaited method:


' Result: Done
' Task IsCanceled: False
' Task IsFaulted: False

' Output when an Exception is thrown in the awaited method:


' Exception Message: Something happened.
' Task IsCanceled: False
' Task IsFaulted: True
' Task Exception Message: One or more errors occurred.
' Task Inner Exception Message: Something happened.

' Output when an OperationCanceledException or TaskCanceledException


' is thrown in the awaited method:
' Exception Message: canceled
' Task IsCanceled: True
' Task IsFaulted: False

Gestione di più eccezioni nei metodi asincroni


Il seguente esempio illustra la gestione delle eccezioni dove più attività possono restituire più eccezioni. Il Try
blocco include l' Await espressione per l'attività Task.WhenAll restituita. L'attività viene completata quando
vengono completate le tre attività a cui Task.WhenAll viene applicato.
Ognuna delle tre attività genera un'eccezione. Il Catch blocco scorre le eccezioni presenti nella
Exception.InnerExceptions proprietà dell'attività Task.WhenAll restituita.
Public Async Function DoMultipleAsync() As Task
Dim theTask1 As Task = ExcAsync(info:="First Task")
Dim theTask2 As Task = ExcAsync(info:="Second Task")
Dim theTask3 As Task = ExcAsync(info:="Third Task")

Dim allTasks As Task = Task.WhenAll(theTask1, theTask2, theTask3)

Try
Await allTasks
Catch ex As Exception
Debug.WriteLine("Exception: " & ex.Message)
Debug.WriteLine("Task IsFaulted: " & allTasks.IsFaulted)
For Each inEx In allTasks.Exception.InnerExceptions
Debug.WriteLine("Task Inner Exception: " + inEx.Message)
Next
End Try
End Function

Private Async Function ExcAsync(info As String) As Task


Await Task.Delay(100)

Throw New Exception("Error-" & info)


End Function

' Output:
' Exception: Error-First Task
' Task IsFaulted: True
' Task Inner Exception: Error-First Task
' Task Inner Exception: Error-Second Task
' Task Inner Exception: Error-Third Task

Vedere anche
Err
Exception
Istruzione Exit
Istruzione On Error
Procedure consigliate per l'uso dei frammenti di codice
Gestione delle eccezioni
Istruzione throw
Istruzione Using (Visual Basic)
05/03/2021 • 8 minutes to read • Edit Online

Dichiara l'inizio di un Using blocco e, facoltativamente, acquisisce le risorse di sistema controllate dal blocco.

Sintassi
Using { resourcelist | resourceexpression }
[ statements ]
End Using

Parti
T ERM IN E DEF IN IZ IO N E

resourcelist Obbligatorio se non si specifica resourceexpression .


Elenco di una o più risorse di sistema che questo Using
blocco controlla, separate da virgole.

resourceexpression Obbligatorio se non si specifica resourcelist . Variabile di


riferimento o espressione che fa riferimento a una risorsa di
sistema che deve essere controllata da questo Using
blocco.

statements facoltativo. Blocco di istruzioni eseguite dal Using blocco.

End Using Obbligatorio. Termina la definizione del Using blocco ed


Elimina tutte le risorse che controlla.

Ogni risorsa della resourcelist parte presenta la sintassi e le parti seguenti:


resourcename As New resourcetype [ ( [ arglist ] ) ]

-oppure-
resourcename As resourcetype = resourceexpression

Parti Resources
T ERM IN E DEF IN IZ IO N E

resourcename Obbligatorio. Variabile di riferimento che fa riferimento a una


risorsa di sistema controllata dal Using blocco.

New Obbligatorio se l' Using istruzione acquisisce la risorsa. Se


la risorsa è già stata acquisita, utilizzare la seconda
alternativa della sintassi.

resourcetype Obbligatorio. Classe della risorsa. La classe deve


implementare l' IDisposable interfaccia.
T ERM IN E DEF IN IZ IO N E

arglist facoltativo. Elenco di argomenti passati al costruttore per


creare un'istanza di resourcetype . Vedere elenco di
parametri.

resourceexpression Obbligatorio. Variabile o espressione che fa riferimento a una


risorsa di sistema che soddisfa i requisiti di resourcetype .
Se si usa la seconda sintassi alternativa, è necessario
acquisire la risorsa prima di passare il controllo all' Using
istruzione.

Commenti
A volte il codice richiede una risorsa non gestita, ad esempio un handle di file, un wrapper COM o una
connessione SQL. Un Using blocco garantisce l'eliminazione di una o più risorse di questo tipo al termine del
codice. In modo da renderli disponibili per l'utilizzo da altro codice.
Le risorse gestite vengono eliminate dal .NET Framework Garbage Collector (GC) senza alcuna codifica
aggiuntiva da parte dell'utente. Non è necessario un Using blocco per le risorse gestite. Tuttavia, è comunque
possibile usare un Using blocco per forzare l'eliminazione di una risorsa gestita anziché attendere il Garbage
Collector.
Un Using blocco è costituito da tre parti: acquisizione, utilizzo e eliminazione.
L' acquisizione significa creare una variabile e inizializzarla per fare riferimento alla risorsa di sistema. L'
Using istruzione può acquisire una o più risorse oppure è possibile acquisire esattamente una risorsa
prima di immettere il blocco e fornirla all' Using istruzione. Se si specifica resourceexpression , è
necessario acquisire la risorsa prima di passare il controllo all' Using istruzione.
L' utilizzo indica l'accesso alle risorse e l'esecuzione di azioni con loro. Le istruzioni tra Using e
End Using rappresentano l'utilizzo delle risorse.

Per eliminazione si intende la chiamata al Dispose metodo sull'oggetto in resourcename . Questo


consente all'oggetto di terminare in modo corretto le risorse. L' End Using istruzione Elimina le risorse
sotto il Using controllo del blocco.

Comportamento
Un Using blocco si comporta come una Try costruzione... Finally in cui il Try blocco USA le risorse e il
Finally blocco ne comporta l'eliminazione. Per questo motivo, il Using blocco garantisce l'eliminazione delle
risorse, indipendentemente dal modo in cui si esce dal blocco. Questo vale anche nel caso di un'eccezione non
gestita, ad eccezione di StackOverflowException .
L'ambito di ogni variabile di risorsa acquisita dall' Using istruzione è limitato al Using blocco.
Se nell'istruzione si specifica più di una risorsa di sistema Using , l'effetto sarà identico a quello di un blocco
annidato in Using un altro.
Se resourcename è Nothing , non viene effettuata alcuna chiamata a Dispose e non viene generata alcuna
eccezione.

Gestione strutturata delle eccezioni in un blocco using


Se è necessario gestire un'eccezione che può verificarsi all'interno del Using blocco, è possibile aggiungervi
una costruzione completa.. Try .. Finally Se è necessario gestire il caso in cui l' Using istruzione non riesce
ad acquisire una risorsa, è possibile verificare se resourcename è Nothing .

Gestione strutturata delle eccezioni anziché un blocco using


Se è necessario un controllo più preciso sull'acquisizione delle risorse o se è necessario codice aggiuntivo nel
Finally blocco, è possibile riscrivere il Using blocco come costruzione. Try .. Finally . Nell'esempio
seguente vengono illustrati scheletri Try e Using costruzioni equivalenti nell'acquisizione e nell'eliminazione
di resource .

Using resource As New resourceType


' Insert code to work with resource.
End Using

' For the acquisition and disposal of resource, the following


' Try construction is equivalent to the Using block.
Dim resource As New resourceType
Try
' Insert code to work with resource.
Finally
If resource IsNot Nothing Then
resource.Dispose()
End If
End Try

NOTE
Il codice all'interno del Using blocco non deve assegnare l'oggetto in resourcename a un'altra variabile. Quando si esce
dal Using blocco, la risorsa viene eliminata e l'altra variabile non può accedere alla risorsa a cui fa riferimento.

Esempio
Nell'esempio seguente viene creato un file denominato log.txt e vengono scritte due righe di testo nel file.
Nell'esempio viene inoltre letto lo stesso file e vengono visualizzate le righe di testo:
Poiché le TextWriter TextReader classi e implementano l' IDisposable interfaccia, il codice può utilizzare le Using
istruzioni per garantire che il file venga chiuso correttamente dopo le operazioni di scrittura e lettura.

Private Sub WriteFile()


Using writer As System.IO.TextWriter = System.IO.File.CreateText("log.txt")
writer.WriteLine("This is line one.")
writer.WriteLine("This is line two.")
End Using
End Sub

Private Sub ReadFile()


Using reader As System.IO.TextReader = System.IO.File.OpenText("log.txt")
Dim line As String

line = reader.ReadLine()
Do Until line Is Nothing
Console.WriteLine(line)
line = reader.ReadLine()
Loop
End Using
End Sub
Vedi anche
IDisposable
Istruzione Try...Catch...Finally
Procedura: eliminare una risorsa di sistema
Istruzione While...End While (Visual Basic)
05/03/2021 • 6 minutes to read • Edit Online

Esegue una serie di istruzioni purché una determinata condizione sia True .

Sintassi
While condition
[ statements ]
[ Continue While ]
[ statements ]
[ Exit While ]
[ statements ]
End While

Parti
T ERM IN E DEF IN IZ IO N E

condition Obbligatorio. Espressione Boolean . Se condition è


Nothing , Visual Basic lo considera come False .

statements facoltativo. Una o più istruzioni While che seguono, che


vengono eseguite ogni volta condition è True .

Continue While facoltativo. Trasferisce il controllo all'iterazione successiva del


While blocco.

Exit While facoltativo. Trasferisce il controllo all'esterno del While


blocco.

End While Obbligatorio. Termina la definizione del blocco While .

Commenti
Utilizzare una While...End While struttura quando si desidera ripetere un set di istruzioni per un numero
indefinito di volte, purché rimanga una condizione True . Se si desidera maggiore flessibilità con la posizione in
cui si testa la condizione o il risultato per il test, è preferibile eseguire... Istruzione Loop. Se si desidera ripetere le
istruzioni impostando il numero di volte, per... L'istruzione successiva è in genere una scelta migliore.

NOTE
La While parola chiave viene usata anche nel. .. Istruzione Loop, clausola Skip While e clausola Take While.

Se condition è True , tutto l' statements esecuzione fino a quando non End While viene rilevata l'istruzione. Il
controllo viene quindi restituito all' While istruzione e condition viene di nuovo controllata. Se condition è
ancora True , il processo viene ripetuto. Se è False , il controllo passa all'istruzione che segue l' End While
istruzione.
L' While istruzione controlla sempre la condizione prima di avviare il ciclo. Il ciclo continua finché la condizione
rimane True . Se condition è False la prima volta che si immette il ciclo, non viene eseguito neanche una
volta.
Il condition risultato è in genere dovuto a un confronto di due valori, ma può essere qualsiasi espressione che
restituisce un valore di tipo di dati booleano ( True o False ). Questa espressione può includere un valore di
un altro tipo di dati, ad esempio un tipo numerico, che è stato convertito in Boolean .
È possibile annidare i While cicli inserendo un ciclo all'interno di un altro. È anche possibile annidare diversi tipi
di strutture di controllo tra loro. Per altre informazioni, vedere strutture di controlli annidati.

Esci da
L'istruzione Exit While può fornire un altro modo per uscire da un While ciclo. Exit While trasferisce
immediatamente il controllo all'istruzione che segue l' End While istruzione.
In genere si usa Exit While dopo la valutazione di una determinata condizione, ad esempio in una
If...Then...Else struttura. Potrebbe essere necessario uscire da un ciclo se viene rilevata una condizione che
rende superfluo o Impossibile continuare l'iterazione, ad esempio un valore errato o una richiesta di
terminazione. È possibile usare Exit While quando si esegue il test di una condizione che può causare un ciclo
infinito, ovvero un ciclo che può eseguire un numero di volte molto grande o addirittura infinito. È quindi
possibile usare Exit While per eseguire l'escape del ciclo.
È possibile inserire un numero qualsiasi di Exit While istruzioni in qualsiasi punto del While ciclo.
Quando viene utilizzato all'interno While di cicli annidati, Exit While trasferisce il controllo al di fuori del ciclo
più interno e al successivo livello di nidificazione.
L' Continue While istruzione trasferisce immediatamente il controllo all'iterazione successiva del ciclo. Per
ulteriori informazioni, vedere istruzione continue.

Esempio
Nell'esempio seguente, le istruzioni del ciclo continuano a essere eseguite fino a quando la index variabile non
è maggiore di 10.

Dim index As Integer = 0


While index <= 10
Debug.Write(index.ToString & " ")
index += 1
End While

Debug.WriteLine("")
' Output: 0 1 2 3 4 5 6 7 8 9 10

Esempio
Nell'esempio seguente viene illustrato l'utilizzo delle Continue While istruzioni e Exit While .
Dim index As Integer = 0
While index < 100000
index += 1

' If index is between 5 and 7, continue


' with the next iteration.
If index >= 5 And index <= 8 Then
Continue While
End If

' Display the index.


Debug.Write(index.ToString & " ")

' If index is 10, exit the loop.


If index = 10 Then
Exit While
End If
End While

Debug.WriteLine("")
' Output: 1 2 3 4 9 10

Esempio
Nell'esempio seguente vengono lette tutte le righe in un file di testo. Il OpenText metodo apre il file e restituisce
un oggetto StreamReader che legge i caratteri. Nella While condizione, il Peek metodo di StreamReader
determina se il file contiene caratteri aggiuntivi.

Private Sub ShowText(ByVal textFilePath As String)


If System.IO.File.Exists(textFilePath) = False Then
Debug.WriteLine("File Not Found: " & textFilePath)
Else
Dim sr As System.IO.StreamReader = System.IO.File.OpenText(textFilePath)

While sr.Peek() >= 0


Debug.WriteLine(sr.ReadLine())
End While

sr.Close()
End If
End Sub

Vedi anche
Strutture di ciclo
Istruzione Do...Loop
Istruzione For...Next
Tipo di dati Boolean
Strutture di controllo annidate
Istruzione Exit
Istruzione Continue
Istruzione With...End With (Visual Basic)
05/03/2021 • 7 minutes to read • Edit Online

Esegue una serie di istruzioni che fanno riferimento più volte a un singolo oggetto o struttura in modo da poter
utilizzare una sintassi semplificata per le istruzioni quando si accede ai membri dell'oggetto o della struttura.
Quando si utilizza una struttura, è possibile leggere solo i valori dei membri o i metodi invoke e ottenere un
errore se si tenta di assegnare valori ai membri di una struttura utilizzata in un'istruzione With...End With .

Sintassi
With objectExpression
[ statements ]
End With

Parti
T ERM IN E DEF IN IZ IO N E

objectExpression Obbligatorio. Espressione che restituisce un oggetto.


L'espressione può essere arbitrariamente complessa ed
essere valutata solo una volta. Può restituire qualsiasi tipo di
dati, compresi i tipi di base.

statements facoltativo. Una o più istruzioni tra With e End With che
possono fare riferimento ai membri di un oggetto che verrà
prodotto dalla valutazione di objectExpression .

End With Obbligatorio. Termina la definizione del blocco With .

Commenti
Utilizzando With...End With , è possibile eseguire una serie di istruzioni in un oggetto specificato senza
specificare il nome dell'oggetto più volte. All'interno di un blocco di istruzioni With , è possibile specificare un
membro dell'oggetto che inizia con un punto, come se l'oggetto dell'istruzione With lo precedesse.
Per modificare più proprietà in un singolo oggetto, ad esempio, è possibile inserire le istruzioni di assegnazione
delle proprietà all'interno del blocco With...End With , facendo riferimento all'oggetto una sola volta anziché
una volta per assegnazione di proprietà.
Se il codice accede allo stesso oggetto in più istruzioni, utilizzando l'istruzione di With si ottengono i vantaggi
seguenti:
Non è necessario valutare più volte un'espressione complessa o assegnare il risultato a una variabile
temporanea per fare riferimento ai membri più volte.
È possibile rendere il codice più leggibile eliminando le espressioni di qualificazione ripetitive.
Il tipo di dati objectExpression può essere qualsiasi tipo di classe o struttura o anche un tipo elementare di
Visual Basic come Integer . Se objectExpression restituisce qualcosa di diverso da un oggetto, è possibile
leggere solo i valori dei membri o i metodi invoke e ottenere un errore se si tenta di assegnare valori ai membri
di una struttura utilizzata in un'istruzione With...End With . Si tratta dello stesso errore che si otterrebbe se viene
richiamato un metodo che restituisce una struttura e immediatamente si accede e si assegna un valore a un
membro del risultato della funzione, come GetAPoint().x = 1 . Il problema in entrambi i casi è che la struttura
esiste solo nello stack di chiamate e in nessun caso un membro di una struttura modificata in tali situazioni può
scrivere in una posizione in modo che altro codice del programma può osservare la modifica.
objectExpression viene valutato una volta, all'ingresso nel blocco. Non è possibile riassegnare
objectExpression dall'interno del blocco With .
Dal blocco With , è possibile accedere ai metodi e alle proprietà del solo oggetto specificato senza qualifica.
Metodi e proprietà di altri oggetti possono essere utilizzati ma è necessario qualificarli con i relativi nomi di
oggetto.
È possibile inserire un'istruzione With...End With in un'altra. Le istruzioni With...End With annidate possono
creare confusione se gli oggetti a cui si fa riferimento non sono chiari dal contesto. È necessario fornire un
riferimento completo a un oggetto che si trova in un blocco With esterno quando si fa riferimento all'oggetto
dal un blocco With interno.
Non è consentita la creazione di rami in un'istruzione With dall'esterno del blocco.
A meno che il blocco non contenga un ciclo, le istruzioni vengono eseguite una sola volta. È possibile annidare
tipi diversi di strutture di controllo. Per altre informazioni, vedere strutture di controlli annidati.

NOTE
È possibile utilizzare la parola chiave With anche negli inizializzatori di oggetto. Per ulteriori informazioni ed esempi,
vedere inizializzatori di oggetto: tipi denominati e anonimi e tipi anonimi.
Se si utilizza un blocco With solo per inizializzare le proprietà o i campi di un oggetto di cui è stata appena creata
un'istanza, è possibile utilizzare un inizializzatore di oggetto.

Esempio
Nell'esempio riportato di seguito, ogni blocco With esegue una serie di istruzioni su un singolo oggetto.

Private Sub AddCustomer()


Dim theCustomer As New Customer

With theCustomer
.Name = "Coho Vineyard"
.URL = "http://www.cohovineyard.com/"
.City = "Redmond"
End With

With theCustomer.Comments
.Add("First comment.")
.Add("Second comment.")
End With
End Sub

Public Class Customer


Public Property Name As String
Public Property City As String
Public Property URL As String

Public Property Comments As New List(Of String)


End Class
Esempio
Nell'esempio seguente vengono annidate le istruzioni With…End With . Nell'istruzione With annidata, la sintassi
fa riferimento all'oggetto interno.

Dim theWindow As New EntryWindow

With theWindow
With .InfoLabel
.Content = "This is a message."
.Foreground = Brushes.DarkSeaGreen
.Background = Brushes.LightYellow
End With

.Title = "The Form Title"


.Show()
End With

Vedi anche
List<T>
Strutture di controllo annidate
Inizializzatori di oggetto: tipi denominati e tipi anonimi
Tipi anonimi
Istruzione Yield (Visual Basic)
05/03/2021 • 7 minutes to read • Edit Online

Invia l'elemento successivo di una raccolta a un' For Each...Next istruzione.

Sintassi
Yield expression

Parametri
T ERM IN E DEF IN IZ IO N E

expression Obbligatorio. Espressione convertibile in modo implicito nel


tipo della funzione iteratore o della funzione di Get accesso
che contiene l' Yield istruzione.

Commenti
L' Yield istruzione restituisce un elemento di una raccolta alla volta. L' Yield istruzione è inclusa in una
funzione o una funzione di accesso iteratore Get che esegue iterazioni personalizzate su una raccolta.
Si utilizza una funzione iteratore utilizzando un per ogni... Istruzione successiva o query LINQ. Ogni iterazione
del For Each ciclo chiama la funzione iteratore. Quando viene Yield raggiunta un'istruzione nella funzione
iteratore, expression viene restituito e viene mantenuta la posizione corrente nel codice. L'esecuzione viene
riavviata a partire da quella posizione la volta successiva che viene chiamata la funzione iteratore.
Deve esistere una conversione implicita dal tipo di expression nell' Yield istruzione al tipo restituito
dell'iteratore.
È possibile utilizzare un' Exit Function Return istruzione o per terminare l'iterazione.
"Yield" non è una parola riservata e ha un significato speciale solo quando viene usato in una Iterator
funzione o una funzione di Get accesso.
Per ulteriori informazioni sulle funzioni e sulle funzioni di accesso iteratori Get , vedere iteratori.

Funzioni iteratori e funzioni di accesso get


La dichiarazione di una funzione o di una funzione di accesso iteratore Get deve soddisfare i requisiti seguenti:
Deve includere un modificatore iteratore .
Il tipo restituito deve essere IEnumerable, IEnumerable<T>, IEnumerator o IEnumerator<T>.
Non può avere ByRef parametri.
Una funzione iteratore non può verificarsi in un evento, in un costruttore di istanza, in un costruttore statico o in
un distruttore statico.
Una funzione iteratore può essere una funzione anonima. Per ulteriori informazioni, vedere iteratori.
Gestione delle eccezioni
Un' Yield istruzione può trovarsi all'interno Try di un blocco di un try... Rileva... Istruzione finally. Un Try
blocco con un' Yield istruzione può contenere Catch blocchi e può avere un Finally blocco.
Un' Yield istruzione non può trovarsi all'interno di un Catch blocco o di un Finally blocco.
Se il For Each corpo (all'esterno della funzione iteratore) genera un'eccezione, un Catch blocco nella funzione
iteratore non viene eseguito, ma Finally viene eseguito un blocco nella funzione iteratore. Un Catch blocco
all'interno di una funzione iteratore intercetta solo le eccezioni che si verificano all'interno della funzione
iteratore.

Implementazione tecnica
Il codice seguente restituisce un oggetto IEnumerable (Of String) da una funzione iteratore e quindi scorre gli
elementi dell'oggetto IEnumerable (Of String) .

Dim elements As IEnumerable(Of String) = MyIteratorFunction()



For Each element As String In elements
Next

La chiamata a MyIteratorFunction non esegue il corpo della funzione. La chiamata restituisce invece
IEnumerable(Of String) nella variabile elements .
In un'iterazione del ciclo For Each , il metodo MoveNext viene chiamato per elements . Questa chiamata esegue
il corpo di MyIteratorFunction fino a quando non viene raggiunta l'istruzione Yield successiva. L' Yield
istruzione restituisce un'espressione che determina non solo il valore della element variabile per l'utilizzo da
parte del corpo del ciclo, ma anche la Current proprietà degli elementi, ovvero un oggetto
IEnumerable (Of String) .

In ogni iterazione successiva del ciclo For Each , l'esecuzione del corpo dell'iteratore continua da dove è stata
interrotta, fermandosi ancora quando raggiunge un'istruzione Yield . Il For Each ciclo viene completato
quando viene raggiunta la fine della funzione iteratore o un' Return Exit Function istruzione o.

Esempio
Nell'esempio seguente è presente un' Yield istruzione che si trova all'interno di un oggetto per... Ciclo
successivo . Ogni iterazione del corpo dell'istruzione for each in Main Crea una chiamata alla Power funzione
iteratore. Ogni chiamata alla funzione iteratore procede fino alla prossima esecuzione dell'istruzione Yield , che
si verifica durante l'iterazione successiva del ciclo For…Next .
Il tipo restituito del metodo iteratore è IEnumerable<T> , un tipo di interfaccia iteratore. Quando il metodo
iteratore viene chiamato, restituisce un oggetto enumerabile che contiene le potenze di un numero.
Sub Main()
For Each number In Power(2, 8)
Console.Write(number & " ")
Next
' Output: 2 4 8 16 32 64 128 256
Console.ReadKey()
End Sub

Private Iterator Function Power(


ByVal base As Integer, ByVal highExponent As Integer) _
As System.Collections.Generic.IEnumerable(Of Integer)

Dim result = 1

For counter = 1 To highExponent


result = result * base
Yield result
Next
End Function

Esempio
Nell'esempio seguente viene illustrata una funzione di accesso Get che è un iteratore. La dichiarazione di
proprietà include un Iterator modificatore.

Sub Main()
Dim theGalaxies As New Galaxies
For Each theGalaxy In theGalaxies.NextGalaxy
With theGalaxy
Console.WriteLine(.Name & " " & .MegaLightYears)
End With
Next
Console.ReadKey()
End Sub

Public Class Galaxies


Public ReadOnly Iterator Property NextGalaxy _
As System.Collections.Generic.IEnumerable(Of Galaxy)
Get
Yield New Galaxy With {.Name = "Tadpole", .MegaLightYears = 400}
Yield New Galaxy With {.Name = "Pinwheel", .MegaLightYears = 25}
Yield New Galaxy With {.Name = "Milky Way", .MegaLightYears = 0}
Yield New Galaxy With {.Name = "Andromeda", .MegaLightYears = 3}
End Get
End Property
End Class

Public Class Galaxy


Public Property Name As String
Public Property MegaLightYears As Integer
End Class

Per altri esempi, vedere iteratori.

Vedi anche
Istruzioni
Clausole (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Negli argomenti di questa sezione sono Visual Basic le clausole di Runtime.

Contenuto della sezione


Alias
Come
Selettori
Implementazioni
In
In
Di

Sezioni correlate
Riferimenti al linguaggio Visual Basic
Clausola Alias (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Indica che una routine esterna ha un altro nome nella relativa DLL.

Commenti
La Alias parola chiave può essere usata in questo contesto:
Declare Statement
Nell'esempio seguente Alias viene usata la parola chiave per specificare il nome della funzione in advapi32.dll,
GetUserNameA , che getUserName viene usata al posto di in questo esempio. getUserName La funzione viene
chiamata in Sub getUser , che Visualizza il nome dell'utente corrente.

Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (


ByVal lpBuffer As String, ByRef nSize As Integer) As Integer
Sub GetUser()
Dim buffer As String = New String(CChar(" "), 25)
Dim retVal As Integer = GetUserName(buffer, 25)
Dim userName As String = Strings.Left(buffer, InStr(buffer, Chr(0)) - 1)
MsgBox(userName)
End Sub

Vedi anche
Parole chiave
Clausola As (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Introduce una As clausola che identifica un tipo di dati in un'istruzione di dichiarazione o un elenco di vincoli in
un parametro di tipo generico.

Commenti
È possibile usare la parola chiave As nei contesti seguenti:
Aggregate Clause
Istruzione Class
Istruzione Const
Declare Statement
Istruzione Delegate
Istruzione Dim
Istruzione Enum
Istruzione Event
Per... Istruzioni successive
Per ogni... Istruzioni successive
Clausola from
Istruzione Function
Clausola Group Join
Istruzione Interface
Operator Statement
Property Statement
Istruzione Structure
Istruzione Sub
Prova... Rileva... Finally (istruzioni)

Vedi anche
Procedura: creare una nuova variabile
Tipi di dati
Dichiarazione di variabile
Type List
Generic Types in Visual Basic
Parole chiave
Clausola Handles (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Dichiara che una routine gestisce un evento specificato.

Sintassi
proceduredeclaration Handles eventlist

Parti
proceduredeclaration
Dichiarazione Sub per la routine che gestirà l'evento.
eventlist
Elenco degli eventi che devono essere gestiti da proceduredeclaration . Gli eventi devono essere generati dalla
classe base per la classe corrente o da un oggetto dichiarato usando la parola chiave WithEvents .

Commenti
Usare la parola chiave Handles alla fine di una dichiarazione di routine per fare in modo che la routine gestisca
eventi generati da una variabile oggetto dichiarata con la parola chiave WithEvents . La parola chiave Handles
può anche essere usata in una classe derivata per gestire eventi da una classe base.
La parola chiave Handles e l'istruzione AddHandler consentono entrambe di specificare che quelle particolari
routine gestiscono particolari eventi, ma esistono alcune differenze. Usare la parola chiave Handles quando si
definisce una routine, per specificare che questa gestisce un particolare evento. L'istruzione AddHandler
connette le routine agli eventi in fase di esecuzione. Per ulteriori informazioni, vedere l' istruzione AddHandler.
Per gli eventi personalizzati, l'applicazione richiama la funzione di accesso AddHandler dell'evento quando
aggiunge la routine come gestore eventi. Per ulteriori informazioni sugli eventi personalizzati, vedere istruzione
Event.

Esempio
Public Class ContainerClass
' Module or class level declaration.
WithEvents Obj As New Class1

Public Class Class1


' Declare an event.
Public Event Ev_Event()
Sub CauseSomeEvent()
' Raise an event.
RaiseEvent Ev_Event()
End Sub
End Class

Sub EventHandler() Handles Obj.Ev_Event


' Handle the event.
MsgBox("EventHandler caught event.")
End Sub

' Call the TestEvents procedure from an instance of the ContainerClass


' class to test the Ev_Event event and the event handler.
Public Sub TestEvents()
Obj.CauseSomeEvent()
End Sub
End Class

L'esempio seguente illustra come una classe derivata può usare l'istruzione Handles per gestire un evento da
una classe base.

Public Class BaseClass


' Declare an event.
Event Ev1()
End Class
Class DerivedClass
Inherits BaseClass
Sub TestEvents() Handles MyBase.Ev1
' Add code to handle this event.
End Sub
End Class

Esempio
Nell'esempio seguente sono contenuti due gestori di eventi Button per un progetto di applicazione WPF .

Private Sub Button1_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles


Button1.Click
MessageBox.Show(sender.Name & " clicked")
End Sub

Private Sub Button2_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles


Button2.Click
MessageBox.Show(sender.Name & " clicked")
End Sub

Esempio
L'esempio che segue equivale a quello precedente. L'oggetto eventlist nella clausola Handles contiene gli
eventi per entrambi i pulsanti.
Private Sub Button_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles
Button1.Click, Button2.Click
MessageBox.Show(sender.Name & " clicked")
End Sub

Vedi anche
WithEvents
Istruzione AddHandler
Istruzione RemoveHandler
Istruzione Event
Istruzione RaiseEvent
Eventi
Clausola Implements (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Indica che un membro di classe o di struttura fornisce l'implementazione per un membro definito in
un'interfaccia.

Commenti
La Implements parola chiave non corrisponde all' istruzione Implements. Usare l' Implements istruzione per
specificare che una classe o una struttura implementa una o più interfacce, quindi per ogni membro si usa la
Implements parola chiave per specificare l'interfaccia e il membro che implementa.

Se una classe o una struttura implementa un'interfaccia, deve includere l' Implements istruzione
immediatamente dopo l'istruzione di classe o di strutturae deve implementare tutti i membri definiti
dall'interfaccia.

Reimplementazione
In una classe derivata, è possibile reimplementare un membro di interfaccia che la classe base ha già
implementato. Questa operazione è diversa rispetto all'override del membro della classe base nei seguenti
aspetti:
Non è necessario che il membro della classe base sia sottoponibile a override per essere reimplementato.
È possibile reimplementare il membro con un nome diverso.
La Implements parola chiave può essere utilizzata nei contesti seguenti:
Istruzione Event
Istruzione Function
Property Statement
Istruzione Sub

Vedi anche
Istruzione Implements
Istruzione Interface
Istruzione Class
Istruzione Structure
Clausola In (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica il gruppo che deve essere attraversato dalla variabile di ciclo in un For Each ciclo oppure specifica la
raccolta per eseguire una query in From una Join clausola, o Group Join .

Commenti
La In parola chiave può essere utilizzata nei contesti seguenti:
Istruzione For Each...Next
Clausola from
Clausola join
Clausola Group Join

Vedi anche
Parole chiave
Clausola Into (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Identifica le funzioni di aggregazione o i raggruppamenti da applicare a una raccolta.

Commenti
La Each parola chiave viene usata nei contesti seguenti:
Aggregate Clause
Clausola Group by
Clausola Group Join

Vedi anche
Parole chiave
Clausola Of (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Introduce una Of clausola che identifica un parametro di tipo in una classe, una struttura, un'interfaccia, un
delegato o una routine generica . Per informazioni sui tipi generici, vedere tipi generici in Visual Basic.

Utilizzo della parola chiave of


Nell'esempio di codice seguente viene usata la Of parola chiave per definire il contorno di una classe che
accetta due parametri di tipo. Vincola il keyType parametro dall' IComparable interfaccia, il che significa che il
codice consumer deve fornire un argomento di tipo che implementi IComparable . Questa operazione è
necessaria in modo che la add procedura possa chiamare il IComparable.CompareTo metodo. Per altre
informazioni sui vincoli, vedere Type List.

Public Class Dictionary(Of entryType, keyType As IComparable)


Public Sub add(ByVal e As entryType, ByVal k As keyType)
Dim dk As keyType
If k.CompareTo(dk) = 0 Then
End If
End Sub
Public Function find(ByVal k As keyType) As entryType
End Function
End Class

Se si completa la definizione di classe precedente, è possibile creare una varietà di dictionary classi. I tipi forniti
entryType e keyType determinano il tipo di voce che la classe include e il tipo di chiave che associa a ogni voce.
A causa del vincolo, è necessario fornire a keyType un tipo che implementa IComparable .
Nell'esempio di codice seguente viene creato un oggetto contenente le String voci e viene associata una
Integer chiave a ciascuna di esse. Integer implementa IComparable e pertanto soddisfa il vincolo in keyType
.

Dim d As New dictionary(Of String, Integer)

È possibile usare la parola chiave Of nei contesti seguenti:


Istruzione Class
Istruzione Delegate
Istruzione Function
Istruzione Interface
Istruzione Structure
Istruzione Sub

Vedi anche
IComparable
Type List
Generic Types in Visual Basic
In
Out
Contesti delle dichiarazioni e livelli di accesso
predefiniti (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Questo argomento descrive quali tipi di Visual Basic possono essere dichiarati all'interno di altri tipi e quali sono
i livelli di accesso predefiniti se non specificati.

Livelli del contesto di dichiarazione


Il contesto di dichiarazione di un elemento di programmazione è l'area di codice in cui viene dichiarata. Si tratta
spesso di un altro elemento di programmazione, che viene quindi denominato elemento contenitore.
I livelli dei contesti di dichiarazione sono i seguenti:
Livello dello spazio dei nomi , all'interno di un file di origine o di uno spazio dei nomi, ma non all'interno
di una classe, struttura, modulo
Livello del modulo , all'interno di una classe, struttura, modulo o interfaccia ma non all'interno di una
routine o un blocco
Livello di routine : all'interno di una routine o di un blocco (ad esempio If o For )
La tabella seguente illustra i livelli di accesso predefiniti per vari elementi di programmazione dichiarati, a
seconda dei contesti di dichiarazione.

L IVEL LO DEL LO SPA Z IO DEI


EL EM EN TO DIC H IA RATO NOMI L IVEL LO M O DULO L IVEL LO DI RO UT IN E

Variable (istruzione Dim) Non consentito Private ( in


Public Public
Structure , non
consentito in Interface )

Constant (istruzione Const) Non consentito Private ( in


Public Public
Structure , non
consentito in Interface )

Enumeration (istruzione Friend Public Non consentito


enum)

Classe (istruzione di classe) Friend Public Non consentito

Structure (istruzione Friend Public Non consentito


Structure)

Module (istruzione modulo) Friend Non consentito Non consentito

Interface (istruzione Friend Public Non consentito


Interface)

Routine (istruzione Non consentito Public Non consentito


Function, istruzione Sub)
L IVEL LO DEL LO SPA Z IO DEI
EL EM EN TO DIC H IA RATO NOMI L IVEL LO M O DULO L IVEL LO DI RO UT IN E

Riferimento esterno Non consentito Public (non consentito in Non consentito


(istruzione Declare) Interface )

Operatore operator Non consentito Public (non consentito in Non consentito


(istruzione) Interface o Module )

Property (istruzione Non consentito Public Non consentito


Property)

Proprietà predefinita Non consentito Public (non consentito in Non consentito


(impostazione predefinita) Module )

Event (istruzione Event) Non consentito Public Non consentito

Delegate (istruzione Friend Public Non consentito


Delegate)

Per altre informazioni, vedere livelli di accesso in Visual Basic.

Vedi anche
Friend
Privata
Pubblica
Elenco degli attributi (Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

Specifica gli attributi da applicare a un elemento di programmazione dichiarato. Gli attributi sono separati da
una virgola. Di seguito è riportata la sintassi per un attributo.

Sintassi
[ attributemodifier ] attributename [ ( attributearguments | attributeinitializer ) ]

Parti

attributemodifier Obbligatorio per gli attributi applicati all'inizio di un file di


origine. Può essere un assembly o un modulo.

attributename Obbligatorio. Nome dell'attributo.

attributearguments facoltativo. Elenco di argomenti posizionali per questo


attributo. Più argomenti sono separati da virgole.

attributeinitializer facoltativo. Elenco di inizializzatori di proprietà o di variabili


per l'attributo. Più inizializzatori sono separati da virgole.

Commenti
È possibile applicare uno o più attributi a quasi tutti gli elementi di programmazione (tipi, procedure, proprietà e
così via). Gli attributi vengono visualizzati nei metadati dell'assembly e consentono di annotare il codice o di
specificare come usare un particolare elemento di programmazione. È possibile applicare gli attributi definiti da
Visual Basic e .NET Framework ed è possibile definire attributi personalizzati.
Per altre informazioni su quando usare gli attributi, vedere Cenni preliminari sugli attributi. Per informazioni sui
nomi di attributo, vedere nomi di elementi dichiarati.

Regole
Posizionamento. È possibile applicare gli attributi agli elementi di programmazione più dichiarati. Per
applicare uno o più attributi, inserire un blocco di attributi all'inizio della dichiarazione dell'elemento.
Ogni voce nell'elenco di attributi specifica un attributo che si vuole applicare e il modificatore e gli
argomenti usati per la chiamata dell'attributo.
Parentesi angolari. Se si fornisce un elenco di attributi, è necessario racchiuderlo tra parentesi angolari
(" < " e " > ").
Par te della dichiarazione. L'attributo deve essere parte della dichiarazione di elemento, non di
un'istruzione separata. È possibile usare la sequenza di continuazione di riga (" _ ") per estendere
l'istruzione di dichiarazione su più righe del codice sorgente.
Modificatori. Un modificatore di attributo ( Assembly o Module ) è obbligatorio per ogni attributo
applicato a un elemento di programmazione all'inizio di un file di origine. I modificatori di attributo non
sono consentiti per gli attributi applicati a elementi che non si trovano all'inizio di un file di origine.
Argomenti. Tutti gli argomenti posizionali per un attributo devono precedere qualsiasi inizializzatore di
proprietà o variabile.

Esempio
Nell'esempio seguente l'attributo viene applicato DllImportAttribute a una definizione di scheletro di una
Function routine.

<DllImportAttribute("kernel32.dll", EntryPoint:="MoveFileW",
SetLastError:=True, CharSet:=CharSet.Unicode,
ExactSpelling:=True,
CallingConvention:=CallingConvention.StdCall)>
Public Shared Function MoveFile(ByVal src As String,
ByVal dst As String) As Boolean
' This function copies a file from the path src to the path dst.
' Leave this function empty. The DLLImport attribute forces calls
' to MoveFile to be forwarded to MoveFileW in KERNEL32.DLL.
End Function

DllImportAttribute indica che la procedura con attributi rappresenta un punto di ingresso in una libreria di
collegamento dinamico (DLL) non gestita. L'attributo fornisce il nome della DLL come argomento posizionale e
le altre informazioni come inizializzatori di variabile.

Vedi anche
Assembly
Modulo <keyword>
Panoramica degli attributi
Procedura: Interrompere e combinare istruzioni nel codice
Elenco dei parametri (Visual Basic)
05/03/2021 • 6 minutes to read • Edit Online

Specifica i parametri che una routine prevede quando viene chiamata. Più parametri sono separati da virgole. Di
seguito è riportata la sintassi per un parametro.

Sintassi
[ <attributelist> ] [ Optional ] [{ ByVal | ByRef }] [ ParamArray ]
parametername[( )] [ As parametertype ] [ = defaultvalue ]

Parti
attributelist
facoltativo. Elenco degli attributi che si applicano a questo parametro. È necessario racchiudere l' elenco degli
attributi tra parentesi angolari (" < " e " > ").
Optional
facoltativo. Specifica che questo parametro non è obbligatorio quando viene chiamata la stored procedure.
ByVal
facoltativo. Specifica che la routine non può sostituire o riassegnare l'elemento della variabile sottostante
all'argomento corrispondente nel codice chiamante.
ByRef
facoltativo. Specifica che la stored procedure può modificare l'elemento della variabile sottostante nel codice
chiamante nello stesso modo in cui è possibile il codice chiamante.
ParamArray
facoltativo. Specifica che l'ultimo parametro nell'elenco di parametri è una matrice facoltativa di elementi del
tipo di dati specificato. Ciò consente al codice chiamante di passare un numero arbitrario di argomenti alla
procedura.
parametername
Obbligatorio. Nome della variabile locale che rappresenta il parametro.
parametertype
Obbligatorio se Option Strict è On . Tipo di dati della variabile locale che rappresenta il parametro.
defaultvalue
Obbligatorio per i Optional parametri. Qualsiasi costante o espressione costante che restituisce il tipo di dati
del parametro. Se il tipo è Object o una classe, un'interfaccia, una matrice o una struttura, il valore predefinito
può essere solo Nothing .

Commenti
I parametri sono racchiusi tra parentesi e separati da virgole. Un parametro può essere dichiarato con qualsiasi
tipo di dati. Se non si specifica parametertype , il valore predefinito è Object .
Quando il codice chiamante chiama la stored procedure, passa un argomento a ogni parametro obbligatorio.
Per ulteriori informazioni, vedere differenze tra parametri e argomenti.
L'argomento che il codice chiamante passa a ogni parametro è un puntatore a un elemento sottostante nel
codice chiamante. Se questo elemento non è variabile (costante, valore letterale, enumerazione o espressione),
non è possibile modificare il codice. Se è un elemento variabile (una variabile dichiarata, un campo, una
proprietà, un elemento di matrice o un elemento della struttura), il codice chiamante può modificarlo. Per
ulteriori informazioni, vedere differenze tra argomenti modificabili e non modificabili.
Se viene passato un elemento variabile ByRef , può essere modificato anche dalla procedura. Per ulteriori
informazioni, vedere differenze tra il passaggio di un argomento per valore e per riferimento.

Regole
Parentesi. Se si specifica un elenco di parametri, è necessario racchiuderlo tra parentesi. Se non sono
presenti parametri, è comunque possibile usare le parentesi che racchiudono un elenco vuoto. Ciò
migliora la leggibilità del codice chiarendo che l'elemento è una routine.
Parametri facoltativi. Se si usa il Optional modificatore su un parametro, anche tutti i parametri
successivi nell'elenco devono essere facoltativi e devono essere dichiarati usando il Optional
modificatore.
Ogni dichiarazione di parametro facoltativa deve fornire la defaultvalue clausola.
Per ulteriori informazioni, vedere parametri facoltativi.
Matrici di parametri. È necessario specificare ByVal per un ParamArray parametro.
Non è possibile utilizzare sia Optional che ParamArray nello stesso elenco di parametri.
Per altre informazioni, vedere matrici di parametri.
Passaggio del meccanismo. Il meccanismo predefinito per ogni argomento è ByVal , il che significa
che la procedura non può modificare l'elemento della variabile sottostante. Tuttavia, se l'elemento è un
tipo di riferimento, la procedura può modificare il contenuto o i membri dell'oggetto sottostante, anche
se non è in grado di sostituire o riassegnare l'oggetto stesso.
Nomi dei parametri. Se il tipo di dati del parametro è una matrice, seguire parametername
immediatamente le parentesi. Per ulteriori informazioni sui nomi dei parametri, vedere nomi di elementi
dichiarati.

Esempio
Nell'esempio seguente viene illustrata una Function procedura che definisce due parametri.

Public Function HowMany(ByVal ch As Char, ByVal st As String) As Integer


End Function
Dim howManyA As Integer = HowMany("a"c, "How many a's in this string?")

Vedi anche
DllImportAttribute
Istruzione Function
Istruzione Sub
Declare Statement
Istruzione Structure
Option Strict Statement
Panoramica degli attributi
Procedura: Interrompere e combinare istruzioni nel codice
Elenco dei tipi (Visual Basic)
05/03/2021 • 7 minutes to read • Edit Online

Specifica i parametri di tipo per un elemento di programmazione generico . Più parametri sono separati da
virgole. Di seguito è riportata la sintassi per un parametro di tipo.

Sintassi
[genericmodifier] typename [ As constraintlist ]

Parti
T ERM IN E DEF IN IZ IO N E

genericmodifier facoltativo. Può essere usato solo in interfacce e delegati


generici. È possibile dichiarare un tipo covariante usando la
parola chiave out o controvariante usando la parola chiave in
. Vedere Covarianza e controvarianza.

typename Obbligatorio. Nome del parametro di tipo. Si tratta di un


segnaposto, che deve essere sostituito da un tipo definito
fornito dall'argomento di tipo corrispondente.

constraintlist facoltativo. Elenco di requisiti che vincolano il tipo di dati che


può essere fornito per typename . Se sono presenti più
vincoli, racchiuderli tra parentesi graffe ( { } ) e separarli
con virgole. È necessario introdurre l'elenco di vincoli con la
parola chiave As . Si usa As una sola volta, all'inizio
dell'elenco.

Commenti
Ogni elemento di programmazione generico deve assumere almeno un parametro di tipo. Un parametro di tipo
è un segnaposto per un tipo specifico (un elemento costruito) che il codice client specifica quando crea
un'istanza del tipo generico. È possibile definire una classe, una struttura, un'interfaccia, una routine o un
delegato generico.
Per ulteriori informazioni sul momento in cui definire un tipo generico, vedere tipi generici in Visual Basic. Per
ulteriori informazioni sui nomi dei parametri di tipo, vedere nomi di elementi dichiarati.

Regole
Parentesi. Se si fornisce un elenco di parametri di tipo, è necessario racchiuderlo tra parentesi ed è
necessario introdurre l'elenco con la parola chiave of. Si usa Of una sola volta, all'inizio dell'elenco.
Vincoli. Un elenco di vincoli in un parametro di tipo può includere gli elementi seguenti in qualsiasi
combinazione:
Un numero qualsiasi di interfacce. Il tipo fornito deve implementare ogni interfaccia in questo
elenco.
Al massimo una classe. Il tipo specificato deve ereditare da quella classe.
La parola chiave New . Il tipo fornito deve esporre un costruttore senza parametri a cui il tipo
generico può accedere. Questa operazione è utile se si vincola un parametro di tipo in base a una o
più interfacce. Un tipo che implementa le interfacce non espone necessariamente un costruttore e,
a seconda del livello di accesso di un costruttore, il codice all'interno del tipo generico potrebbe
non essere in grado di accedervi.
Class Parola chiave o Structure parola chiave. La Class parola chiave vincola un parametro di
tipo generico per richiedere che qualsiasi argomento di tipo passato sia un tipo riferimento, ad
esempio una stringa, una matrice o un delegato, oppure un oggetto creato da una classe. La
Structure parola chiave vincola un parametro di tipo generico per richiedere che qualsiasi
argomento di tipo passato sia un tipo valore, ad esempio una struttura, un'enumerazione o un tipo
di dati elementare. Non è possibile includere sia Class che Structure nello stesso
constraintlist .

Il tipo fornito deve soddisfare ogni requisito incluso in constraintlist .


I vincoli su ogni parametro di tipo sono indipendenti dai vincoli di altri parametri di tipo.

Comportamento
Sostituzione in fase di compilazione. Quando si crea un tipo costruito da un elemento di
programmazione generico, si fornisce un tipo definito per ogni parametro di tipo. Il compilatore Visual
Basic sostituisce il tipo fornito per ogni occorrenza di typename all'interno dell'elemento generico.
Assenza di vincoli. Se non si specifica alcun vincolo per un parametro di tipo, il codice è limitato alle
operazioni e ai membri supportati dal tipo di dati Object per quel parametro di tipo.

Esempio
Nell'esempio seguente viene illustrata una definizione di scheletro di una classe di dizionario generica, inclusa
una funzione Skeleton per aggiungere una nuova voce al dizionario.

Public Class dictionary(Of entryType, keyType As {IComparable, IFormattable, New})


Public Sub add(ByVal et As entryType, ByVal kt As keyType)
Dim dk As keyType
If kt.CompareTo(dk) = 0 Then
End If
End Sub
End Class

Esempio
Poiché dictionary è generico, il codice che lo usa può creare un'ampia gamma di oggetti, ognuno dei quali ha
la stessa funzionalità ma agisce su un tipo di dati diverso. Nell'esempio seguente viene illustrata una riga di
codice che crea un dictionary oggetto con le String voci e le Integer chiavi.

Dim dictInt As New dictionary(Of String, Integer)

Esempio
Nell'esempio seguente viene illustrata la definizione di scheletro equivalente generata dall'esempio precedente.
Public Class dictionary
Public Sub Add(ByVal et As String, ByVal kt As Integer)
Dim dk As Integer
If kt.CompareTo(dk) = 0 Then
End If
End Sub
End Class

Vedi anche
Di
Operatore New
Livelli di accesso in Visual Basic
Object Data Type
Istruzione Function
Istruzione Structure
Istruzione Sub
Procedura: Usare una classe generica
Covarianza e controvarianza
In
Out
Tag XML consigliati per i commenti relativi alla
documentazione (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Il compilatore Visual Basic può elaborare i commenti della documentazione nel codice in un file XML. È possibile
utilizzare altri strumenti per elaborare il file XML nella documentazione di.
I commenti XML sono consentiti in costrutti di codice, ad esempio tipi e membri di tipo. Per i tipi parziali, solo
una parte del tipo può presentare commenti XML, anche se non esiste alcuna restrizione per il commento dei
relativi membri.

NOTE
Non è possibile applicare i commenti alla documentazione agli spazi dei nomi. Il motivo è che uno spazio dei nomi può
estendersi su più assembly e non tutti gli assembly devono essere caricati contemporaneamente.

Il compilatore elabora qualsiasi tag che è un XML valido. I seguenti tag forniscono la funzionalità comunemente
utilizzata nella documentazione dell'utente.

<c> <code> <example>

<exception>1 <include>1 <list>

<para> <param>1 <paramref>

<permission>1 <remarks> <returns>

<see>1 <seealso>1 <summary>

<typeparam>1 <value>

(1 il compilatore verifica la sintassi).

NOTE
Se si desidera che le parentesi angolari vengano visualizzate nel testo di un commento della documentazione, utilizzare
&lt; e &gt; . Ad esempio, la stringa "&lt;text in angle brackets&gt;" viene visualizzata come
<text in angle brackets> .

Vedi anche
Documentazione del codice tramite XML
-doc
Procedura: Creare documentazione XML
<c> (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Indica che il testo all'interno di una descrizione è codice.

Sintassi
<c>text</c>

Parametri
PA RA M ET RO DESC RIZ IO N E

text Il testo che si desidera indicare come codice.

Commenti
Il <c> tag fornisce un modo per indicare che il testo all'interno di una descrizione deve essere contrassegnato
come codice. Usare <code> per indicare più righe come codice.
Compilare con -doc per elaborare i commenti relativi alla documentazione in un file.

Esempio
Questo esempio usa il <c> tag nella sezione Summary per indicare che Counter si tratta di codice.

''' <summary>
''' Resets the value the <c>Counter</c> field.
''' </summary>
Public Sub ResetCounter()
counterValue = 0
End Sub
Private counterValue As Integer = 0
''' <summary>
''' Returns the number of times Counter was called.
''' </summary>
''' <value>Number of times Counter was called.</value>
Public ReadOnly Property Counter() As Integer
Get
counterValue += 1
Return counterValue
End Get
End Property

Vedi anche
Tag di commento XML
<code> (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Indica che il testo è costituito da più righe di codice.

Sintassi
<code>content</code>

Parametri
content
Testo da contrassegnare come codice.

Commenti
Usare il <code> tag per indicare più righe come codice. Usare <c> per indicare che il testo all'interno di una
descrizione deve essere contrassegnato come codice.
Compilare con -doc per elaborare i commenti relativi alla documentazione in un file.

Esempio
Questo esempio usa il <code> tag per includere il codice di esempio per l'uso del ID campo.

Public Class Employee


''' <remarks>
''' <example> This sample shows how to set the <c>ID</c> field.
''' <code>
''' Dim alice As New Employee
''' alice.ID = 1234
''' </code>
''' </example>
''' </remarks>
Public ID As Integer
End Class

Vedi anche
Tag di commento XML
<example> (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica un esempio per il membro.

Sintassi
<example>description</example>

Parametri
description
Descrizione dell'esempio di codice.

Commenti
Il <example> tag consente di specificare un esempio di come usare un metodo o un altro membro della libreria.
Questa operazione comporta in genere l'uso del <code> tag.
Compilare con -doc per elaborare i commenti relativi alla documentazione in un file.

Esempio
Questo esempio usa il <example> tag per includere un esempio per l'uso del ID campo.

Public Class Employee


''' <remarks>
''' <example> This sample shows how to set the <c>ID</c> field.
''' <code>
''' Dim alice As New Employee
''' alice.ID = 1234
''' </code>
''' </example>
''' </remarks>
Public ID As Integer
End Class

Vedi anche
Tag di commento XML
<exception> (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica le eccezioni che possono essere generate.

Sintassi
<exception cref="member">description</exception>

Parametri
member
Riferimento ad un'eccezione disponibile dall'ambiente di compilazione corrente. Il compilatore controlla che
l'eccezione specificata esista e converte member nel nome canonico dell'elemento nel file XML di output. member
deve essere racchiuso tra virgolette doppie (" ").
description
Una descrizione.

Commenti
Usare il <exception> tag per specificare le eccezioni che possono essere generate. Questo tag viene applicato a
una definizione di metodo.
Compilare con -doc per elaborare i commenti relativi alla documentazione in un file.

Esempio
Questo esempio usa il <exception> tag per descrivere un'eccezione che la IntDivide funzione può generare.

''' <exception cref="System.OverflowException">


''' Thrown when <paramref name="denominator"/><c> = 0</c>.
''' </exception>
Public Function IntDivide(
ByVal numerator As Integer,
ByVal denominator As Integer
) As Integer
Return numerator \ denominator
End Function

Vedi anche
Tag di commento XML
<include> (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Fa riferimento a un altro file che descrive i tipi e i membri nel codice sorgente.

Sintassi
<include file="filename" path="tagpath[@name='id']" />

Parametri
filename
Obbligatorio. Nome del file che contiene la documentazione. È possibile qualificare il nome del file con un
percorso. Racchiude filename tra virgolette doppie ("").
tagpath
Obbligatorio. Percorso dei tag di filename che porta al name del tag. Racchiudere il percorso tra virgolette
doppie ("").
name
Obbligatorio. Identificatore del nome nel tag che precede i commenti. Name avrà un id .
id
Obbligatorio. ID del tag che precede i commenti. Racchiudere l'ID racchiuso tra virgolette singole ('').

Commenti
Usare il <include> tag per fare riferimento ai commenti in un altro file che descrive i tipi e i membri nel codice
sorgente. eliminando la necessità di inserire i commenti relativi alla documentazione direttamente nel file del
codice sorgente.
Il <include> tag usa la raccomandazione W3C XML Path Language (XPath) versione 1,0. Per ulteriori
informazioni sulle modalità di personalizzazione dell' <include> utilizzo, vedere https://www.w3.org/TR/xpath .

Esempio
Questo esempio usa il <include> tag per importare i commenti relativi alla documentazione membri da un file
denominato commentFile.xml .

''' <include file="commentFile.xml"


''' path="Docs/Members[@name='Open']/*" />
Public Sub Open(ByVal filename As String)
' Code goes here.
End Sub
''' <include file="commentFile.xml"
''' path="Docs/Members[@name='Close']/*" />
Public Sub Close(ByVal filename As String)
' Code goes here.
End Sub

Il formato di commentFile.xml è il seguente.


<Docs>
<Members name="Open">
<summary>Opens a file.</summary>
<param name="filename">File name to open.</param>
</Members>
<Members name="Close">
<summary>Closes a file.</summary>
<param name="filename">File name to close.</param>
</Members>
</Docs>

Vedi anche
Tag di commento XML
<list> (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Definisce un elenco o una tabella.

Sintassi
<list type="type">
<listheader>
<term>term</term>
<description>description</description>
</listheader>
<item>
<term>term</term>
<description>description</description>
</item>
</list>

Parametri
type
Tipo dell'elenco. Deve essere un "Bullet" per un elenco puntato, "Number" per un elenco numerato o "Table" per
una tabella a due colonne.
term
Utilizzato solo quando type è "Table". Termine da definire, definito nel tag Description.
description
Quando type è "Bullet" o "Number", description è un elemento nell'elenco quando type è "Table",
description è la definizione di term .

Commenti
Il <listheader> blocco definisce l'intestazione di un elenco di tabelle o definizioni. Quando si definisce una
tabella, è sufficiente specificare una voce per term nell'intestazione.
Ogni elemento nell'elenco viene specificato con un <item> blocco. Quando si crea un elenco di definizioni, è
necessario specificare sia che term description . Tuttavia, per una tabella, un elenco puntato o un elenco
numerato, è sufficiente fornire una voce per description .
Un elenco o una tabella può includere un numero di <item> blocchi sufficiente.
Compilare con -doc per elaborare i commenti relativi alla documentazione in un file.

Esempio
Questo esempio usa il <list> tag per definire un elenco puntato nella sezione Osservazioni.
''' <remarks>Before calling the <c>Reset</c> method, be sure to:
''' <list type="bullet">
''' <item><description>Close all connections.</description></item>
''' <item><description>Save the object state.</description></item>
''' </list>
''' </remarks>
Public Sub Reset()
' Code goes here.
End Sub

Vedi anche
Tag di commento XML
<para> (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica che il contenuto è formattato come paragrafo.

Sintassi
<para>content</para>

Parametri
content
Testo del paragrafo.

Commenti
Il <para> tag è da usare all'interno di un tag, ad esempio <summary> , <remarks> o <returns> , e consente di
aggiungere la struttura al testo.
Compilare con -doc per elaborare i commenti relativi alla documentazione in un file.

Esempio
Questo esempio usa il <para> tag per suddividere la sezione Osservazioni per il UpdateRecord metodo in due
paragrafi.

''' <param name="id">The ID of the record to update.</param>


''' <remarks>Updates the record <paramref name="id"/>.
''' <para>Use <see cref="DoesRecordExist"/> to verify that
''' the record exists before calling this method.</para>
''' </remarks>
Public Sub UpdateRecord(ByVal id As Integer)
' Code goes here.
End Sub
''' <param name="id">The ID of the record to check.</param>
''' <returns><c>True</c> if <paramref name="id"/> exists,
''' <c>False</c> otherwise.</returns>
''' <remarks><seealso cref="UpdateRecord"/></remarks>
Public Function DoesRecordExist(ByVal id As Integer) As Boolean
' Code goes here.
End Function

Vedi anche
Tag di commento XML
<param> (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Definisce un nome di parametro e una descrizione.

Sintassi
<param name="name">description</param>

Parametri
name
Nome di un parametro di metodo. Racchiudere il nome tra virgolette doppie (" ").
description
Descrizione del parametro.

Commenti
Il <param> tag deve essere usato nel commento per una dichiarazione di metodo per descrivere uno dei
parametri per il metodo.
Il testo del <param> tag verrà visualizzato nei percorsi seguenti:
Informazioni sul parametro di IntelliSense. Per altre informazioni, vedere Using IntelliSense (Uso di
IntelliSense).
Visualizzatore oggetti. Per ulteriori informazioni, vedere visualizzazione della struttura del codice.
Compilare con -doc per elaborare i commenti relativi alla documentazione in un file.

Esempio
Questo esempio usa il <param> tag per descrivere il id parametro.

''' <param name="id">The ID of the record to update.</param>


''' <remarks>Updates the record <paramref name="id"/>.
''' <para>Use <see cref="DoesRecordExist"/> to verify that
''' the record exists before calling this method.</para>
''' </remarks>
Public Sub UpdateRecord(ByVal id As Integer)
' Code goes here.
End Sub
''' <param name="id">The ID of the record to check.</param>
''' <returns><c>True</c> if <paramref name="id"/> exists,
''' <c>False</c> otherwise.</returns>
''' <remarks><seealso cref="UpdateRecord"/></remarks>
Public Function DoesRecordExist(ByVal id As Integer) As Boolean
' Code goes here.
End Function

Vedi anche
Tag di commento XML
<paramref> (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Formatta una parola come parametro.

Sintassi
<paramref name="name"/>

Parametri
name
Nome del parametro a cui fare riferimento. Racchiudere il nome tra virgolette doppie (" ").

Commenti
Il <paramref> tag consente di indicare che una parola è un parametro. Il file XML può essere elaborato per
formattare questo parametro in modo distinto.
Compilare con -doc per elaborare i commenti relativi alla documentazione in un file.

Esempio
Questo esempio usa il <paramref> tag per fare riferimento al id parametro.

''' <param name="id">The ID of the record to update.</param>


''' <remarks>Updates the record <paramref name="id"/>.
''' <para>Use <see cref="DoesRecordExist"/> to verify that
''' the record exists before calling this method.</para>
''' </remarks>
Public Sub UpdateRecord(ByVal id As Integer)
' Code goes here.
End Sub
''' <param name="id">The ID of the record to check.</param>
''' <returns><c>True</c> if <paramref name="id"/> exists,
''' <c>False</c> otherwise.</returns>
''' <remarks><seealso cref="UpdateRecord"/></remarks>
Public Function DoesRecordExist(ByVal id As Integer) As Boolean
' Code goes here.
End Function

Vedi anche
Tag di commento XML
<permission> (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica un'autorizzazione necessaria per il membro.

Sintassi
<permission cref="member">description</permission>

Parametri
member
Riferimento a un membro o a un campo disponibile per essere chiamato dall'ambiente di compilazione
corrente. Il compilatore verifica l'esistenza dell'elemento di codice specificato e converte member nel nome
canonico dell'elemento nel file XML di output. Racchiude member tra virgolette ("").
description
Descrizione dell'accesso al membro.

Commenti
Usare il <permission> tag per documentare l'accesso di un membro. Utilizzare la PermissionSet classe per
specificare l'accesso a un membro.
Compilare con -doc per elaborare i commenti relativi alla documentazione in un file.

Esempio
Questo esempio usa il <permission> tag per descrivere che FileIOPermission è richiesto dal ReadFile metodo.

''' <permission cref="System.Security.Permissions.FileIOPermission">


''' Needs full access to the specified file.
''' </permission>
Public Sub ReadFile(ByVal filename As String)
' Code goes here.
End Sub

Vedi anche
Tag di commento XML
<remarks> (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica una sezione di osservazioni per il membro.

Sintassi
<remarks>description</remarks>

Parametri
description
Descrizione del membro.

Commenti
Usare il <remarks> tag per aggiungere informazioni su un tipo, integrando le informazioni specificate con
<summary> .
Queste informazioni vengono visualizzate nel Visualizzatore oggetti. Per informazioni sulla Visualizzatore
oggetti, vedere visualizzazione della struttura del codice.
Compilare con -doc per elaborare i commenti relativi alla documentazione in un file.

Esempio
Questo esempio usa il <remarks> tag per spiegare cosa UpdateRecord fa il metodo.

''' <param name="id">The ID of the record to update.</param>


''' <remarks>Updates the record <paramref name="id"/>.
''' <para>Use <see cref="DoesRecordExist"/> to verify that
''' the record exists before calling this method.</para>
''' </remarks>
Public Sub UpdateRecord(ByVal id As Integer)
' Code goes here.
End Sub
''' <param name="id">The ID of the record to check.</param>
''' <returns><c>True</c> if <paramref name="id"/> exists,
''' <c>False</c> otherwise.</returns>
''' <remarks><seealso cref="UpdateRecord"/></remarks>
Public Function DoesRecordExist(ByVal id As Integer) As Boolean
' Code goes here.
End Function

Vedi anche
Tag di commento XML
<returns> (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica il valore restituito della proprietà o della funzione.

Sintassi
<returns>description</returns>

Parametri
description
Descrizione del valore restituito.

Commenti
Usare il <returns> tag nel commento per una dichiarazione di metodo per descrivere il valore restituito.
Compilare con -doc per elaborare i commenti relativi alla documentazione in un file.

Esempio
Questo esempio usa il <returns> tag per spiegare il risultato DoesRecordExist restituito dalla funzione.

''' <param name="id">The ID of the record to update.</param>


''' <remarks>Updates the record <paramref name="id"/>.
''' <para>Use <see cref="DoesRecordExist"/> to verify that
''' the record exists before calling this method.</para>
''' </remarks>
Public Sub UpdateRecord(ByVal id As Integer)
' Code goes here.
End Sub
''' <param name="id">The ID of the record to check.</param>
''' <returns><c>True</c> if <paramref name="id"/> exists,
''' <c>False</c> otherwise.</returns>
''' <remarks><seealso cref="UpdateRecord"/></remarks>
Public Function DoesRecordExist(ByVal id As Integer) As Boolean
' Code goes here.
End Function

Vedi anche
Tag di commento XML
<see> (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica un collegamento a un altro membro.

Sintassi
<see cref="member"/>

Parametri
member
Riferimento a un membro o a un campo disponibile per essere chiamato dall'ambiente di compilazione
corrente. Il compilatore verifica l'esistenza dell'elemento di codice specificato e passa member al nome
dell'elemento nel file XML di output. member deve essere racchiuso tra virgolette doppie (" ").

Commenti
Usare il <see> tag per specificare un collegamento dall'interno del testo. Usare <seealso> per indicare il testo
che potrebbe essere necessario visualizzare in una sezione "vedere anche".
Compilare con -doc per elaborare i commenti relativi alla documentazione in un file.

Esempio
Questo esempio usa il <see> tag nella UpdateRecord sezione Note per fare riferimento al DoesRecordExist
metodo.

''' <param name="id">The ID of the record to update.</param>


''' <remarks>Updates the record <paramref name="id"/>.
''' <para>Use <see cref="DoesRecordExist"/> to verify that
''' the record exists before calling this method.</para>
''' </remarks>
Public Sub UpdateRecord(ByVal id As Integer)
' Code goes here.
End Sub
''' <param name="id">The ID of the record to check.</param>
''' <returns><c>True</c> if <paramref name="id"/> exists,
''' <c>False</c> otherwise.</returns>
''' <remarks><seealso cref="UpdateRecord"/></remarks>
Public Function DoesRecordExist(ByVal id As Integer) As Boolean
' Code goes here.
End Function

Vedi anche
Tag di commento XML
<seealso> (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica un collegamento visualizzato nella sezione vedere anche.

Sintassi
<seealso cref="member"/>

Parametri
member
Riferimento a un membro o a un campo disponibile per essere chiamato dall'ambiente di compilazione
corrente. Il compilatore verifica l'esistenza dell'elemento di codice specificato e passa member al nome
dell'elemento nel file XML di output. member deve essere racchiuso tra virgolette doppie (" ").

Commenti
Usare il <seealso> tag per specificare il testo che si vuole visualizzare in una sezione vedere anche. Usare <see>
per specificare un collegamento dall'interno del testo.
Compilare con -doc per elaborare i commenti relativi alla documentazione in un file.

Esempio
Questo esempio usa il <seealso> tag nella DoesRecordExist sezione Note per fare riferimento al UpdateRecord
metodo.

''' <param name="id">The ID of the record to update.</param>


''' <remarks>Updates the record <paramref name="id"/>.
''' <para>Use <see cref="DoesRecordExist"/> to verify that
''' the record exists before calling this method.</para>
''' </remarks>
Public Sub UpdateRecord(ByVal id As Integer)
' Code goes here.
End Sub
''' <param name="id">The ID of the record to check.</param>
''' <returns><c>True</c> if <paramref name="id"/> exists,
''' <c>False</c> otherwise.</returns>
''' <remarks><seealso cref="UpdateRecord"/></remarks>
Public Function DoesRecordExist(ByVal id As Integer) As Boolean
' Code goes here.
End Function

Vedi anche
Tag di commento XML
<summary> (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica il riepilogo del membro.

Sintassi
<summary>description</summary>

Parametri
description
Un riepilogo dell'oggetto.

Commenti
Usare il <summary> tag per descrivere un tipo o un membro del tipo. Utilizzare <remarks> per aggiungere
informazioni aggiuntive a una descrizione del tipo.
Il testo per il <summary> tag è l'unica fonte di informazioni sul tipo in IntelliSense e viene visualizzato anche
nell'Visualizzatore oggetti. Per informazioni sulla Visualizzatore oggetti, vedere visualizzazione della struttura del
codice.
Compilare con -doc per elaborare i commenti relativi alla documentazione in un file.

Esempio
Questo esempio usa il <summary> tag per descrivere il ResetCounter metodo e la Counter Proprietà.

''' <summary>
''' Resets the value the <c>Counter</c> field.
''' </summary>
Public Sub ResetCounter()
counterValue = 0
End Sub
Private counterValue As Integer = 0
''' <summary>
''' Returns the number of times Counter was called.
''' </summary>
''' <value>Number of times Counter was called.</value>
Public ReadOnly Property Counter() As Integer
Get
counterValue += 1
Return counterValue
End Get
End Property

Vedi anche
Tag di commento XML
<typeparam> (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Definisce il nome e la descrizione di un parametro di tipo.

Sintassi
<typeparam name="name">description</typeparam>

Parametri
name
Nome del parametro di tipo. Racchiudere il nome tra virgolette doppie (" ").
description
Descrizione del parametro di tipo.

Commenti
Usare il <typeparam> tag nel commento per una dichiarazione di un tipo generico o di un membro generico per
descrivere uno dei parametri di tipo.
Compilare con -doc per elaborare i commenti relativi alla documentazione in un file.

Esempio
Questo esempio usa il <typeparam> tag per descrivere il id parametro.

''' <typeparam name="T">


''' The base item type. Must implement IComparable.
''' </typeparam>
Public Class itemManager(Of T As IComparable)
' Insert code that defines class members.
End Class

Vedi anche
Tag di commento XML
<value> (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica la descrizione di una proprietà.

Sintassi
<value>property-description</value>

Parametri
property-description
Descrizione della proprietà.

Commenti
Usare il <value> tag per descrivere una proprietà. Si noti che quando si aggiunge una proprietà usando la
creazione guidata codice nell'ambiente di sviluppo di Visual Studio, verrà aggiunto un <summary> tag per la
nuova proprietà. È quindi necessario aggiungere manualmente un <value> tag per descrivere il valore
rappresentato dalla proprietà.
Compilare con -doc per elaborare i commenti relativi alla documentazione in un file.

Esempio
Questo esempio usa il <value> tag per descrivere il valore che la Counter proprietà possiede.

''' <summary>
''' Resets the value the <c>Counter</c> field.
''' </summary>
Public Sub ResetCounter()
counterValue = 0
End Sub
Private counterValue As Integer = 0
''' <summary>
''' Returns the number of times Counter was called.
''' </summary>
''' <value>Number of times Counter was called.</value>
Public ReadOnly Property Counter() As Integer
Get
counterValue += 1
Return counterValue
End Get
End Property

Vedi anche
Tag di commento XML
Proprietà Axis XML (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Negli argomenti di questa sezione viene illustrata la sintassi delle proprietà Axis XML in Visual Basic. Le
proprietà dell'asse XML consentono di accedere facilmente a XML direttamente nel codice.

Contenuto della sezione


A RGO M EN TO DESC RIZ IO N E

XML Attribute Axis Property Viene descritto come accedere agli attributi di un XElement
oggetto.

XML Child Axis Property Viene descritto come accedere agli elementi figlio di un
XElement oggetto.

XML Descendant Axis Property Viene descritto come accedere ai discendenti di un XElement
oggetto.

Proprietà dell'indicizzatore di estensione Viene descritto come accedere a singoli elementi in una
raccolta XElement di XAttribute oggetti o.

Proprietà Value XML Viene descritto come accedere al valore del primo elemento
di una raccolta di XElement oggetti o XAttribute .

Vedi anche
XML
Proprietà axis dell'attributo XML (Visual Basic)
05/03/2021 • 5 minutes to read • Edit Online

Fornisce l'accesso al valore di un attributo per un XElement oggetto o al primo elemento in una raccolta di
XElement oggetti.

Sintassi
object.@attribute
' -or-
object.@<attribute>

Parti
object
Obbligatorio. Un XElement oggetto o una raccolta di XElement oggetti.
.@
Obbligatorio. Indica l'inizio di una proprietà axis dell'attributo.
<
facoltativo. Indica l'inizio del nome dell'attributo quando attribute non è un identificatore valido in Visual
Basic.
attribute
Obbligatorio. Nome dell'attributo a cui accedere, nel formato [ prefix :] name .

PA RT E DESC RIZ IO N E

prefix Facoltativa. Prefisso dello spazio dei nomi XML per


l'attributo. Deve essere uno spazio dei nomi XML globale
definito usando un'istruzione Imports .

name Obbligatorio. Nome dell'attributo locale. Vedere nomi di


elementi e attributi XML dichiarati.

>
facoltativo. Indica la fine del nome dell'attributo quando attribute non è un identificatore valido in Visual Basic.

Valore restituito
Stringa che contiene il valore di attribute . Se il nome dell'attributo non esiste, Nothing viene restituito.

Commenti
È possibile utilizzare una proprietà axis dell'attributo XML per accedere al valore di un attributo in base al nome
da un XElement oggetto o dal primo elemento di una raccolta di XElement oggetti. È possibile recuperare un
valore di attributo in base al nome o aggiungere un nuovo attributo a un elemento specificando un nuovo nome
preceduto da @ Identifier.
Quando si fa riferimento a un attributo XML usando l'identificatore @, il valore dell'attributo viene restituito
come stringa e non è necessario specificare in modo esplicito la Value Proprietà.
Le regole di denominazione per gli attributi XML sono diverse dalle regole di denominazione per gli
identificatori di Visual Basic. Per accedere a un attributo XML con un nome diverso da un identificatore di Visual
Basic valido, racchiudere il nome tra parentesi acute ( < and > ).

Spazi dei nomi XML


Il nome in una proprietà axis dell'attributo può utilizzare solo i prefissi degli spazi dei nomi XML dichiarati
globalmente utilizzando l' Imports istruzione. Non può usare prefissi degli spazi dei nomi XML dichiarati
localmente all'interno di valori letterali dell'elemento XML. Per altre informazioni, vedere istruzione Imports
(spazio dei nomi XML).

Esempio
Nell'esempio seguente viene illustrato come ottenere i valori degli attributi XML denominati type da una
raccolta di elementi XML denominati phone .

' Topic: XML Attribute Axis Property


Dim phones As XElement =
<phones>
<phone type="home">206-555-0144</phone>
<phone type="work">425-555-0145</phone>
</phones>

Dim phoneTypes As XElement =


<phoneTypes>
<%= From phone In phones.<phone>
Select <type><%= phone.@type %></type>
%>
</phoneTypes>

Console.WriteLine(phoneTypes)

Questo codice visualizza il testo seguente:


<phoneTypes>

<type>home</type>

<type>work</type>

</phoneTypes>

Esempio
Nell'esempio seguente viene illustrato come creare attributi per un elemento XML in modo dichiarativo, come
parte del codice XML, e in modo dinamico aggiungendo un attributo a un'istanza di un XElement oggetto. L'
type attributo viene creato in modo dichiarativo e l' owner attributo viene creato dinamicamente.

Dim phone2 As XElement = <phone type="home">206-555-0144</phone>


phone2.@owner = "Harris, Phyllis"

Console.WriteLine(phone2)

Questo codice visualizza il testo seguente:


<phone type="home" owner="Harris, Phyllis">206-555-0144</phone>

Esempio
Nell'esempio seguente viene utilizzata la sintassi della parentesi angolare per ottenere il valore dell'attributo
XML denominato number-type , che non è un identificatore valido in Visual Basic.

Dim phone As XElement =


<phone number-type=" work">425-555-0145</phone>

Console.WriteLine("Phone type: " & phone.@<number-type>)

Questo codice visualizza il testo seguente:


Phone type: work

Esempio
Nell'esempio seguente viene dichiarato ns come un prefisso dello spazio dei nomi XML. USA quindi il prefisso
dello spazio dei nomi per creare un valore letterale XML e accedere al primo nodo figlio con il nome completo "
ns:name ".

Imports <xmlns:ns = "http://SomeNamespace">

Class TestClass3

Shared Sub TestPrefix()


Dim phone =
<ns:phone ns:type="home">206-555-0144</ns:phone>

Console.WriteLine("Phone type: " & phone.@ns:type)


End Sub

End Class

Questo codice visualizza il testo seguente:


Phone type: home

Vedi anche
XElement
Proprietà Axis XML
Valori letterali XML
Creazione di XML in Visual Basic
Nomi di elementi e attributi XML dichiarati
Proprietà Child Axis XML (Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

Fornisce l'accesso agli elementi figlio di uno dei seguenti oggetti: XElement, XDocument, raccolta di XElement o
raccolta di XDocument.

Sintassi
object.<child>

Parti
T ERM IN E DEF IN IZ IO N E

object Obbligatorio. Un oggetto XElement, un oggetto XDocument,


una raccolta di oggetti XElement o una raccolta di oggetti
XDocument.

.< Obbligatorio. Indica l'inizio di una proprietà axis


dell'elemento figlio.

child Obbligatorio. Nome dei nodi figlio a cui accedere, nel


formato [prefix:]name .

- Prefix Opzionale. Prefisso dello spazio dei nomi XML per


il nodo figlio. Deve essere uno spazio dei nomi XML globale
definito usando un'istruzione Imports .
- Name Necessaria. Nome del nodo figlio locale. Vedere
nomi di elementi e attributi XML dichiarati.

> Obbligatorio. Indica la fine di una proprietà axis


dell'elemento figlio.

Valore restituito
Raccolta di oggetti XElement.

Commenti
È possibile usare una proprietà axis dell'elemento figlio XML per accedere a nodi figlio in base al nome, da un
oggetto XElement o XDocument o da raccolte di oggetti XElement o XDocument. Usare la proprietà Value XML
per accedere al valore del primo nodo figlio nella raccolta restituita. Per ulteriori informazioni, vedere proprietà
del valore XML.
Il compilatore Visual Basic converte le proprietà dell'asse figlio in chiamate al Elements metodo.

Spazi dei nomi XML


Il nome in una proprietà axis dell'elemento figlio può usare solo prefissi degli spazi dei nomi XML dichiarati
globalmente con l'istruzione Imports . Non può usare prefissi degli spazi dei nomi XML dichiarati localmente
all'interno di valori letterali dell'elemento XML. Per altre informazioni, vedere istruzione Imports (spazio dei
nomi XML).

Esempio
L'esempio seguente illustra come accedere ai nodi figlio denominati phone dall'oggetto contact .

Dim contact As XElement =


<contact>
<name>Patrick Hines</name>
<phone type="home">206-555-0144</phone>
<phone type="work">425-555-0145</phone>
</contact>

Dim homePhone = From hp In contact.<phone>


Where contact.<phone>.@type = "home"
Select hp

Console.WriteLine("Home Phone = {0}", homePhone(0).Value)

Questo codice visualizza il testo seguente:


Home Phone = 206-555-0144

Esempio
L'esempio seguente illustra come accedere ai nodi figlio denominati phone dalla raccolta restituita dalla
proprietà axis dell'elemento figlio contact dell'oggetto contacts .

Dim contacts As XElement =


<contacts>
<contact>
<name>Patrick Hines</name>
<phone type="home">206-555-0144</phone>
</contact>
<contact>
<name>Lance Tucker</name>
<phone type="work">425-555-0145</phone>
</contact>
</contacts>

Dim homePhone = From contact In contacts.<contact>


Where contact.<phone>.@type = "home"
Select contact.<phone>

Console.WriteLine("Home Phone = {0}", homePhone(0).Value)

Questo codice visualizza il testo seguente:


Home Phone = 206-555-0144

Esempio
Nell'esempio seguente viene dichiarato ns come un prefisso dello spazio dei nomi XML. Il prefisso dello spazio
dei nomi viene quindi usato per creare un valore letterale XML e accedere al primo nodo figlio con il nome
completo ns:name .
Imports <xmlns:ns = "http://SomeNamespace">

Class TestClass4

Shared Sub TestPrefix()


Dim contact = <ns:contact>
<ns:name>Patrick Hines</ns:name>
</ns:contact>
Console.WriteLine(contact.<ns:name>.Value)
End Sub

End Class

Questo codice visualizza il testo seguente:


Patrick Hines

Vedi anche
XElement
Proprietà Axis XML
Valori letterali XML
Creazione di XML in Visual Basic
Nomi di elementi e attributi XML dichiarati
Proprietà axis descendant XML (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Fornisce l'accesso ai discendenti dei seguenti elementi: un XElement oggetto, un XDocument oggetto, una
raccolta di XElement oggetti o una raccolta di XDocument oggetti.

Sintassi
object...<descendant>

Parti
object Obbligatorio. Un oggetto XElement, un oggetto XDocument, una raccolta di oggetti XElement o una
raccolta di oggetti XDocument.
...< Obbligatorio. Indica l'inizio di una proprietà asse discendente.
descendant Obbligatorio. Nome dei nodi discendenti a cui accedere, nel formato [ prefix:]name .

PA RT E DESC RIZ IO N E

prefix Facoltativa. Prefisso dello spazio dei nomi XML per il nodo
discendente. Deve essere uno spazio dei nomi XML globale
definito usando un' Imports istruzione.

name Obbligatorio. Nome locale del nodo discendente. Vedere


nomi di elementi e attributi XML dichiarati.

> Obbligatorio. Indica la fine di una proprietà asse discendente.

Valore restituito
Raccolta di oggetti XElement.

Commenti
È possibile utilizzare una proprietà axis discendente XML per accedere ai nodi discendenti in base al nome di un
XElement oggetto o oppure XDocument da una raccolta di XElement XDocument oggetti o. Utilizzare la Value
proprietà XML per accedere al valore del primo nodo discendente nella raccolta restituita. Per ulteriori
informazioni, vedere proprietà del valore XML.
Il compilatore Visual Basic converte le proprietà dell'asse discendente in chiamate al Descendants metodo.

Spazi dei nomi XML


Il nome in una proprietà asse discendente può utilizzare solo spazi dei nomi XML dichiarati globalmente con l'
Imports istruzione. Non può utilizzare spazi dei nomi XML dichiarati localmente nei valori letterali degli
elementi XML. Per altre informazioni, vedere istruzione Imports (spazio dei nomi XML).
Esempio
Nell'esempio seguente viene illustrato come accedere al valore del primo nodo discendente denominato name
e ai valori di tutti i nodi discendenti denominati phone dall' contacts oggetto.

Dim contacts As XElement =


<contacts>
<contact>
<name>Patrick Hines</name>
<phone type="home">206-555-0144</phone>
<phone type="work">425-555-0145</phone>
</contact>
</contacts>

Console.WriteLine("Name: " & contacts...<name>.Value)

Dim homePhone = From phone In contacts...<phone>


Select phone.Value

Console.WriteLine("Home Phone = {0}", homePhone(0))

Questo codice visualizza il testo seguente:


Name: Patrick Hines

Home Phone = 206-555-0144

Esempio
Nell'esempio seguente viene dichiarato ns come un prefisso dello spazio dei nomi XML. USA quindi il prefisso
dello spazio dei nomi per creare un valore letterale XML e accedere al valore del primo nodo figlio con il nome
completo ns:name .

Imports <xmlns:ns = "http://SomeNamespace">

Class TestClass2

Shared Sub TestPrefix()


Dim contacts =
<ns:contacts>
<ns:contact>
<ns:name>Patrick Hines</ns:name>
</ns:contact>
</ns:contacts>

Console.WriteLine("Name: " & contacts...<ns:name>.Value)


End Sub

End Class

Questo codice visualizza il testo seguente:


Name: Patrick Hines

Vedi anche
XElement
Proprietà Axis XML
Valori letterali XML
Creazione di XML in Visual Basic
Nomi di elementi e attributi XML dichiarati
Proprietà dell'indicizzatore di estensione (Visual
Basic)
05/03/2021 • 3 minutes to read • Edit Online

Fornisce l'accesso ai singoli elementi di una raccolta.

Sintassi
object(index)

Parti
T ERM IN E DEF IN IZ IO N E

object Obbligatorio. Raccolta Queryable. Ovvero una raccolta che


implementa IEnumerable<T> o IQueryable<T> .

( Obbligatorio. Indica l'inizio della proprietà dell'indicizzatore.

index Obbligatorio. Espressione Integer che specifica la posizione in


base zero di un elemento della raccolta.

) Obbligatorio. Indica la fine della proprietà dell'indicizzatore.

Valore restituito
Oggetto dalla posizione specificata nella raccolta o Nothing se l'indice non è compreso nell'intervallo.

Commenti
È possibile usare la proprietà dell'indicizzatore di estensione per accedere ai singoli elementi di una raccolta.
Questa proprietà dell'indicizzatore viene in genere utilizzata nell'output delle proprietà Axis XML. Le proprietà
dell'asse XML figlio e XML discendente restituiscono raccolte di XElement oggetti o un valore di attributo.
Il compilatore Visual Basic converte le proprietà dell'indicizzatore di estensione in chiamate al
ElementAtOrDefault metodo. Diversamente da un indicizzatore di matrici, il ElementAtOrDefault metodo
restituisce Nothing se l'indice non è compreso nell'intervallo. Questo comportamento è utile quando non è
possibile determinare facilmente il numero di elementi in una raccolta.
Questa proprietà dell'indicizzatore è simile a una proprietà di estensione per le raccolte che implementano
IEnumerable<T> o IQueryable<T> : viene utilizzata solo se la raccolta non dispone di un indicizzatore o di una
proprietà predefinita.
Per accedere al valore del primo elemento in una raccolta di XElement oggetti o XAttribute , è possibile usare la
proprietà XML Value . Per ulteriori informazioni, vedere proprietà del valore XML.

Esempio
Nell'esempio seguente viene illustrato come utilizzare l'indicizzatore di estensione per accedere al secondo
nodo figlio in una raccolta di XElement oggetti. È possibile accedere alla raccolta utilizzando la proprietà Axis
figlio, che ottiene tutti gli elementi figlio denominati phone nell' contact oggetto.

Dim contact As XElement =


<contact>
<name>Patrick Hines</name>
<phone type="home">206-555-0144</phone>
<phone type="work">425-555-0145</phone>
</contact>

Console.WriteLine("Second phone number: " & contact.<phone>(1).Value)

Questo codice visualizza il testo seguente:


Second phone number: 425-555-0145

Vedi anche
XElement
Proprietà Axis XML
Valori letterali XML
Creazione di XML in Visual Basic
Proprietà Value XML
Proprietà Value XML (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Consente di accedere al valore del primo elemento di una raccolta di XElement oggetti.

Sintassi
object.Value

Parti
T ERM IN E DEF IN IZ IO N E

object Obbligatorio. Raccolta di oggetti XElement.

Valore restituito
Oggetto String che contiene il valore del primo elemento della raccolta o Nothing se l'insieme è vuoto.

Commenti
La Value proprietà consente di accedere facilmente al valore del primo elemento in una raccolta di XElement
oggetti. Questa proprietà verifica innanzitutto se la raccolta contiene almeno un oggetto. Se la raccolta è vuota,
questa proprietà restituisce Nothing . In caso contrario, questa proprietà restituisce il valore della Value
proprietà del primo elemento nella raccolta.

NOTE
Quando si accede al valore di un attributo XML usando l' @ identificatore '', il valore dell'attributo viene restituito come
String e non è necessario specificare in modo esplicito la Value Proprietà.

Per accedere ad altri elementi di una raccolta, è possibile usare la proprietà dell'indicizzatore di estensione XML.
Per altre informazioni, vedere Proprietà Indexer di estensione.

Ereditarietà
La maggior parte degli utenti non dovrà implementare IEnumerable<T> e pertanto può ignorare questa
sezione.
La Value proprietà è una proprietà di estensione per i tipi che implementano IEnumerable(Of XElement) . Il
binding di questa proprietà di estensione è analogo all'associazione dei metodi di estensione: se un tipo
implementa una delle interfacce e definisce una proprietà con il nome "value", la proprietà ha la precedenza
sulla proprietà di estensione. In altre parole, Value è possibile eseguire l'override di questa proprietà definendo
una nuova proprietà in una classe che implementa IEnumerable(Of XElement) .

Esempio
Nell'esempio seguente viene illustrato come utilizzare la Value proprietà per accedere al primo nodo di una
raccolta di XElement oggetti. Nell'esempio viene utilizzata la proprietà Axis Child per ottenere la raccolta di tutti i
nodi figlio denominati phone presenti nell' contact oggetto.

Dim contact As XElement =


<contact>
<name>Patrick Hines</name>
<phone type="home">206-555-0144</phone>
<phone type="work">425-555-0145</phone>
</contact>

Console.WriteLine("Phone number: " & contact.<phone>.Value)

Questo codice visualizza il testo seguente:


Phone number: 206-555-0144

Esempio
Nell'esempio seguente viene illustrato come ottenere il valore di un attributo XML da una raccolta di XAttribute
oggetti. Nell'esempio viene utilizzata la proprietà axis dell'attributo per visualizzare il valore dell' type attributo
per tutti gli phone elementi.

Dim contact As XElement =


<contact>
<name>Patrick Hines</name>
<phone type="home">206-555-0144</phone>
<phone type="work">425-555-0145</phone>
</contact>

Dim types = contact.<phone>.Attributes("type")

For Each attr In types


Console.WriteLine(attr.Value)
Next

Questo codice visualizza il testo seguente:

home
work

Vedi anche
XElement
IEnumerable<T>
Proprietà Axis XML
Valori letterali XML
Creazione di XML in Visual Basic
Metodi di estensione
Proprietà dell'indicizzatore di estensione
XML Child Axis Property
XML Attribute Axis Property
Valori letterali XML (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Negli argomenti di questa sezione viene illustrata la sintassi dei valori letterali XML in Visual Basic. La sintassi
dei valori letterali XML consente di incorporare XML direttamente nel codice.

Contenuto della sezione


A RGO M EN TO DESC RIZ IO N E

Valore letterale di elemento XML Descrive la sintassi per i valori letterali che rappresentano
oggetti XElement.

Valore letterale di documento XML Descrive la sintassi per i valori letterali che rappresentano
oggetti XDocument.

Valore letterale CDATA XML Descrive la sintassi per i valori letterali che rappresentano
oggetti XCData.

Valore letterale di commento XML Descrive la sintassi per i valori letterali che rappresentano
oggetti XComment.

Valore letterale di istruzione di elaborazione XML Descrive la sintassi per i valori letterali che rappresentano
oggetti XProcessingInstruction.

Vedi anche
XML
Valore letterale elemento XML (Visual Basic)
05/03/2021 • 9 minutes to read • Edit Online

Valore letterale che rappresenta un XElement oggetto.

Sintassi
<name [ attributeList ] />
-or-
<name [ attributeList ] > [ elementContents ] </[ name ]>

Parti
<

Obbligatorio. Apre il tag dell'elemento iniziale.


name

Obbligatorio. Nome dell'elemento. Il formato è uno dei seguenti:


Testo letterale per il nome dell'elemento, nel formato [ePrefix:]eName , dove:

PA RT E DESC RIZ IO N E

ePrefix Facoltativa. Prefisso dello spazio dei nomi XML per


l'elemento. Deve essere uno spazio dei nomi XML
globale definito con un' Imports istruzione nel file o
a livello di progetto o uno spazio dei nomi XML
locale definito in questo elemento o in un elemento
padre.

eName Obbligatorio. Nome dell'elemento. Il formato è uno


dei seguenti:

-Testo letterale. Vedere nomi di elementi e attributi


XML dichiarati.
-Espressione incorporata del form
<%= eNameExp %> . Il tipo di eNameExp deve essere
String o un tipo convertibile in modo implicito in
XName .

Espressione incorporata del form <%= nameExp %> . Il tipo di nameExp deve essere String o un
tipo convertibile in modo implicito in XName . Espressione incorporata non consentita in un tag di
chiusura di un elemento.
attributeList

facoltativo. Elenco di attributi dichiarati nel valore letterale.


attribute [ attribute ... ]

Ogni attribute ha una delle seguenti sintassi:


Assegnazione di attributi, nel formato [aPrefix:]aName=aValue , dove:

PA RT E DESC RIZ IO N E

aPrefix Facoltativa. Prefisso dello spazio dei nomi XML per


l'attributo. Deve essere uno spazio dei nomi XML
globale definito con un' Imports istruzione o uno
spazio dei nomi XML locale definito in questo
elemento o in un elemento padre.

aName Obbligatorio. Nome dell'attributo. Il formato è uno


dei seguenti:

-Testo letterale. Vedere nomi di elementi e attributi


XML dichiarati.
-Espressione incorporata del form
<%= aNameExp %> . Il tipo di aNameExp deve essere
String o un tipo convertibile in modo implicito in
XName .

aValue facoltativo. Valore dell'attributo. Il formato è uno dei


seguenti:

-Testo letterale, racchiuso tra virgolette.


-Espressione incorporata del form
<%= aValueExp %> . Qualsiasi tipo è consentito.

Espressione incorporata del form <%= aExp %> .


/>

facoltativo. Indica che l'elemento è un elemento vuoto, senza contenuto.


>

Obbligatorio. Termina il tag dell'elemento iniziale o vuoto.


elementContents

facoltativo. Contenuto dell'elemento.


content [ content ... ]

Ognuno content può essere uno dei seguenti:


Testo letterale. Tutti gli spazi vuoti in elementContents diventano significativi se è presente un testo
letterale.
Espressione incorporata del form <%= contentExp %> .
Valore letterale elemento XML.
Valore letterale del commento XML. Vedere valore letterale del commento XML.
Valore letterale istruzione di elaborazione XML. Vedere valore letterale istruzione di elaborazione
XML.
Valore letterale CDATA XML. Vedere valore letterale CDATA XML.
</[name]>

facoltativo. Rappresenta il tag di chiusura per l'elemento. Il name parametro facoltativo non è consentito
quando è il risultato di un'espressione incorporata.

Valore restituito
Oggetto XElement.

Commenti
È possibile utilizzare la sintassi dei valori letterali dell'elemento XML per creare XElement oggetti nel codice.

NOTE
Un valore letterale XML può estendersi su più righe senza usare caratteri di continuazione di riga. Questa funzionalità
consente di copiare il contenuto da un documento XML e incollarlo direttamente in un programma Visual Basic.

Le espressioni incorporate del form <%= exp %> consentono di aggiungere informazioni dinamiche a un valore
letterale elemento XML. Per ulteriori informazioni, vedere espressioni incorporate in XML.
Il compilatore Visual Basic converte il valore letterale dell'elemento XML in chiamate al XElement costruttore e,
se necessario, il XAttribute costruttore.

Spazi dei nomi XML


I prefissi degli spazi dei nomi XML sono utili quando è necessario creare valori letterali XML con gli elementi
dello stesso spazio dei nomi più volte nel codice. È possibile utilizzare i prefissi degli spazi dei nomi XML globali,
definiti utilizzando l' Imports istruzione o prefissi locali, definiti utilizzando la xmlns:xmlPrefix="xmlNamespace"
sintassi dell'attributo. Per altre informazioni, vedere istruzione Imports (spazio dei nomi XML).
In conformità alle regole di ambito per gli spazi dei nomi XML, i prefissi locali hanno la precedenza sui prefissi
globali. Tuttavia, se un valore letterale XML definisce uno spazio dei nomi XML, tale spazio dei nomi non è
disponibile per le espressioni visualizzate in un'espressione incorporata. L'espressione incorporata può accedere
solo allo spazio dei nomi XML globale.
Il compilatore Visual Basic converte tutti gli spazi dei nomi XML globali utilizzati da un valore letterale XML in
una definizione di uno spazio dei nomi locale nel codice generato. Gli spazi dei nomi XML globali non utilizzati
non vengono visualizzati nel codice generato.

Esempio
Nell'esempio seguente viene illustrato come creare un elemento XML semplice con due elementi vuoti annidati.

Dim test1 As XElement =


<outer>
<inner1></inner1>
<inner2/>
</outer>

Console.WriteLine(test1)

Nell'esempio viene visualizzato il testo seguente. Si noti che il valore letterale conserva la struttura degli
elementi vuoti.
<outer>
<inner1></inner1>
<inner2 />
</outer>

Esempio
Nell'esempio seguente viene illustrato come utilizzare le espressioni incorporate per assegnare un nome a un
elemento e creare attributi.

Dim elementType = "book"


Dim authorName = "My Author"
Dim attributeName1 = "year"
Dim attributeValue1 = 1999
Dim attributeName2 = "title"
Dim attributeValue2 = "My Book"

Dim book As XElement =


<<%= elementType %>
isbn="1234"
author=<%= authorName %>
<%= attributeName1 %>=<%= attributeValue1 %>
<%= New XAttribute(attributeName2, attributeValue2) %>
/>

Console.WriteLine(book)

Questo codice visualizza il testo seguente:

<book isbn="1234" author="My Author" year="1999" title="My Book" />

Esempio
Nell'esempio seguente viene dichiarato ns come un prefisso dello spazio dei nomi XML. USA quindi il prefisso
dello spazio dei nomi per creare un valore letterale XML e visualizza il formato finale dell'elemento.

' Place Imports statements at the top of your program.


Imports <xmlns:ns="http://SomeNamespace">

Class TestClass1

Shared Sub TestPrefix()


' Create test using a global XML namespace prefix.
Dim inner2 = <ns:inner2/>

Dim test =
<ns:outer>
<ns:middle xmlns:ns="http://NewNamespace">
<ns:inner1/>
<%= inner2 %>
</ns:middle>
</ns:outer>

' Display test to see its final form.


Console.WriteLine(test)
End Sub

End Class
Questo codice visualizza il testo seguente:

<ns:outer xmlns:ns="http://SomeNamespace">
<ns:middle xmlns:ns="http://NewNamespace">
<ns:inner1 />
<inner2 xmlns="http://SomeNamespace" />
</ns:middle>
</ns:outer>

Si noti che il compilatore ha convertito il prefisso dello spazio dei nomi XML globale in una definizione di
prefisso per lo spazio dei nomi XML. L' <ns:middle> elemento ridefinisce il prefisso dello spazio dei nomi XML
per l' <ns:inner1> elemento. Tuttavia, l' <ns:inner2> elemento utilizza lo spazio dei nomi definito dall' Imports
istruzione.

Vedi anche
XElement
Nomi di elementi e attributi XML dichiarati
Valore letterale di commento XML
Valore letterale CDATA XML
Valori letterali XML
Creazione di XML in Visual Basic
Espressioni incorporate in XML
Istruzione Imports (spazio dei nomi XML)
Valore letterale di documento XML (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Valore letterale che rappresenta un XDocument oggetto.

Sintassi
<?xml version="1.0" [encoding="encoding"] [standalone="standalone"] ?>
[ piCommentList ]
rootElement
[ piCommentList ]

Parti
T ERM IN E DEF IN IZ IO N E

encoding facoltativo. Testo letterale che dichiara la codifica utilizzata dal


documento.

standalone facoltativo. Testo letterale. Deve essere "Yes" o "No".

piCommentList facoltativo. Elenco di istruzioni di elaborazione XML e


commenti XML. Accetta il formato seguente:

piComment [ piComment ... ]

Ognuno piComment può essere uno dei seguenti:

- Valore letterale istruzione di elaborazione XML.


- Valore letterale del commento XML.

rootElement Obbligatorio. Elemento radice del documento. Il formato è


uno dei seguenti:

Valore letterale elemento XML.


Espressione incorporata del form <%= elementExp
%> . elementExp Restituisce uno dei seguenti
elementi:

Oggetto XElement.
Raccolta che contiene un XElement oggetto e
un numero qualsiasi di XProcessingInstruction
XComment oggetti e.

Per ulteriori informazioni, vedere espressioni incorporate in


XML.

Valore restituito
Oggetto XDocument.
Commenti
Un valore letterale di documento XML viene identificato dalla dichiarazione XML all'inizio del valore letterale.
Sebbene ogni valore letterale del documento XML debba contenere esattamente un elemento XML radice, può
includere un numero qualsiasi di istruzioni di elaborazione XML e commenti XML.
Un valore letterale di documento XML non può essere incluso in un elemento XML.

NOTE
Un valore letterale XML può estendersi su più righe senza usare caratteri di continuazione di riga. In questo modo è
possibile copiare il contenuto da un documento XML e incollarlo direttamente in un programma Visual Basic.

Il compilatore Visual Basic converte il valore letterale del documento XML in chiamate ai XDocument
XDeclaration costruttori e.

Esempio
Nell'esempio seguente viene creato un documento XML con una dichiarazione XML, un'istruzione di
elaborazione, un commento e un elemento che contiene un altro elemento.

Dim libraryRequest As XDocument =


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="show_book.xsl"?>
<!-- Tests that the application works. -->
<books>
<book/>
</books>
Console.WriteLine(libraryRequest)

Vedi anche
XElement
XProcessingInstruction
XComment
XDocument
Valore letterale di istruzione di elaborazione XML
Valore letterale di commento XML
Valore letterale di elemento XML
Valori letterali XML
Creazione di XML in Visual Basic
Espressioni incorporate in XML
Valore letterale CDATA XML (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Valore letterale che rappresenta un XCData oggetto.

Sintassi
<![CDATA[content]]>

Parti
<![CDATA[
Obbligatorio. Indica l'inizio della sezione CDATA XML.
content
Obbligatorio. Contenuto di testo da visualizzare nella sezione CDATA XML.
]]>
Obbligatorio. Indica la fine della sezione.

Valore restituito
Oggetto XCData.

Commenti
Le sezioni CDATA XML contengono testo non elaborato che deve essere incluso, ma non analizzato, con il codice
XML che lo contiene. Una sezione CDATA XML può contenere testo. Sono inclusi i caratteri XML riservati. La
sezione CDATA XML termina con la sequenza "]] >". Questo implica i seguenti punti:
Non è possibile usare un'espressione incorporata in un valore letterale CDATA XML perché i delimitatori
di espressioni incorporati sono contenuti CDATA XML validi.
Le sezioni CDATA XML non possono essere annidate, perché content non possono contenere il valore "]]
>".
È possibile assegnare un valore letterale CDATA XML a una variabile o includerlo in un valore letterale elemento
XML.

NOTE
Un valore letterale XML può estendersi su più righe, ma non utilizza caratteri di continuazione di riga. In questo modo è
possibile copiare il contenuto da un documento XML e incollarlo direttamente in un programma Visual Basic.

Il compilatore Visual Basic converte il valore letterale CDATA XML in una chiamata al XCData costruttore.

Esempio
Nell'esempio seguente viene creata una sezione CDATA che contiene il testo "può contenere <XML> tag
letterali".
Dim cdata As XCData = <![CDATA[Can contain literal <XML> tags]]>

Vedi anche
XCData
Valore letterale di elemento XML
Valori letterali XML
Creazione di XML in Visual Basic
Valore letterale di commento XML (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Valore letterale che rappresenta un XComment oggetto.

Sintassi
<!-- content -->

Parti
T ERM IN E DEF IN IZ IO N E

<!-- Obbligatorio. Indica l'inizio del commento XML.

content Obbligatorio. Testo da visualizzare nel commento XML. Non


può contenere una serie di due trattini (--) o terminare con
un trattino adiacente al tag di chiusura.

--> Obbligatorio. Indica la fine del commento XML.

Valore restituito
Oggetto XComment.

Commenti
I valori letterali del commento XML non contengono contenuto del documento; contengono informazioni sul
documento. La sezione del commento XML termina con la sequenza "-->". Questo implica i seguenti punti:
Non è possibile usare un'espressione incorporata in un valore letterale di commento XML perché i
delimitatori di espressioni incorporati sono contenuti di commenti XML validi.
Le sezioni di commento XML non possono essere annidate, perché content non possono contenere il
valore "-->".
È possibile assegnare un valore letterale di commento XML a una variabile oppure è possibile includerlo in un
valore letterale elemento XML.

NOTE
Un valore letterale XML può estendersi su più righe senza usare caratteri di continuazione di riga. Questa funzionalità
consente di copiare il contenuto da un documento XML e incollarlo direttamente in un programma Visual Basic.

Il compilatore Visual Basic converte il valore letterale del commento XML in una chiamata al XComment
costruttore.

Esempio
Nell'esempio seguente viene creato un commento XML che contiene il testo "questo è un commento".

Dim com As XComment = <!-- This is a comment -->

Vedi anche
XComment
Valore letterale di elemento XML
Valori letterali XML
Creazione di XML in Visual Basic
Valore letterale istruzione di elaborazione XML
(Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Valore letterale che rappresenta un XProcessingInstruction oggetto.

Sintassi
<?piName [ = piData ] ?>

Parti
<?
Obbligatorio. Indica l'inizio del valore letterale di istruzione di elaborazione XML.
piName
Obbligatorio. Nome che indica l'applicazione di destinazione dell'istruzione di elaborazione. Impossibile iniziare
con "XML" o "XML".
piData
facoltativo. Stringa che indica il modo in cui l'applicazione di destinazione piName deve elaborare il documento
XML.
?>
Obbligatorio. Indica la fine dell'istruzione di elaborazione.

Valore restituito
Oggetto XProcessingInstruction.

Commenti
I valori letterali di istruzione di elaborazione XML indicano in che modo le applicazioni devono elaborare un
documento XML. Quando un'applicazione carica un documento XML, l'applicazione è in grado di controllare le
istruzioni di elaborazione XML per determinare la modalità di elaborazione del documento. L'applicazione
interpreta il significato di piName e piData .
Il valore letterale del documento XML utilizza una sintassi simile a quella dell'istruzione di elaborazione XML. Per
altre informazioni, vedere valore letterale documento XML.

NOTE
L' piName elemento non può iniziare con le stringhe "XML" o "XML", perché la specifica xml 1,0 riserva tali identificatori.

È possibile assegnare un valore letterale di istruzione di elaborazione XML a una variabile o includerlo in un
valore letterale di documento XML.
NOTE
Un valore letterale XML può estendersi su più righe senza dover utilizzare caratteri di continuazione di riga. In questo
modo è possibile copiare il contenuto da un documento XML e incollarlo direttamente in un programma Visual Basic.

Il compilatore Visual Basic converte il valore letterale di istruzione di elaborazione XML in una chiamata al
XProcessingInstruction costruttore.

Esempio
Nell'esempio seguente viene creata un'istruzione di elaborazione che identifica un foglio di stile per un
documento XML.

Dim pi As XProcessingInstruction =
<?xml-stylesheet type="text/xsl" href="show_book.xsl"?>

Vedi anche
XProcessingInstruction
Valore letterale di documento XML
Valori letterali XML
Creazione di XML in Visual Basic
Messaggi di errore in Visual Basic
05/03/2021 • 3 minutes to read • Edit Online

Quando si compila o si esegue un'applicazione Visual Basic, possono verificarsi i seguenti tipi di errori:
Errori in fase di compilazione, che si verificano durante la compilazione di un'applicazione.
Errori di run-time, che si verificano quando un'applicazione è in esecuzione.
Per altre informazioni sulla risoluzione di problemi specifici, vedere Risorse aggiuntive per i programmatori
Visual Basic.

Errori di run-time
Se un'applicazione Visual Basic tenta di eseguire un'azione che il sistema non è in grado di eseguire, si verifica
un errore di run-time e Visual Basic genera un Exception oggetto. Visual Basic possibile generare errori
personalizzati di qualsiasi tipo di dati, inclusi Exception gli oggetti, utilizzando l' Throw istruzione.
Un'applicazione può identificare l'errore visualizzando il numero e il messaggio di errore di un'eccezione
rilevata. Se non viene rilevato alcun errore, l'applicazione termina.
Il codice può intercettare e analizzare errori di runtime. Se si include il codice che genera l'errore in un blocco
Try , è possibile rilevare qualsiasi errore generato all'interno di un blocco Catch corrispondente. Per
informazioni su come intercettare gli errori di runtime e gestirli nel codice, vedere Istruzione Try...Catch...Finally.

Errori in fase di compilazione


Se il compilatore Visual Basic rileva un errore nel codice, si verifica un errore in fase di compilazione. Nell'editor
di codice di Visual Studio è possibile identificare facilmente la riga di codice che ha causato l'errore perché viene
visualizzata una linea ondulata sotto la riga di codice. Per visualizzare il messaggio di errore, posizionare il
mouse sulla linea ondulata o aprire Elenco errori , in cui sono riportati anche altri messaggi.
Se un identificatore ha una sottolineatura ondulata e viene visualizzata una sottolineatura breve sotto il carattere
più a destra, è possibile generare uno stub per la classe, il costruttore, il metodo, la proprietà, il campo o
l'enumerazione. Per altre informazioni, vedere generazione da utilizzo (Visual Studio).
La risoluzione degli avvisi visualizzati dal compilatore Visual Basic consente di scrivere codice più veloce e con
meno bug. Questi avvisi identificano il codice che può generare errori durante l'esecuzione dell'applicazione. Ad
esempio, il compilatore genera un avviso quando si cerca di chiamare un membro di una variabile di oggetto
non assegnata, di completare l'esecuzione di una funzione senza impostare il valore restituito o di eseguire un
blocco Try con errori nel codice per l'intercettazione delle eccezioni. Per altre informazioni sugli avvisi, incluso
il modo di attivarli e disattivarli, vedere Configurazione degli avvisi in Visual Basic.
BC30663: <attributename> Impossibile applicare
più volte l'attributo ''
05/03/2021 • 2 minutes to read • Edit Online

L'attributo può essere applicato una sola volta. L' AttributeUsage attributo determina se un attributo può essere
applicato più di una volta.
ID errore: BC30663

Per correggere l'errore


1. Verificare che l'attributo venga applicato una sola volta.
2. Se si usano attributi personalizzati sviluppati, provare a modificare l' AttributeUsage attributo per
consentire l'utilizzo di più attributi, come nell'esempio seguente.

<AttributeUsage(AllowMultiple := True)>

Vedi anche
AttributeUsageAttribute
Creazione di attributi personalizzati
AttributeUsage
<attribute>Non è possibile applicare BC32500:''
perché il formato del GUID ' <number> ' non è
corretto
05/03/2021 • 2 minutes to read • Edit Online

Un COMClassAttribute blocco di attributi specifica un identificatore univoco globale (Guid) che non è conforme
al formato appropriato per un GUID. COMClassAttribute USA i GUID per identificare in modo univoco la classe,
l'interfaccia e l'evento di creazione.
Un GUID è composto da 16 byte (otto byte numerici seguiti da otto byte binari). Viene generato da utilità
Microsoft, ad esempio uuidgen.exe, ed è garantito che sia univoco nello spazio e nel tempo.
ID errore: BC32500

Per correggere l'errore


1. Determinare il GUID o i GUID corretti necessari per identificare l'oggetto COM.
2. Verificare che le stringhe GUID presentate al blocco di attributi COMClassAttribute siano copiate
correttamente.

Vedi anche
Guid
Panoramica degli attributi
BC30014:' #ElseIf ' deve essere preceduto da un
elemento ' #If ' o ' #ElseIf ' corrispondente
05/03/2021 • 2 minutes to read • Edit Online

#ElseIf è una direttiva di compilazione condizionale. Una #ElseIf clausola deve essere preceduta da una #If
clausola OR corrispondente #ElseIf .
ID errore: BC30014

Per correggere l'errore


1. Verificare che un oggetto #If o precedente #ElseIf non sia stato separato da questo oggetto #ElseIf
mediante un blocco di compilazione condizionale o un oggetto inserito in modo errato #End If .
2. Se #ElseIf è preceduto da una #Else direttiva, rimuovere #Else o modificare il valore in un oggetto
#ElseIf .
3. Se tutti gli altri elementi sono in ordine, aggiungere una direttiva #If all'inizio del blocco di
compilazione condizionale.

Vedi anche
#If... Direttive then... #Else
BC32025: le istruzioni ' #Region ' è #End Region '
non sono valide nei corpi di metodi/espressioni
lambda su più righe
05/03/2021 • 2 minutes to read • Edit Online

Il #Region blocco deve essere dichiarato a livello di classe, modulo o spazio dei nomi. Un'area comprimibile può
includere una o più procedure, ma non può iniziare o terminare all'interno di una routine.
ID errore: BC32025

Per correggere l'errore


1. Verificare che la procedura precedente sia terminata correttamente con End Function un' End Sub
istruzione o.
2. Verificare che le #Region #End Region direttive e si trovino nello stesso blocco di codice.

Vedi anche
#Region (direttiva)
BC40029:' <classname> ' non è conforme a CLS
perché l'interfaccia ' <interfacename> '
implementata non è conforme a CLS
05/03/2021 • 2 minutes to read • Edit Online

Una classe o interfaccia è contrassegnata come <CLSCompliant(True)> quando deriva da o implementa un tipo
contrassegnato come <CLSCompliant(False)> o non è contrassegnata.
Affinché una classe o un'interfaccia sia conforme al linguaggio di indipendenza e Language-Independent
componenti (CLS), l'intera gerarchia di ereditarietà deve essere conforme. Ciò significa che ogni tipo da cui
eredita, direttamente o indirettamente, deve essere conforme. Analogamente, se una classe implementa una o
più interfacce, esse devono essere tutte conformi nelle relative gerarchie di ereditarietà.
Quando CLSCompliantAttribute viene applicato a un elemento di programmazione, il parametro isCompliant
dell'attributo viene impostato su True o False per indicare la conformità o la non conformità. L'impostazione
predefinita per questo parametro non è disponibile, quindi è necessario specificare un valore.
Se a un elemento non viene applicato CLSCompliantAttribute , l'elemento non sarà considerato conforme.
Per impostazione predefinita, si tratta di un messaggio di avviso. Per informazioni su come nascondere gli avvisi
o considerarli come errori, vedere Configuring Warnings in Visual Basic.
ID errore: BC40029

Per correggere l'errore


Se è necessaria la conformità a CLS, definire il tipo all'interno di uno schema di implementazione o una
gerarchia di ereditarietà diversi.
Se è necessario che questo tipo resti all'interno dello schema di implementazione o della gerarchia di
ereditarietà corrente, rimuovere CLSCompliantAttribute dalla relativa definizione o contrassegnarlo come
<CLSCompliant(False)> .
BC40008:' <elementname> ' è obsoleto (Visual
Basic avviso)
05/03/2021 • 2 minutes to read • Edit Online

Un'istruzione prova ad accedere a un elemento di programmazione che è stato contrassegnato con l'attributo
ObsoleteAttribute e la direttiva di considerarlo come un avviso.
È possibile contrassegnare qualsiasi elemento di programmazione come non più in uso applicando
ObsoleteAttribute a tale elemento. In questo caso, è possibile impostare la proprietà IsError dell'attributo su
True o False . Se si imposta la proprietà su True , il compilatore considera il tentativo di usare l'elemento
come un errore. Se si imposta la proprietà su False , o si lascia l'impostazione predefinita False , il compilatore
genera un avviso se si prova a usare l'elemento.
Per impostazione predefinita, si tratta di un messaggio di avviso perché la proprietà IsError di ObsoleteAttribute
è False . Per altre informazioni su come nascondere gli avvisi o considerarli come errori, vedere Configuring
Warnings in Visual Basic.
ID errore: BC40008

Per correggere l'errore


Verificare che nel riferimento del codice sorgente il nome dell'elemento sia stato digitato correttamente.

Vedi anche
Panoramica degli attributi
BC32022:' <eventname> ' è un evento e non può
essere chiamato direttamente
05/03/2021 • 2 minutes to read • Edit Online

' < eventname >' è un evento e non può essere chiamato direttamente. Utilizzare un' RaiseEvent istruzione per
generare un evento.
Una chiamata di routine specifica un evento per il nome della stored procedure. Un gestore eventi è una routine,
ma l'evento stesso è un dispositivo di segnalazione, che deve essere generato e gestito.
ID errore: BC32022

Per correggere l'errore


Utilizzare un' RaiseEvent istruzione per segnalare un evento e richiamare la procedura o le procedure che la
gestiscono.

Vedi anche
Istruzione RaiseEvent
BC32061: <expression> non è possibile usare ''
come vincolo di tipo
05/03/2021 • 2 minutes to read • Edit Online

Un elenco di vincoli comprende un'espressione che non rappresenta un vincolo valido per un parametro di tipo.
Un elenco di vincoli impone requisiti per l'argomento di tipo passato al parametro di tipo. Si possono specificare
i requisiti seguenti in qualsiasi combinazione:
L'argomento di tipo deve implementare una o più interfacce
L'argomento di tipo deve ereditare al massimo da una classe
L'argomento di tipo deve esporre un costruttore senza parametri a cui il codice di creazione possa
accedere (includere il vincolo New )
Se non si include alcuna classe o interfaccia specifica nell'elenco di vincoli, è possibile imporre un requisito più
generale specificando una delle condizioni seguenti:
L'argomento di tipo deve essere un tipo valore (includere il vincolo Structure )
L'argomento di tipo deve essere un tipo riferimento (includere il vincolo Class )
Non è possibile specificare sia Structure che Class per lo stesso parametro di tipo e non è possibile
specificare uno dei due vincoli più volte.
ID errore: BC32061

Per correggere l'errore


Verificare che l'espressione e i suoi elementi siano digitati correttamente.
Se l'espressione non soddisfa l'elenco di requisiti precedente, rimuoverla dall'elenco di vincoli.
Se l'espressione fa riferimento a un'interfaccia o a una classe, verificare che il compilatore possa accedere
a quell'interfaccia o a quella classe. Potrebbe essere necessario qualificarne il nome e anche aggiungere
un riferimento al progetto. Per ulteriori informazioni, vedere "riferimenti ai progetti" in riferimenti a
elementi dichiarati.

Vedi anche
Generic Types in Visual Basic
Tipi di valore e tipi di riferimento
References to Declared Elements
BC30766:' <functionname> ' non è dichiarato
(errore del compilatore Smart Device/Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

< functionname > non è dichiarata. La funzionalità di I/O dei file è in genere disponibile nello spazio dei nomi
Microsoft.VisualBasic , ma non è supportata dalla versione di destinazione di .NET Compact Framework.

ID errore: BC30766

Per correggere l'errore


Eseguire operazioni su file con funzioni definite nello spazio dei nomi System.IO .

Vedi anche
System.IO
Accesso ai file con Visual Basic
BC42015:' <interfacename> . <membername> ' è
già implementato dalla classe base '
<baseclassname> '. Prevista nuova
implementazione di <type>
05/03/2021 • 2 minutes to read • Edit Online

Una proprietà, una routine o un evento in una classe derivata usa una Implements clausola che specifica un
membro di interfaccia già implementato nella classe di base.
Una classe derivata può reimplementare un membro di interfaccia implementato dalla sua classe base. Questo
non equivale a eseguire l'override dell'implementazione della classe base. Per altre informazioni, vedere
Implements.
Per impostazione predefinita, si tratta di un messaggio di avviso. Per informazioni su come nascondere gli avvisi
o considerarli come errori, vedere Configuring Warnings in Visual Basic.
ID errore: BC42015

Per correggere l'errore


Se si intende reimplementare il membro di interfaccia, non occorre fare nulla. Il codice della classe
derivata accede al membro reimplementato a meno che non si usi la MyBase parola chiave per accedere
all'implementazione della classe di base.
Se non si intende reimplementare il membro di interfaccia, rimuovere la clausola Implements dalla
dichiarazione di proprietà, routine o evento.

Vedi anche
Interfacce
BC30043:' <keyword> ' è valido solo all'interno di
un metodo di istanza
05/03/2021 • 2 minutes to read • Edit Online

Le Me MyClass MyBase parole chiave, e si riferiscono a specifiche istanze di classe. Non è possibile usarli
all'interno di una Function routine o condivisa Sub .
ID errore:* BC30043

Per correggere l'errore


Rimuovere la parola chiave dalla routine oppure rimuovere la Shared parola chiave dalla dichiarazione di
routine.

Vedi anche
Assegnazione di variabili oggetto
Me, My, MyBase e MyClass
Nozioni fondamentali sull'ereditarietà
BC30909:' <membername> ' non può esporre il
tipo ' <typename> ' all'esterno del progetto
mediante <containertype> ' <containertypename>
'
05/03/2021 • 2 minutes to read • Edit Online

Una variabile, un parametro di routine o un valore restituito dalla funzione viene esposto all'esterno del relativo
contenitore, ma viene dichiarato come un tipo che non deve essere esposto all'esterno del contenitore.
Il codice di scheletro seguente mostra una situazione che genera questo errore.

Private Class privateClass


End Class
Public Class mainClass
Public exposedVar As New privateClass
End Class

Un tipo dichiarato,, Protected Friend Protected Friend o Private è progettato per avere accesso limitato al
di fuori del contesto di dichiarazione. Il suo utilizzo come tipo di dati di una variabile con accesso meno limitato
comporterebbe la sconfitta di questo scopo. Nel codice di scheletro precedente, exposedVar è Public ed
esporrebbe privateClass a codice che non dovrebbe avere accesso a tale codice.
ID errore: BC30909

Per correggere l'errore


Modificare il livello di accesso della variabile, il parametro di routine o la funzione Return in modo che sia
almeno restrittivo come livello di accesso del tipo di dati.

Vedi anche
Livelli di accesso in Visual Basic
BC30685:' <membername> ' è ambiguo tra le
interfacce ereditate ' <interfacename1> ' è
<interfacename2> '
05/03/2021 • 2 minutes to read • Edit Online

L'interfaccia eredita due o più membri con lo stesso nome da più interfacce.
ID errore: BC30685

Per correggere l'errore


Eseguire il cast del valore all'interfaccia di base che si desidera utilizzare. Per esempio:

Interface Left
Sub MySub()
End Interface

Interface Right
Sub MySub()
End Interface

Interface LeftRight
Inherits Left, Right
End Interface

Module test
Sub Main()
Dim x As LeftRight
' x.MySub() 'x is ambiguous.
CType(x, Left).MySub() ' Cast to base type.
CType(x, Right).MySub() ' Call the other base type.
End Sub
End Module

Vedi anche
Interfacce
BC30971: <message> questo errore può essere
dovuto anche alla combinazione di un riferimento
file con un riferimento di progetto all'assembly '
<assemblyname> '
05/03/2021 • 2 minutes to read • Edit Online

<message> Questo errore può essere dovuto anche alla combinazione di un riferimento di file con un
riferimento di progetto all'assembly <assemblyname> . In questo caso, provare a sostituire il riferimento file
<assemblyfilename> con '' nel progetto ' <projectname1> ' con un riferimento al progetto a' <projectname2>
'.
Il codice del progetto accede a un membro di un altro progetto, ma la configurazione della soluzione non
consente al compilatore Visual Basic di risolvere il riferimento.
Per accedere a un tipo definito in un altro assembly, il compilatore Visual Basic deve avere un riferimento a tale
assembly. Deve trattarsi di un riferimento unico, non ambiguo, che non generi riferimenti circolari tra i progetti.
ID errore: BC30971

Per correggere l'errore


1. Determinare quale progetto produce l'assembly migliore per il progetto a cui fare riferimento. Per questa
decisione si potrebbero usare criteri quali la facilità di accesso al file e la frequenza di aggiornamenti.
2. Nelle proprietà del progetto aggiungere un riferimento al progetto contenente l'assembly che definisce il
tipo in uso.

Vedi anche
Gestione dei riferimenti in un progetto
References to Declared Elements
Gestione delle proprietà di progetti e soluzioni
Risoluzione dei problemi relativi ai riferimenti interrotti
BC30269:' <methodname> ' ha più definizioni con
firme identiche
05/03/2021 • 2 minutes to read • Edit Online

Una Function Sub dichiarazione di routine o usa il nome della procedura e l'elenco di argomenti identici di
una dichiarazione precedente. Una delle possibili cause è il tentativo di eseguire l'overload della routine
originale. Le routine di overload devono contenere elenchi di argomenti diversi.
ID errore: BC30269

Per correggere l'errore


Modificare il nome della stored procedure o l'elenco degli argomenti oppure rimuovere la dichiarazione
duplicata.

Vedi anche
References to Declared Elements
Considerazioni sull'overload di routine
BC30560:' <name> ' è ambiguo nello spazio dei
nomi ' <namespacename> '
05/03/2021 • 2 minutes to read • Edit Online

È stato specificato un nome che è ambiguo ed è quindi in conflitto con un altro nome. Il compilatore Visual Basic
non dispone di alcuna regola di risoluzione dei conflitti; è necessario evitare di ambiguare i nomi.
ID errore: BC30560

Per correggere l'errore


Specificare un nome completo.

Vedi anche
Spazi dei nomi in Visual Basic
Istruzione Namespace
BC30561:' <name1> ' è ambiguo ed è importato
dagli spazi dei nomi o dai tipi ' <name2> '
05/03/2021 • 2 minutes to read • Edit Online

È stato specificato un nome che è ambiguo ed è quindi in conflitto con un altro nome. Il compilatore Visual Basic
non dispone di alcuna regola di risoluzione dei conflitti; è necessario evitare di ambiguare i nomi.
ID errore: BC30561

Per correggere l'errore


Evitare ambiguità nel nome rimuovendo le importazioni dello spazio dei nomi.
Specificare un nome completo.

Vedi anche
Istruzione Imports (tipo e spazio dei nomi .NET)
Spazi dei nomi in Visual Basic
Istruzione Namespace
BC40035: <proceduresignature1> non è conforme a
CLS perché viene sottoposto a
<proceduresignature2> Overload che differisce da
esso solo per la matrice dei tipi di parametro di
matrice o per il rango dei tipi di parametro di
matrice
05/03/2021 • 2 minutes to read • Edit Online

Una routine o una proprietà è contrassegnata come <CLSCompliant(True)> quando esegue l'override di un'altra
routine o proprietà e l'unica differenza tra gli elenchi di parametri è il livello di nidificazione di una matrice di
matrici o il rango di una matrice.
Nelle dichiarazioni seguenti la seconda e la terza dichiarazione generano questo errore:
Overloads Sub ProcessArray(arrayParam() As Integer)

Overloads Sub ProcessArray(arrayParam()() As Integer)

Overloads Sub ProcessArray(arrayParam(,) As Integer)

La seconda dichiarazione modifica il parametro unidimensionale originale arrayParam in una matrice di matrici.
La terza dichiarazione viene modificata arrayParam in una matrice bidimensionale (Rank 2). Mentre Visual Basic
consente agli overload di differire solo per una di queste modifiche, tale overload non è conforme all'
indipendenza dal linguaggio e ai componenti di Language-Independent (CLS).
Quando CLSCompliantAttribute viene applicato a un elemento di programmazione, il parametro isCompliant
dell'attributo viene impostato su True o False per indicare la conformità o la non conformità. L'impostazione
predefinita per questo parametro non è disponibile, quindi è necessario specificare un valore.
Se a un elemento non viene applicato CLSCompliantAttribute , l'elemento non sarà considerato conforme.
Per impostazione predefinita, si tratta di un messaggio di avviso. Per informazioni su come nascondere gli avvisi
o considerarli come errori, vedere Configuring Warnings in Visual Basic.
ID errore: BC40035

Per correggere l'errore


Se è necessaria la conformità a CLS, definire gli overload per distinguerli tra loro in più modi rispetto alle
modifiche citate in questa pagina della guida.
Se è necessario che gli overload differiscano solo per le modifiche citate in questa pagina della guida,
rimuovere le CLSCompliantAttribute dalle definizioni o contrassegnarle come <CLSCompliant(False)> .

Vedi anche
Overload della routine
Overload
BC30154: <type1> ' <typename> ' deve
implementare '' <membername> per l'interfaccia '
<interfacename> '
05/03/2021 • 2 minutes to read • Edit Online

' <typename> ' deve implementare '' <membername> per l'interfaccia ' <interfacename> '. La proprietà di
implementazione deve avere identificatori ' ReadOnly '/' WriteOnly ' corrispondenti.
Una classe o una struttura attestazioni per implementare un'interfaccia ma non implementa una routine, una
proprietà o un evento definito dall'interfaccia. È necessario implementare tutti i membri dell'interfaccia.
ID errore: BC30154

Per correggere l'errore


1. Dichiarare un membro con lo stesso nome e la stessa firma definiti nell'interfaccia. Assicurarsi di
includere almeno l' End Function End Sub istruzione, o End Property .
2. Aggiungere una Implements clausola alla fine dell' Function Sub istruzione,, Property o Event . Ad
esempio:

Public Event ItHappened() Implements IBaseInterface.ItHappened

3. Quando si implementa una proprietà, assicurarsi che ReadOnly o WriteOnly venga usato nello stesso
modo in cui si trova nella definizione dell'interfaccia.
4. Quando si implementa una proprietà, Get dichiarare Set le routine e, a seconda delle esigenze.

Vedi anche
Istruzione Implements
Interfacce
BC30149: <type1> ' <typename> ' deve
implementare '' <methodname> per l'interfaccia '
<interfacename> '
05/03/2021 • 2 minutes to read • Edit Online

Una classe o una struttura attestazioni per implementare un'interfaccia ma non implementa una routine definita
dall'interfaccia. È necessario implementare tutti i membri dell'interfaccia.
ID errore: BC30149

Per correggere l'errore


1. Dichiarare una routine con lo stesso nome e la stessa firma definiti nell'interfaccia. Assicurarsi di
includere almeno l' End Function End Sub istruzione o.
2. Aggiungere una Implements clausola alla fine dell' Function Sub istruzione o. Ad esempio:

Public Sub DoSomething() Implements IBaseInterface.DoSomething

Vedere anche
Istruzione Implements
Interfacce
BC30910:' <typename> ' non può ereditare da
<type> ' <basetypename> ' perché espande
l'accesso della base all' <type> esterno
dell'assembly
05/03/2021 • 2 minutes to read • Edit Online

Una classe o interfaccia eredita da una classe o interfaccia di base ma ha un livello di accesso meno restrittivo.
Ad esempio, un' Public interfaccia eredita da un' Friend interfaccia o una Protected classe eredita da una
Private classe. Questa operazione espone la classe o l'interfaccia di base per accedere oltre il livello previsto.

ID errore: BC30910

Per correggere l'errore


Modificare il livello di accesso della classe o dell'interfaccia derivata in modo che sia almeno quanto
restrittivo della classe base o dell'interfaccia.
-oppure-
Se è necessario il livello di accesso meno restrittivo, rimuovere l' Inherits istruzione. Non è possibile
ereditare da una classe o un'interfaccia di base più limitata.

Vedi anche
Istruzione Class
Istruzione Interface
Inherits Statement
Livelli di accesso in Visual Basic
BC32008:' <typename> ' è un tipo delegato
05/03/2021 • 2 minutes to read • Edit Online

' <typename> ' è un tipo delegato. La costruzione del delegato consente solo una singola espressione
AddressOf come elenco di argomenti. Spesso è possibile usare un'espressione AddressOf anziché una
costruzione di delegati.
Una New clausola che crea un'istanza di una classe Delegate fornisce un elenco di argomenti non valido al
costruttore del delegato.
È possibile specificare una sola AddressOf espressione quando si crea una nuova istanza del delegato.
Questo errore può verificarsi se non si passano argomenti al costruttore del delegato, se si passa più di un
argomento o se si passa un solo argomento che non è un' AddressOf espressione valida.
ID errore: BC32008

Per correggere l'errore


Usare una singola AddressOf espressione nell'elenco di argomenti per la classe delegata nella New clausola.

Vedi anche
Operatore New
Operatore AddressOf
Delegati
Procedura: richiamare un metodo delegato
BC30108:' <typename> ' è un tipo e non può essere
usato come espressione
05/03/2021 • 2 minutes to read • Edit Online

Un nome di tipo viene visualizzato nel punto in cui è richiesta un'espressione. Un'espressione deve essere
costituita da una combinazione di variabili, costanti, valori letterali, proprietà e chiamate di routine Function .
ID errore: BC30108

Per correggere l'errore


Rimuovere il nome del tipo e costruire l'espressione usando elementi validi.

Vedi anche
Operatori ed espressioni
Le virgolette non sono un token di commento
valido per i campi delimitati se EscapeQuote è
impostato su True
05/03/2021 • 2 minutes to read • Edit Online

Sono state fornite le virgolette come delimitatore per TextFieldParser , ma EscapeQuotes è impostato su True .

Per correggere l'errore


Impostare EscapeQuotes su False .

Vedi anche
SetDelimiters
Delimiters
TextFieldParser
Procedura: Leggere da file di testo con valori delimitati da virgole
Una chiamata a una proprietà o a un metodo non
può includere un riferimento a un oggetto privato,
né come argomento né come valore restituito
05/03/2021 • 2 minutes to read • Edit Online

Di seguito sono riportate le cause possibili dell'errore:


Un client ha richiamato una proprietà o un metodo di un componente out-of-process e ha tentato di
passare un riferimento a un oggetto privato come uno degli argomenti.
Un componente out-of-process ha richiamato un metodo di richiamata sul relativo client e ha tentato di
passare un riferimento a un oggetto privato.
Un componente out-of-process ha tentato di passare un riferimento a un oggetto privato come
argomento dell'evento che stava generando.
Un client ha tentato di assegnare un riferimento a un oggetto privato a un argomento ByRef dell'evento
che stava gestendo.

Per correggere l'errore


Rimuovere il riferimento.

Vedi anche
Privata
BC40059: è stato creato un riferimento all'assembly
di interoperabilità incorporato ' <assembly1> ' a
causa di un riferimento indiretto a tale assembly
dall'assembly ' <assembly2> '
05/03/2021 • 2 minutes to read • Edit Online

È stato creato un riferimento all'assembly di interoperabilità incorporato ' <assembly1> ' a causa di un
riferimento indiretto a tale assembly dall'assembly ' <assembly2> '. Provare a modificare la proprietà 'Incorpora
tipi di interoperabilità' in un assembly.
È stato aggiunto un riferimento a un assembly (assembly1) con la proprietà Embed Interop Types impostata su
True . Si dà così istruzione al compilatore di incorporare le informazioni sui tipi di interoperabilità da tale
assembly. Il compilatore non può tuttavia incorporare le informazioni sui tipi di interoperabilità da tale assembly
perché anche un altro assembly a cui si fa riferimento (assembly2) fa riferimento a tale assembly (assembly1) e
ha la proprietà Embed Interop Types impostata su False .

NOTE
L'impostazione della proprietà Embed Interop Types per un riferimento a un assembly su True equivale a fare
riferimento all'assembly usando l'opzione del compilatore della riga di comando -link .

ID errore: BC40059

Per risolvere questo avviso


Per incorporare le informazioni sui tipi di interoperabilità per entrambi gli assembly, impostare la
proprietà Embed Interop Types per tutti i riferimenti a assembly1 su True .
Per rimuovere l'avviso, è possibile impostare la proprietà Embed Interop Types di assembly1 su False . In
questo caso, le informazioni sul tipo di interoperabilità vengono fornite da un assembly di
interoperabilità primario (PIA).

Vedi anche
-collegamento (Visual Basic)
Interoperabilità con codice non gestito
Non è stato specificato un form di avvio
05/03/2021 • 2 minutes to read • Edit Online

L'applicazione usa la WindowsFormsApplicationBase classe ma non specifica il modulo di avvio.


Questa situazione può verificarsi se la casella di controllo Abilita framework applicazione è selezionata in
Progettazione progetti, ma il modulo di avvio non è specificato. Per altre informazioni, vedere Application
Page, Project Designer (Visual Basic).

Per correggere l'errore


1. Specificare un oggetto di avvio per l'applicazione.
Per altre informazioni, vedere Application Page, Project Designer (Visual Basic).
2. Eseguire l'override del OnCreateMainForm metodo per impostare la MainForm proprietà sul form di
avvio.

Vedi anche
WindowsFormsApplicationBase
OnCreateMainForm
MainForm
Cenni preliminari sul modello di applicazione Visual Basic
BC42025: accesso del membro condiviso, del
membro costante, del membro di enumerazione o
del tipo annidato tramite un'istanza. l'espressione di
qualificazione non verrà valutata
05/03/2021 • 3 minutes to read • Edit Online

Una variabile di istanza di una classe o struttura viene utilizzata per accedere a una Shared variabile, una
proprietà, una routine o un evento definito in tale classe o struttura. Questo avviso può verificarsi anche se viene
usata una variabile di istanza per accedere a un membro implicitamente condiviso di una classe o di una
struttura, ad esempio una costante o un'enumerazione, oppure una classe o una struttura annidata.
Lo scopo della condivisione di un membro consiste nel creare una sola copia di tale membro e renderla
disponibile per ogni istanza della classe o della struttura in cui è dichiarata. È coerente con questo scopo per
accedere a un Shared membro tramite il nome della relativa classe o struttura, anziché tramite una variabile che
include una singola istanza della classe o della struttura.
L'accesso a un Shared membro tramite una variabile di istanza può rendere il codice più difficile da
comprendere nascondendo il fatto che il membro è Shared . Inoltre, se tale accesso è parte di un'espressione
che esegue altre azioni, ad esempio una Function routine che restituisce un'istanza del membro condiviso,
Visual Basic ignora l'espressione e qualsiasi altra azione che altrimenti verrebbe eseguita.
Per ulteriori informazioni e un esempio, vedere Shared.
Per impostazione predefinita, si tratta di un messaggio di avviso. Per altre informazioni su come nascondere gli
avvisi o considerarli come errori, vedere Configuring Warnings in Visual Basic.
ID errore: BC42025

Esempio
L'esempio seguente genera l'BC42025:

Public Class TestClass


Public Shared Sub SayHello()
Console.WriteLine("Hello")
End Sub
End Class

Module Program
Public Sub Main()
Dim tc As New TestClass()
tc.SayHello() ' BC42025.
End Sub
End Module

Per risolvere questo avviso


Usare il nome della classe o della struttura che definisce il Shared membro per accedervi, come illustrato
nell'esempio seguente:
Public Class TestClass
Public Shared Sub SayHello()
Console.WriteLine("Hello")
End Sub
End Class

Module Program
Public Sub Main()
TestClass.SayHello()
End Sub
End Module

NOTE
Ricevere un avviso per gli effetti dell'ambito quando due elementi di programmazione hanno lo stesso nome. Nell'esempio
precedente, se si dichiara un'istanza usando Dim testClass As TestClass = Nothing , il compilatore considera una
chiamata a testClass.SayHello() come accesso del metodo tramite il nome della classe e non viene generato alcun
avviso.

Vedi anche
Condivisa
Ambito in Visual Basic
BC30577: l'operando ' AddressOf ' deve essere il
nome di un metodo (senza parentesi)
05/03/2021 • 2 minutes to read • Edit Online

L'operatore AddressOf crea un'istanza di delegato di routine che fa riferimento a una routine specifica. La
sintassi è la seguente:

AddressOf procedurename

Sono state inserite parentesi intorno all'argomento seguente AddressOf , in cui non è necessario alcun valore.
ID errore: BC30577

Esempio
L'esempio seguente genera l'BC30577:

Public Sub CountZeroToTen()


For i = 0 To 10
Console.WriteLine($"Counted: {i}")
Threading.Thread.Sleep(500)
Next
End Sub

Sub Main()
' Any of the following two lines generates bc30577.
'Dim t As New Threading.Thread(AddressOf(CountZeroToTen))
'Dim t As New Threading.Thread(AddressOf CountZeroToTen())
t.Start()
End Sub

Per correggere l'errore


1. Rimuovere le parentesi intorno all'argomento seguente AddressOf , come illustrato nell'esempio
seguente:

Public Sub CountZeroToTen()


For i = 0 To 10
Console.WriteLine($"Counted: {i}")
Threading.Thread.Sleep(500)
Next
End Sub

Sub Main()
Dim t As New Threading.Thread(AddressOf CountZeroToTen)
t.Start()
End Sub

2. Verificare che l'argomento sia un nome di metodo.

Vedi anche
Operatore AddressOf
Delegati
Errore imprevisto. Impossibile acquisire una risorsa
del sistema operativo necessaria per l'avvio di
istanze singole
05/03/2021 • 2 minutes to read • Edit Online

L'applicazione non è riuscita ad acquisire una risorsa del sistema operativo necessaria. Alcune possibili cause di
questo problema sono:
L'applicazione non dispone di autorizzazioni per la creazione di oggetti del sistema operativo denominati.
Common Language Runtime non dispone di autorizzazioni per la creazione di file mappati alla memoria.
L'applicazione deve accedere a un oggetto del sistema operativo, ma un altro processo lo sta usando.

Per correggere l'errore


1. Verificare che l'applicazione disponga di autorizzazioni sufficienti per la creazione di oggetti del sistema
operativo denominati.
2. Verificare che Common Language Runtime disponga di autorizzazioni sufficienti per la creazione di file
mappati alla memoria.
3. Riavviare il computer per cancellare i processi che stanno usando la risorsa necessaria per la connessione
all'istanza originale.
4. Prendere nota delle circostanze in cui si è verificato l'errore e contattare il Servizio Supporto Tecnico
Clienti Microsoft.

Vedi anche
Application Page, Project Designer (Visual Basic)
Nozioni di base sul debugger
Opzioni per commenti e suggerimenti in Visual Studio
BC36556: il nome di membro di tipo anonimo può
essere dedotto solo da un nome semplice o
completo senza argomenti
05/03/2021 • 2 minutes to read • Edit Online

Non è possibile dedurre un nome di membro di tipo anonimo da un'espressione complessa.


ID errore: BC36556

Esempio
L'esempio seguente genera l'BC36556:

Dim numbers() As Integer = { 1, 2, 3, 4, 5 }


Dim instanceName = New With {numbers(3)}

Per altre informazioni sulle origini da cui i tipi anonimi possono e non possono dedurre i nomi e i tipi dei
membri, vedere procedura: dedurre i nomi e i tipi di proprietà nelle dichiarazioni di tipo anonimo.

Per correggere l'errore


Assegnare l'espressione a un nome di membro, come illustrato nel codice seguente:

Dim numbers() As Integer = { 1, 2, 3, 4, 5 }


Dim instanceName = New With { .number = numbers(3) }

Vedi anche
Tipi anonimi
Procedura: dedurre tipi e nomi di proprietà nelle dichiarazioni di tipo anonimo
Argomento non facoltativo (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Il numero e i tipi di argomenti devono corrispondere a quelli previsti. È presente un numero errato di argomenti
oppure un argomento omesso non è facoltativo. Un argomento può essere omesso solo da una chiamata a una
stored procedure definita dall'utente, se è stata dichiarata Optional nella definizione della procedura.

Per correggere l'errore


1. Specificare tutti gli argomenti necessari.
2. Assicurarsi che gli argomenti omessi siano facoltativi. In caso contrario, fornire l'argomento nella
chiamata o dichiarare il parametro Optional nella definizione.

Vedi anche
Tipi di errore
BC30638: i limiti della matrice non possono apparire
negli identificatori di tipo
05/03/2021 • 2 minutes to read • Edit Online

Le dimensioni della matrice non possono essere dichiarate come parte di un identificatore del tipo di dati.
ID errore: BC30638

Esempio
L'esempio seguente genera l'BC30638:

Dim array As Integer(8)

Per correggere l'errore


Specificare le dimensioni della matrice immediatamente dopo il nome della variabile anziché inserire la
dimensione della matrice dopo il tipo, come illustrato nell'esempio seguente:

Dim array(8) As Integer

Definire una matrice e inizializzarla con il numero desiderato di elementi, come illustrato nell'esempio
seguente:

Dim array() As Integer = New Integer(8) {}

Vedi anche
Matrici
BC32039: la matrice dichiarata come variabile di
controllo del ciclo for non può essere dichiarata con
una dimensione iniziale
05/03/2021 • 2 minutes to read • Edit Online

Un For Each ciclo utilizza una matrice come variabile di iterazione ma Inizializza la matrice.
ID errore: BC32039

Esempio
L'esempio seguente genera l'BC32039:

Dim arrayList As New List(Of Integer())


For Each listElement(1) As Integer In arrayList

Next

Per correggere l'errore


Rimuovere l'inizializzazione dalla dichiarazione della variabile di iterazione come illustrato nell'esempio
seguente:

Dim arrayList As New List(Of Integer())


For Each listElement() As Integer In arrayList

Next

in alternativa, è possibile usare l'inferenza del tipo:

Dim arrayList As New List(Of Integer())


For Each listElement In arrayList

Next

Vedi anche
Istruzione For...Next
Matrici
raccolte
BC30306: espressione di indice di matrice mancante
05/03/2021 • 2 minutes to read • Edit Online

L'inizializzazione di una matrice lascia uno o più pedici che definiscono i limiti della matrice. Ad esempio,
l'istruzione potrebbe contenere l'espressione myArray (5,5,,10) , che lascia il terzo indice.
ID errore: BC30306

Per correggere l'errore


Specificare l'indice mancante.

Vedi anche
Matrici
BC31043: le matrici dichiarate come membri di
struttura non possono essere dichiarate con una
dimensione iniziale
05/03/2021 • 2 minutes to read • Edit Online

Una matrice in una struttura viene dichiarata con una dimensione iniziale. Non è possibile inizializzare alcun
elemento della struttura e la dichiarazione di una dimensione della matrice è una forma di inizializzazione.
ID errore: BC31043

Esempio
L'esempio seguente genera l'BC31043:

Structure DemoStruct
Public demoArray(9) As Integer
End Structure

Per correggere l'errore


1. Definire la matrice nella struttura come dinamica (nessuna dimensione iniziale).
2. Se è necessaria una determinata dimensione della matrice, è possibile ridimensionare una matrice
dinamica con un' istruzione ReDim quando il codice è in esecuzione. L'esempio seguente illustra questi
concetti.

Structure DemoStruct
Public demoArray() As Integer
End Structure
Sub UseStruct()
Dim struct As DemoStruct
ReDim struct.demoArray(9)
Struct.demoArray(2) = 777
End Sub

Vedi anche
Matrici
Procedura: Dichiarare una struttura
BC30828:' As Any ' non è supportato nelle istruzioni
' Declare '
05/03/2021 • 2 minutes to read • Edit Online

Il Any tipo di dati è stato usato con le Declare istruzioni in Visual Basic 6,0 e versioni precedenti per consentire
l'uso di argomenti che potrebbero contenere qualsiasi tipo di dati. Visual Basic supporta tuttavia l'overload,
quindi rende Any obsoleto il tipo di dati.
ID errore: BC30828

Per correggere l'errore


1. Dichiarare i parametri del tipo specifico che si desidera utilizzare. Per esempio.

Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (


ByVal lpBuffer As String,
ByRef nSize As Integer) As Integer

2. Utilizzare l' MarshalAsAttribute attributo per specificare As Any quando Void* si prevede che la routine
venga chiamata.

Declare Sub SetData Lib "..\LIB\UnmgdLib.dll" (


ByVal x As Short,
<System.Runtime.InteropServices.MarshalAsAttribute(
System.Runtime.InteropServices.UnmanagedType.AsAny)>
ByVal o As Object)

Vedi anche
MarshalAsAttribute
Procedura dettagliata: Chiamata delle API di Windows
Declare Statement
Creazione di prototipi nel codice gestito
Errore di automazione
05/03/2021 • 2 minutes to read • Edit Online

Si è verificato un errore durante l'esecuzione di un metodo o durante il recupero o l'impostazione di una


proprietà di una variabile oggetto. L'errore è stato segnalato dall'applicazione che ha creato l'oggetto.

Per correggere l'errore


1. Verificare le proprietà dell'oggetto Err per determinare l'origine e la natura dell'errore.
2. Usare l'istruzione On Error Resume Next immediatamente prima dell'istruzione di accesso e quindi
controllare subito la presenza di errori dopo l'istruzione di accesso.

Vedi anche
Tipi di errore
Opzioni per commenti e suggerimenti in Visual Studio
BC42033: valore di checksum errato, cifre non
esadecimali o numero dispari di cifre esadecimali
05/03/2021 • 2 minutes to read • Edit Online

Un valore di checksum include cifre esadecimali non valide o un numero di cifre dispari.
Quando ASP.NET genera un file di origine Visual Basic, con estensione vb, calcola un checksum e lo colloca in un
file di origine nascosto identificato da #externalchecksum . Anche un utente può generare un file con estensione
vb per lo stesso scopo, ma questo processo è più adatto per essere usato internamente.
Per impostazione predefinita, si tratta di un messaggio di avviso. Per informazioni su come nascondere gli avvisi
o considerarli come errori, vedere Configuring Warnings in Visual Basic.
ID errore: BC42033

Per correggere l'errore


1. Se il file di origine Visual Basic viene generato da ASP.NET, riavviare la compilazione del progetto.
2. Se l'avviso persiste dopo il riavvio, reinstallare ASP.NET e riprovare a eseguire la compilazione.
3. Se l'avviso persiste ancora o non si usa ASP.NET, raccogliere informazioni sulla situazione contingente e
informare il Servizio Supporto Tecnico Clienti Microsoft.

Vedi anche
Panoramica di ASP.NET
Opzioni per commenti e suggerimenti in Visual Studio
Convenzione di chiamata DLL non valida
05/03/2021 • 2 minutes to read • Edit Online

Gli argomenti passati a una libreria di collegamento dinamico (DLL) devono corrispondere esattamente a quelli
previsti dalla routine. Le convenzioni di chiamata gestiscono il numero, il tipo e l'ordine degli argomenti. È
possibile che il programma chiami una routine in una DLL a cui viene passato il tipo o il numero di argomenti
errato.

Per correggere l'errore


1. Verificare che tutti i tipi di argomento condividano quelli specificati nella dichiarazione della routine che si
sta chiamando.
2. Assicurarsi di passare lo stesso numero di argomenti indicato nella dichiarazione della routine che si sta
chiamando.
3. Se la routine DLL prevede gli argomenti per valore, assicurarsi che ByVal sia specificato per gli
argomenti nella dichiarazione per la routine.

Vedi anche
Tipi di errore
Istruzione Call
Declare Statement
Modalità file non valida
05/03/2021 • 2 minutes to read • Edit Online

Le istruzioni utilizzate per manipolare il contenuto del file devono essere appropriate per la modalità in cui il file
è stato aperto. Le cause possibili sono:
Un' FilePutObject FileGetObject istruzione o specifica un file sequenziale.
Un' Print istruzione specifica un file aperto per una modalità di accesso diversa da Output o Append .
Un' Input istruzione specifica un file aperto per una modalità di accesso diversa da Input

Tentativo di scrittura in un file di sola lettura.

Per correggere l'errore


Assicurarsi FilePutObject che e facciano FileGetObject riferimento solo ai file aperti per Random
Binary l'accesso o.

Assicurarsi Print di specificare un file aperto per la Output Append modalità di accesso o. In caso
contrario, utilizzare un'istruzione diversa per inserire i dati nel file o riaprire il file in una modalità
appropriata.
Assicurarsi Input di specificare un file aperto per Input . In caso contrario, utilizzare un'istruzione
diversa per inserire i dati nel file o riaprire il file in una modalità appropriata.
Se si sta scrivendo in un file di sola lettura, modificare lo stato di lettura/scrittura del file o non tentare di
scrivervi.
Usare la funzionalità disponibile nell'oggetto My.Computer.FileSystem .

Vedi anche
FileSystem
Risoluzione dei problemi: Lettura e scrittura nei file di testo
Numero o nome file errato
05/03/2021 • 2 minutes to read • Edit Online

Si è verificato un errore durante il tentativo di accedere al file specificato. Tra le possibili cause di questo errore
sono:
Un'istruzione fa riferimento a un file con un nome o un numero di file non specificato nell' FileOpen
istruzione o che è stato specificato in un' FileOpen istruzione ma che è stato successivamente chiuso.
Un'istruzione fa riferimento a un file con un numero non compreso nell'intervallo di numeri di file.
Un'istruzione fa riferimento a un nome o a un numero di file non valido.

Per correggere l'errore


1. Verificare che il nome del file sia specificato in un' FileOpen istruzione. Si noti che se è stata richiamata l'
FileClose istruzione senza argomenti, è possibile che tutti i file aperti siano stati chiusi inavvertitamente.

2. Se il codice genera numeri di file algoritmicamente, verificare che i numeri siano validi.
3. Controllare i nomi dei file per assicurarsi che siano conformi alle convenzioni del sistema operativo.

Vedi anche
FileOpen
Convenzioni di denominazione di Visual Basic
Lunghezza del record non valida
05/03/2021 • 2 minutes to read • Edit Online

Di seguito sono riportate le cause possibili dell'errore:


La lunghezza di una variabile di record specificata in FileGet un' FileGetObject FilePut istruzione, o è
FilePutObject diversa da quella specificata nell' FileOpen istruzione corrispondente.

La variabile in un' FilePut FilePutObject istruzione o è o include una stringa a lunghezza variabile.
La variabile in un oggetto FilePut o FilePutObject è o include un Variant tipo.

Per correggere l'errore


1. Assicurarsi che la somma delle dimensioni delle variabili a lunghezza fissa nel tipo definito dall'utente che
definisce il tipo della variabile di record sia uguale al valore indicato nella FileOpen clausola
dell'istruzione Len .
2. Se la variabile in un' FilePut FilePutObject istruzione o è o include una stringa a lunghezza variabile,
assicurarsi che la stringa a lunghezza variabile sia di almeno 2 caratteri inferiore alla lunghezza del record
specificata nella Len clausola dell' FileOpen istruzione.
3. Se la variabile in un oggetto FilePut o FilePutObject è o include un oggetto, verificare che Variant la
stringa di lunghezza variabile sia di almeno 4 byte inferiore alla lunghezza del record specificata nella
Len clausola dell' FileOpen istruzione.

Vedere anche
FileGet
FileGetObject
FilePut
FilePutObject
BC42358: poiché la chiamata non è attesa,
l'esecuzione del metodo corrente continua prima
del completamento della chiamata
05/03/2021 • 8 minutes to read • Edit Online

Non è possibile attendere la chiamata, pertanto l'esecuzione del metodo corrente continuerà prima del
completamento della chiamata. Si consiglia di applicare l' Await operatore al risultato della chiamata.
Il metodo corrente chiama un metodo asincrono che restituisce Task o Task<TResult> e non applica l'operatore
await al risultato. Con la chiamata al metodo asincrono viene avviata un'attività asincrona. Tuttavia, poiché non
viene applicato alcun operatore Await , l'esecuzione del programma continua senza attendere il
completamento dell'attività. Nella maggior parte dei casi questo comportamento non è quello previsto. Di solito
altri aspetti del metodo chiamante dipendono dai risultati della chiamata o, come minimo, si prevede che il
metodo chiamato venga completato prima della restituzione da parte del metodo contenente la chiamata.
Un problema ugualmente importante riguarda cosa accade con le eccezioni generate nel metodo asincrono
richiamato. Un'eccezione generata in un metodo che restituisce Task o Task<TResult> viene archiviata
nell'attività restituita. Se non si attende l'attività o si controllano in modo esplicito le eccezioni, l'eccezione viene
persa. Se si attende l'attività, la relativa eccezione viene generata di nuovo.
Come procedura consigliata, attendere sempre la chiamata.
Per impostazione predefinita, si tratta di un messaggio di avviso. Per altre informazioni su come nascondere gli
avvisi o considerarli come errori, vedere Configuring Warnings in Visual Basic.
ID errore: BC42358

Per risolvere questo avviso


Si consideri la possibilità di eliminare l'avviso solo se si è certi che non si desidera attendere il completamento
della chiamata asincrona e che il metodo chiamato non generi alcuna eccezione. In tal caso, è possibile eliminare
l'avviso assegnando il risultato dell'attività della chiamata a una variabile.
Nell'esempio seguente viene illustrato come generare l'avviso, come eliminarlo e come attendere la chiamata:
Async Function CallingMethodAsync() As Task

ResultsTextBox.Text &= vbCrLf & " Entering calling method."

' Variable delay is used to slow down the called method so that you
' can distinguish between awaiting and not awaiting in the program's output.
' You can adjust the value to produce the output that this topic shows
' after the code.
Dim delay = 5000

' Call #1.


' Call an async method. Because you don't await it, its completion isn't
' coordinated with the current method, CallingMethodAsync.
' The following line causes the warning.
CalledMethodAsync(delay)

' Call #2.


' To suppress the warning without awaiting, you can assign the
' returned task to a variable. The assignment doesn't change how
' the program runs. However, the recommended practice is always to
' await a call to an async method.
' Replace Call #1 with the following line.
'Task delayTask = CalledMethodAsync(delay)

' Call #3
' To contrast with an awaited call, replace the unawaited call
' (Call #1 or Call #2) with the following awaited call. The best
' practice is to await the call.

'Await CalledMethodAsync(delay)

' If the call to CalledMethodAsync isn't awaited, CallingMethodAsync


' continues to run and, in this example, finishes its work and returns
' to its caller.
ResultsTextBox.Text &= vbCrLf & " Returning from calling method."
End Function

Async Function CalledMethodAsync(howLong As Integer) As Task

ResultsTextBox.Text &= vbCrLf & " Entering called method, starting and awaiting Task.Delay."
' Slow the process down a little so you can distinguish between awaiting
' and not awaiting. Adjust the value for howLong if necessary.
Await Task.Delay(howLong)
ResultsTextBox.Text &= vbCrLf & " Task.Delay is finished--returning from called method."
End Function

Nell'esempio, se si sceglie Call #1 o Call #2, il metodo asincrono senza attesa ( CalledMethodAsync ) termina dopo
che il relativo chiamante ( CallingMethodAsync ) e il chiamante del chiamante ( StartButton_Click ) sono
completati. Nell'ultima riga nell'output seguente viene mostrato quando viene completato il metodo chiamato.
L'entrata e l'uscita dal gestore eventi tramite cui viene chiamato CallingMethodAsync nell'esempio completo
sono contrassegnate nell'output.

Entering the Click event handler.


Entering calling method.
Entering called method, starting and awaiting Task.Delay.
Returning from calling method.
Exiting the Click event handler.
Task.Delay is finished--returning from called method.

Esempio
Nell'applicazione Windows Presentation Foundation (WPF) seguente sono inclusi i metodi dell'esempio
precedente. I passaggi seguenti configurano l'applicazione:
1. Creare un'applicazione WPF e denominarla AsyncWarning .
2. Nell'Editor di codice di Visual Studio scegliere la scheda MainWindow.xaml .
Se la scheda non è visibile, aprire il menu di scelta rapida per MainWindow. XAML in Esplora soluzioni ,
quindi scegliere Visualizza codice .
3. Sostituire il codice nella visualizzazione XAML di MainWindow. XAML con il codice seguente:

<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button x:Name="StartButton" Content="Start" HorizontalAlignment="Left" Margin="214,28,0,0"
VerticalAlignment="Top" Width="75" HorizontalContentAlignment="Center" FontWeight="Bold"
FontFamily="Aharoni" Click="StartButton_Click" />
<TextBox x:Name="ResultsTextBox" Margin="0,80,0,0" TextWrapping="Wrap" FontFamily="Lucida
Console"/>
</Grid>
</Window>

Una finestra semplice con un pulsante e una casella di testo viene visualizzata nella visualizzazione
Progettazione di MainWindow.xaml.
Per altre informazioni sulla finestra di progettazione XAML, vedere Creating a UI by using XAML Designer.
Per informazioni su come compilare una semplice interfaccia utente, vedere le sezioni "Per creare
un'applicazione WPF" e "Per progettare una finestra WPF MainWindow semplice" nella Procedura
dettagliata: Accesso al Web tramite Async e Await.
4. Sostituire il codice in MainWindow.xaml.vb con quello riportato di seguito.

Class MainWindow

Private Async Sub StartButton_Click(sender As Object, e As RoutedEventArgs)

ResultsTextBox.Text &= vbCrLf & "Entering the Click event handler."


Await CallingMethodAsync()
ResultsTextBox.Text &= vbCrLf & "Exiting the Click event handler."
End Sub

Async Function CallingMethodAsync() As Task

ResultsTextBox.Text &= vbCrLf & " Entering calling method."

' Variable delay is used to slow down the called method so that you
' can distinguish between awaiting and not awaiting in the program's output.
' You can adjust the value to produce the output that this topic shows
' after the code.
Dim delay = 5000

' Call #1.


' Call an async method. Because you don't await it, its completion isn't
' coordinated with the current method, CallingMethodAsync.
' The following line causes the warning.
CalledMethodAsync(delay)

' Call #2.


' To suppress the warning without awaiting, you can assign the
' returned task to a variable. The assignment doesn't change how
' the program runs. However, the recommended practice is always to
' await a call to an async method.
' Replace Call #1 with the following line.
'Task delayTask = CalledMethodAsync(delay)

' Call #3
' To contrast with an awaited call, replace the unawaited call
' (Call #1 or Call #2) with the following awaited call. The best
' practice is to await the call.

'Await CalledMethodAsync(delay)

' If the call to CalledMethodAsync isn't awaited, CallingMethodAsync


' continues to run and, in this example, finishes its work and returns
' to its caller.
ResultsTextBox.Text &= vbCrLf & " Returning from calling method."
End Function

Async Function CalledMethodAsync(howLong As Integer) As Task

ResultsTextBox.Text &= vbCrLf & " Entering called method, starting and awaiting
Task.Delay."
' Slow the process down a little so you can distinguish between awaiting
' and not awaiting. Adjust the value for howLong if necessary.
Await Task.Delay(howLong)
ResultsTextBox.Text &= vbCrLf & " Task.Delay is finished--returning from called method."
End Function

End Class

' Output

' Entering the Click event handler.


' Entering calling method.
' Entering called method, starting and awaiting Task.Delay.
' Returning from calling method.
' Exiting the Click event handler.
' Task.Delay is finished--returning from called method.

' Output

' Entering the Click event handler.


' Entering calling method.
' Entering called method, starting and awaiting Task.Delay.
' Task.Delay is finished--returning from called method.
' Returning from calling method.
' Exiting the Click event handler.

5. Premere F5 per eseguire il programma e quindi scegliere il pulsante Avvia .


L'output previsto viene visualizzato alla fine del codice.

Vedi anche
Operatore await
Programmazione asincrona con Async e Await
BC36548: non è possibile convertire il tipo anonimo
in un albero delle espressioni perché una proprietà
del tipo viene usata per inizializzare un'altra
proprietà
05/03/2021 • 2 minutes to read • Edit Online

Il compilatore non accetta la conversione di un tipo anonimo in un albero delle espressioni quando una
proprietà del tipo anonimo viene utilizzata per inizializzare un'altra proprietà del tipo anonimo. Nel codice
seguente, ad esempio, Prop1 viene dichiarato nell'elenco di inizializzazione e quindi utilizzato come valore
iniziale per Prop2 .
ID errore: BC36548

Esempio
Module M2

Sub ExpressionExample(Of T)(x As Expressions.Expression(Of Func(Of T)))


End Sub

Sub Main()
' The following line causes the error.
ExpressionExample(Function() New With {.Prop1 = 2, .Prop2 = .Prop1})
End Sub
End Module

Per correggere l'errore


Assegnare il valore iniziale per Prop1 a una variabile locale. Assegnare la variabile a Prop1 e Prop2 , come
illustrato nel codice seguente:

Sub Main()
Dim temp = 2
ExpressionExample(Function() New With {.Prop1 = temp, .Prop2 = temp})
End Sub

Vedi anche
Tipi anonimi (Visual Basic)
Alberi delle espressioni (Visual Basic)
Procedura: usare alberi delle espressioni per la compilazione di query dinamiche (Visual Basic)
Impossibile creare il componente ActiveX
05/03/2021 • 2 minutes to read • Edit Online

Si è tentato di inserire un controllo ActiveX in un form in fase di progettazione o di aggiungere un form a un


progetto con un controllo ActiveX, ma le informazioni associate nel Registro di sistema non sono state trovate.

Per correggere l'errore


È possibile che le informazioni nel Registro di sistema siano state eliminate o siano danneggiate. Reinstallare
il controllo ActiveX o contattare il fornitore del controllo.

Vedi anche
Tipi di errore
Opzioni per commenti e suggerimenti in Visual Studio
BC30310: non è possibile fare riferimento a'
<name> ' perché è un membro del campo <name>
di tipo valore '' della classe ' <classname> ' che ha '
System. MarshalByRefObject ' come classe base
05/03/2021 • 2 minutes to read • Edit Online

La System.MarshalByRefObject classe consente alle applicazioni che supportano l'accesso remoto agli oggetti
attraverso i limiti del dominio applicazione. I tipi devono ereditare dalla MarshalByRejectObject classe quando il
tipo viene usato tra i limiti del dominio applicazione. Lo stato dell'oggetto non deve essere copiato perché i
membri dell'oggetto non sono utilizzabili all'esterno del dominio dell'applicazione in cui sono stati creati.
ID errore: BC30310

Per correggere l'errore


1. Controllare il riferimento per verificare che il membro a cui si fa riferimento sia valido.
2. Qualificare in modo esplicito il membro con la Me parola chiave.

Vedi anche
MarshalByRefObject
Istruzione Dim
BC30369: non è possibile fare riferimento a un
membro di istanza di una classe all'interno di un
metodo condiviso o di un inizializzatore di membro
condiviso senza un'istanza esplicita della classe
05/03/2021 • 2 minutes to read • Edit Online

Si è tentato di fare riferimento a un membro non condiviso di una classe all'interno di una procedura condivisa.
Nell'esempio seguente viene illustrata una situazione di questo tipo:

Class Sample
Public x as Integer
Public Shared Sub SetX()
x = 10
End Sub
End Class

Nell'esempio precedente, l'istruzione di assegnazione x = 10 genera questo messaggio di errore. Questo


perché una procedura condivisa sta tentando di accedere a una variabile di istanza.
La variabile x è un membro di istanza perché non è dichiarata come condivisa. Ogni istanza della classe
Sample contiene una singola variabile x . Quando un'istanza imposta o modifica il valore di x , non influisce
sul valore di x in nessun'altra istanza.
Tuttavia, la procedura SetX è Shared tra tutte le istanze della classe Sample . Ciò significa che non è associato a
una sola istanza della classe, ma funziona in modo indipendente dalle singole istanze. Poiché non dispone di
alcuna connessione a una particolare istanza, setX non può accedere a una variabile di istanza. Deve
funzionare solo con le Shared variabili. Quando SetX Imposta o modifica il valore di una variabile condivisa, il
nuovo valore è disponibile per tutte le istanze della classe.
ID errore: BC30369

Per correggere l'errore


1. Decidere se si desidera che il membro venga condiviso tra tutte le istanze della classe o mantenuti singoli
per ogni istanza.
2. Se si desidera che una sola copia del membro venga condivisa tra tutte le istanze, aggiungere la Shared
parola chiave alla dichiarazione del membro. Mantenere la Shared parola chiave nella dichiarazione di
routine.
3. Se si desidera che ogni istanza disponga di una propria copia personalizzata del membro, non specificare
Shared per la dichiarazione del membro. Rimuovere la Shared parola chiave dalla dichiarazione di
routine.

Vedi anche
Condivisa
Impossibile creare il file temporaneo necessario
05/03/2021 • 2 minutes to read • Edit Online

L'unità è piena che contiene la directory specificata dalla variabile di ambiente TEMP oppure la variabile di
ambiente TEMP specifica un'unità o una directory di sola lettura non valida.

Per correggere l'errore


1. Eliminare i file dall'unità, se completi.
2. Specificare un'unità diversa nella variabile di ambiente TEMP.
3. Specificare un'unità valida per la variabile di ambiente TEMP.
4. Rimuovere la restrizione di sola lettura dall'unità o dalla directory attualmente specificata.

Vedi anche
Tipi di errore
BC2012: non è possibile aprire ' <filename> ' per la
scrittura
05/03/2021 • 2 minutes to read • Edit Online

Il file specificato non può essere aperto per la scrittura, probabilmente perché è già stato aperto.
ID errore: BC2012

Per correggere l'errore


1. Chiudere il file e riaprirlo.
2. Controllare le autorizzazioni del file.

Vedi anche
WriteAllText
WriteAllBytes
Scrittura in file
BC31098: Impossibile trovare la classe ' <classname>
'
05/03/2021 • 2 minutes to read • Edit Online

Impossibile trovare la classe ' <classname> '. Questa condizione è in genere il risultato di un
"Microsoft.VisualBasic.dll" non corrispondente.
Non è stato possibile trovare un membro definito.
ID errore: BC31098

Per correggere l'errore


1. Ripetere la compilazione del programma, per controllare se l'errore si verifica di nuovo.
2. Se l'errore si ripete, salvare il lavoro e riavviare Visual Studio.
3. Se l'errore è permanente, reinstallare Visual Basic.
4. Se l'errore persiste dopo la reinstallazione, inviare una notifica al Servizio Supporto Tecnico Clienti
Microsoft.

Vedi anche
Opzioni per commenti e suggerimenti in Visual Studio
La classe non supporta l'automazione o l'interfaccia
prevista
05/03/2021 • 2 minutes to read • Edit Online

La classe specificata nella funzione GetObject o CreateObject non ha esposto un'interfaccia di programmabilità
oppure è stato modificato un progetto da .dll a .exe o viceversa.

Per correggere l'errore


1. Consultare la documentazione dell'applicazione che ha creato l'oggetto per verificare l'eventuale
presenza di limitazioni sull'uso dell'automazione.
2. Se è stato modificato un progetto da .dll a .exe o viceversa, è necessario annullare manualmente la
registrazione del precedente .dll o .exe.

Vedi anche
Tipi di errore
Opzioni per commenti e suggerimenti in Visual Studio
BC30481: l'istruzione ' Class ' deve terminare con un
oggetto ' End Class ' corrispondente
05/03/2021 • 2 minutes to read • Edit Online

Class viene usato per avviare un Class blocco, quindi può essere visualizzato solo all'inizio del blocco, con
un'istruzione corrispondente che End Class termina il blocco. È presente un'istruzione ridondante Class
oppure il blocco non è stato terminato Class con End Class .
ID errore: BC30481

Per correggere l'errore


Individuare e rimuovere l'istruzione Class non necessaria.
Terminare il Class blocco con un oggetto corrispondente End Class .

Vedi anche
<keyword>Istruzione End
Istruzione Class
Formato degli Appunti non valido
05/03/2021 • 2 minutes to read • Edit Online

Il formato degli Appunti specificato non è compatibile con il metodo in esecuzione. Tra le possibili cause di
questo errore sono:
Utilizzo del GetText metodo o degli Appunti SetText con un formato degli Appunti diverso da
vbCFText o vbCFLink .

Utilizzo del GetData metodo o degli Appunti SetData con un formato degli Appunti diverso da
vbCFBitmap , vbCFDIB o vbCFMetafile .
Utilizzo dei GetData SetData metodi o di un oggetto DataObject con un formato degli Appunti
nell'intervallo riservato da Microsoft Windows per i formati registrati (&HC000-&HFFFF), quando il
formato degli Appunti non è stato registrato con Microsoft Windows.

Per correggere l'errore


Rimuovere il formato non valido e specificarne uno valido.

Vedi anche
Appunti: aggiunta di altri formati
BC30439: espressione costante non rappresentabile
nel tipo ' <typename> '
05/03/2021 • 2 minutes to read • Edit Online

Si sta tentando di valutare una costante che non rientrerà nel tipo di destinazione, in genere perché sta
causando un overflow dell'intervallo.
ID errore: BC30439

Per correggere l'errore


1. Modificare il tipo di destinazione in modo che sia in grado di gestire la costante.

Vedi anche
Cenni preliminari sulle costanti
Costanti ed enumerazioni
BC30424: le costanti devono essere di tipo
intrinseco o enumerato, non di tipo classe, struttura,
parametro di tipo o matrice
05/03/2021 • 2 minutes to read • Edit Online

Si è provato a dichiarare una costante come una classe, una struttura o un tipo di matrice oppure come un
parametro di tipo definito da un tipo generico che lo contiene.
Le costanti devono essere di tipo intrinseco ( Boolean , Byte , Date , Decimal , Double , Integer , Long ,
Object , SByte , Short , Single , String , UInteger , ULong o UShort ) o di un Enum tipo basato su uno dei
tipi integrali.
ID errore: BC30424

Per correggere l'errore


1. Dichiarare la costante come tipo intrinseco o Enum .
2. Una costante può anche essere un valore speciale, ad esempio True , False o Nothing . Il compilatore
considera questi valori predefiniti come il tipo intrinseco appropriato.

Vedi anche
Costanti ed enumerazioni
Tipi di dati
Tipi di dati
BC30298: il costruttore ' <name> ' non può
chiamare se stesso
05/03/2021 • 2 minutes to read • Edit Online

Una Sub New routine in una classe o in una struttura chiama se stessa.
Lo scopo di un costruttore è di inizializzare un'istanza di una classe o una struttura quando viene creata per la
prima volta. Una classe o una struttura può avere più costruttori, purché tutti abbiano elenchi di parametri
diversi. Un costruttore è autorizzato a chiamare un altro costruttore per eseguirne la funzionalità oltre a se
stesso. Tuttavia, non è significativo per un costruttore chiamare se stesso e in realtà comporterebbe una
ricorsione infinita se consentito.
ID errore: BC30298

Per correggere l'errore


1. Controllare l'elenco di parametri del costruttore chiamato. Deve essere diverso da quello del costruttore
che effettua la chiamata.
2. Se non si intende chiamare un costruttore diverso, rimuovere Sub New completamente la chiamata.

Vedi anche
Durata degli oggetti: come creare e distruggere oggetti
BC32053: la copia del valore del parametro ' ByRef
'' <parametername> ' di nuovo nell'argomento
corrispondente è più stretta dal tipo ' <typename1>
' al tipo ' <typename2> '
05/03/2021 • 3 minutes to read • Edit Online

Una routine viene chiamata con un argomento che viene ampliato al tipo di parametro corrispondente e la
conversione dal parametro all'argomento è più restrittiva.
Quando si definisce una classe o una struttura, è possibile definire uno o più operatori di conversione per
convertire il tipo della classe o della struttura in altri tipi. È anche possibile definire operatori di conversione
inversi per riconvertire gli altri tipi nel tipo della classe o della struttura originale. Quando si usa il tipo di classe
o struttura in una chiamata di procedura, Visual Basic possibile usare questi operatori di conversione per
convertire il tipo di un argomento nel tipo del parametro corrispondente.
Se si passa l'argomento ByRef, Visual Basic talvolta copia il valore dell'argomento in una variabile locale nella
routine invece di passare un riferimento. In tal caso, quando la procedura viene restituita, Visual Basic necessario
copiare nuovamente il valore della variabile locale nell'argomento nel codice chiamante.
Se un valore dell'argomento ByRef viene copiato nella routine e l'argomento e il parametro sono dello stesso
tipo, non è necessaria alcuna conversione. Tuttavia, se i tipi sono diversi, Visual Basic necessario eseguire la
conversione in entrambe le direzioni. Se uno dei tipi è il tipo della classe o della struttura, Visual Basic necessario
convertirlo in e da un altro tipo. Se una di queste conversioni viene ampliata, la conversione inversa potrebbe
essere più restrittiva.
ID errore: BC32053

Per correggere l'errore


Se possibile, usare un argomento chiamante dello stesso tipo del parametro della routine, in modo che
Visual Basic non debba eseguire alcuna conversione.
Se è necessario chiamare la routine con un tipo di argomento diverso dal tipo del parametro, ma non è
necessario restituire un valore nell'argomento chiamante, definire il parametro in modo che sia ByVal
invece che ByRef .
Se è necessario restituire un valore nell'argomento chiamante, definire l'operatore di conversione inverso
come più ampio, se possibile.

Vedi anche
Procedure
Parametri e argomenti delle routine
Passaggio di argomenti per valore e per riferimento
Routine di operatore
Operator Statement
Procedura: definire un operatore
Procedura: Definire un operatore di conversione
Conversioni di tipi in Visual Basic
Widening and Narrowing Conversions
BC31122: il modificatore ' Custom ' non è valido
negli eventi dichiarati senza tipi delegati espliciti
05/03/2021 • 2 minutes to read • Edit Online

A differenza di un evento non personalizzato, una Custom Event dichiarazione richiede una As clausola che
segue il nome dell'evento che specifica in modo esplicito il tipo di delegato per l'evento.
Gli eventi non personalizzati possono essere definiti con una As clausola e un tipo di delegato esplicito o con
un elenco di parametri immediatamente successivo al nome dell'evento.
ID errore: BC31122

Per correggere l'errore


1. Definire un delegato con lo stesso elenco di parametri dell'evento personalizzato.
Se, ad esempio, Custom Event è stato definito da
Custom Event Test(ByVal sender As Object, ByVal i As Integer) , il delegato corrispondente sarà il
seguente.

Delegate Sub TestDelegate(ByVal sender As Object, ByVal i As Integer)

2. Sostituire l'elenco di parametri dell'evento personalizzato con una As clausola che specifica il tipo di
delegato.
Continuando con l'esempio, la Custom Event dichiarazione verrebbe riscritta nel modo seguente.

Custom Event Test As TestDelegate

Esempio
In questo esempio viene dichiarato un oggetto Custom Event e viene specificata la As clausola obbligatoria con
un tipo delegato.

Delegate Sub TestDelegate(ByVal sender As Object, ByVal i As Integer)


Custom Event Test As TestDelegate
AddHandler(ByVal value As TestDelegate)
' Code for adding an event handler goes here.
End AddHandler

RemoveHandler(ByVal value As TestDelegate)


' Code for removing an event handler goes here.
End RemoveHandler

RaiseEvent(ByVal sender As Object, ByVal i As Integer)


' Code for raising an event goes here.
End RaiseEvent
End Event

Vedi anche
Istruzione Event
Istruzione Delegate
Eventi
BC36647 e BC36644: non è possibile dedurre da
questi argomenti i tipi di dati dei parametri di tipo
19/03/2021 • 2 minutes to read • Edit Online

Non è possibile dedurre da questi argomenti i tipi di dati dei parametri di tipo. Per correggere l'errore, provare a
specificare i tipi di dati in modo esplicito.
Questo errore si verifica quando la risoluzione dell'overload non riesce. Viene visualizzato come messaggio
subordinato che indica perché un determinato candidato di overload è stato eliminato. Il messaggio di errore
spiega che il compilatore non può usare l'inferenza del tipo per trovare i tipi di dati per i parametri di tipo.

NOTE
Quando non è possibile specificare gli argomenti (ad esempio per gli operatori di query nelle espressioni di query), il
messaggio di errore visualizzato non contiene la seconda frase.

Il codice seguente illustra l'errore.

Module Module1

Sub Main()

'' Not Valid.


'OverloadedGenericMethod("Hello", "World")

End Sub

Sub OverloadedGenericMethod(Of T)(ByVal x As String,


ByVal y As InterfaceExample(Of T))
End Sub

Sub OverloadedGenericMethod(Of T, R)(ByVal x As T,


ByVal y As InterfaceExample(Of R))
End Sub

End Module

Interface InterfaceExample(Of T)
End Interface

ID errore: BC36647 e BC36644

Per correggere l'errore


È possibile specificare un tipo di dati per il parametro o i parametri di tipo anziché basarsi sull'inferenza del tipo.

Vedi anche
Conversione di tipo relaxed del delegato
Generic Procedures in Visual Basic
Conversioni di tipi in Visual Basic
BC30188: prevista dichiarazione
05/03/2021 • 2 minutes to read • Edit Online

Un'istruzione non dichiarativa, ad esempio un'istruzione di assegnazione o ciclo, si verifica all'esterno di


qualsiasi routine. Solo le dichiarazioni sono consentite all'esterno delle procedure.
In alternativa, un elemento di programmazione viene dichiarato senza una parola chiave di dichiarazione, ad
esempio Dim o Const .
ID errore: BC30188

Per correggere l'errore


Spostare l'istruzione non dichiarativa nel corpo di una routine.
Iniziare la dichiarazione con una parola chiave di dichiarazione appropriata.
Assicurarsi che una parola chiave di dichiarazione non sia digitata in modo errato.

Vedi anche
Procedure
Istruzione Dim
BC40007: la proprietà predefinità <propertyname1>
' è in conflitto con la proprietà predefinità
<propertyname2> ' in ' <classname> ', quindi deve
essere dichiarata ' Shadows '
05/03/2021 • 2 minutes to read • Edit Online

Una proprietà viene dichiarata con lo stesso nome di una proprietà definita nella classe base. In questa
situazione, la proprietà in questa classe deve nascondere la proprietà della classe base.
Si tratta di un messaggio di avviso. Per impostazione predefinita viene usato Shadows . Per altre informazioni su
come nascondere gli avvisi o considerarli come errori, vedere Configuring Warnings in Visual Basic.
ID errore: BC40007

Per correggere l'errore


Aggiungere la Shadows parola chiave alla dichiarazione o modificare il nome della proprietà dichiarata.

Vedi anche
Ombreggiature
Shadowing in Visual Basic
BC30686: l'accesso alla proprietà predefinita è
ambiguo tra i membri di interfaccia ereditati '
<defaultpropertyname> ' dell'interfaccia '
<interfacename1> ' è <defaultpropertyname> '
dell'interfaccia ' <interfacename2> '
05/03/2021 • 2 minutes to read • Edit Online

Un'interfaccia eredita da due interfacce, ognuna delle quali dichiara una proprietà predefinita con lo stesso
nome. Il compilatore non può risolvere un accesso a questa proprietà predefinita senza qualifica. Questa
condizione è illustrata nell'esempio seguente.

Public Interface Iface1


Default Property prop(ByVal arg As Integer) As Integer
End Interface
Public Interface Iface2
Default Property prop(ByVal arg As Integer) As Integer
End Interface
Public Interface Iface3
Inherits Iface1, Iface2
End Interface
Public Class testClass
Public Sub accessDefaultProperty()
Dim testObj As Iface3
Dim testInt As Integer = testObj(1)
End Sub
End Class

Quando si specifica testObj(1) , il compilatore tenta di risolverlo nella proprietà predefinita. Tuttavia, esistono
due possibili proprietà predefinite a causa delle interfacce ereditate, quindi il compilatore segnala l'errore.
ID errore: BC30686

Per correggere l'errore


Evitare di ereditare i membri con lo stesso nome. Nell'esempio precedente, se non testObj necessita di
alcun membro di, ad esempio, Iface2 , dichiararlo come segue:

Dim testObj As Iface1

-oppure-
Implementare l'interfaccia di ereditarietà in una classe. È quindi possibile implementare ognuna delle
proprietà ereditate con nomi diversi. Tuttavia, solo uno di essi può essere la proprietà predefinita della
classe di implementazione. Questa condizione è illustrata nell'esempio seguente.
Public Class useIface3
Implements Iface3
Default Public Property prop1(ByVal arg As Integer) As Integer Implements Iface1.prop
' Insert code to define Get and Set procedures for prop1.
End Property
Public Property prop2(ByVal arg As Integer) As Integer Implements Iface2.prop
' Insert code to define Get and Set procedures for prop2.
End Property
End Class

Vedi anche
Interfacce
BC30220: la classe delegata ' <classname> ' non ha
un metodo Invoke, quindi un'espressione di questo
tipo non può essere la destinazione di una chiamata
al metodo
05/03/2021 • 2 minutes to read • Edit Online

Una chiamata a Invoke tramite un delegato non è riuscita perché Invoke non è implementato nella classe
delegata.
ID errore: BC30220

Per correggere l'errore


1. Assicurarsi che un'istanza della classe delegata sia stata creata con un' Dim istruzione e che una routine
sia stata assegnata all'istanza del delegato con l' AddressOf operatore.
2. Individuare il codice che implementa la classe delegata e assicurarsi che implementi la Invoke
procedura.

Vedi anche
Delegati
Istruzione Delegate
Operatore AddressOf
Istruzione Dim
BC30029: le classi derivate non possono generare
eventi di classe base
05/03/2021 • 2 minutes to read • Edit Online

Un evento può essere generato solo dallo spazio di dichiarazione in cui è dichiarato. Pertanto, una classe non
può generare eventi da qualsiasi altra classe, anche uno da cui è derivato.
ID errore: BC30029

Per correggere l'errore


Spostare l' Event istruzione o l' RaiseEvent istruzione in modo che si trovino nella stessa classe.

Vedi anche
Istruzione Event
Istruzione RaiseEvent
Errore di I/O del dispositivo
05/03/2021 • 2 minutes to read • Edit Online

Si è verificato un errore di input o di output durante il programma in uso di un dispositivo, ad esempio una
stampante o un'unità disco.

Per correggere l'errore


Verificare che il dispositivo funzioni correttamente, quindi ripetere l'operazione.

Vedi anche
Tipi di errore
La funzione 'Dir' deve essere anzitutto chiamata con
un argomento 'PathName'
05/03/2021 • 2 minutes to read • Edit Online

Una chiamata iniziale alla Dir funzione non include l' PathName argomento. La prima chiamata a Dir deve
includere un oggetto PathName , ma le chiamate successive a Dir non devono includere parametri per
recuperare l'elemento successivo.

Per correggere l'errore


Fornire un PathName argomento nella chiamata di funzione.

Vedere anche
Dir
BC30205: è prevista la fine dell'istruzione
05/03/2021 • 2 minutes to read • Edit Online

L'istruzione è sintatticamente completa, ma un elemento di programmazione aggiuntivo segue l'elemento che


completa l'istruzione. Alla fine di ogni istruzione è necessario un terminatore di riga.
Un terminatore di riga divide i caratteri di un Visual Basic file di origine in righe. Esempi di caratteri di
terminazione di riga sono il carattere di ritorno a capo Unicode (&HD), il carattere di avanzamento riga Unicode
(&HA) e il carattere di ritorno a capo Unicode seguito dal carattere di avanzamento riga Unicode. Per ulteriori
informazioni sui caratteri di terminazione di riga, vedere la specifica del linguaggio Visual Basic.
ID errore: BC30205

Per correggere l'errore


1. Verificare se due istruzioni diverse sono state inavvertitamente posizionate nella stessa riga.
2. Inserire un terminatore di riga dopo l'elemento che completa l'istruzione.

Vedi anche
Procedura: Interrompere e combinare istruzioni nel codice
Istruzioni
BC30140: errore durante la creazione del manifesto
dell'assembly: <error message>
05/03/2021 • 2 minutes to read • Edit Online

Il compilatore Visual Basic chiama assembly linker (Al.exe, noto anche come ALink) per generare un assembly
con un manifesto. Il linker ha segnalato un errore nella fase di pre-emissione della creazione dell'assembly.
Questo può accadere se si verificano errori con il file di chiave o il contenitore di chiavi specificato. Per la firma
completa di un assembly, è necessario fornire un file di chiave valido contenente informazioni sulle chiavi
pubblica e privata. Per ritardare la firma di un assembly, è necessario selezionare la casella di controllo Solo
firma ritardata e fornire un file di chiave valido contenente informazioni sulla chiave pubblica. Quando la
firma di un assembly viene ritardata, la chiave privata non è necessaria. Per altre informazioni, vedere Procedura:
Firmare un assembly con un nome sicuro.
ID errore: BC30140

Per correggere l'errore


1. Esaminare il messaggio di errore tra virgolette e consultare l'argomento Al.exe. per l'errore AL1019
ulteriori spiegazioni e suggerimenti
2. Se l'errore persiste, raccogliere informazioni sulla situazione contingente e informare il Servizio Supporto
Tecnico Clienti Microsoft.

Vedi anche
Procedura: firmare un assembly con un nome sicuro
Pagina Firma, Progettazione progetti
Al.exe
Opzioni per commenti e suggerimenti in Visual Studio
BC30136: errore durante la creazione delle risorse
Win32: <error message>
05/03/2021 • 2 minutes to read • Edit Online

Il compilatore Visual Basic chiama assembly linker (Al.exe, noto anche come ALink) per generare un assembly
con un manifesto. Il linker ha rilevato un errore nella creazione di una risorsa in memoria. Potrebbe trattarsi di
un problema di ambiente o di memoria insufficiente nel computer.
ID errore: BC30136

Per correggere l'errore


1. Esaminare il messaggio di errore tra virgolette e consultare l'argomento Al.exe. per altre spiegazioni e
consigli.
2. Se l'errore persiste, raccogliere informazioni sulla situazione contingente e informare il Servizio Supporto
Tecnico Clienti Microsoft.

Vedi anche
Al.exe
Opzioni per commenti e suggerimenti in Visual Studio
Errore di caricamento della DLL (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Una libreria di collegamento dinamico (DLL) è una libreria specificata nella Lib clausola di un' Declare
istruzione. Le possibili cause di questo errore includono:
Il file non è un file eseguibile DLL.
Il file non è una DLL di Microsoft Windows.
La DLL fa riferimento a un'altra DLL non presente.
La DLL o la DLL a cui si fa riferimento non si trova in una directory specificata nel percorso.

Per correggere l'errore


Se il file è un file di testo di origine e pertanto non un eseguibile DLL, è necessario compilarlo e collegarlo
a un modulo eseguibile DLL.
Se il file non è una DLL di Microsoft Windows, ottenere l'equivalente di Microsoft Windows.
Se la DLL fa riferimento a un'altra DLL non presente, ottenere la DLL a cui si fa riferimento e renderla
disponibile.
Se la dll o la dll a cui si fa riferimento non è presente in una directory specificata dal percorso, spostare la
DLL in una directory a cui si fa riferimento.

Vedi anche
Declare Statement
BC30137: errore durante il salvataggio del file di
risorse Win32 temporaneo ' <filename> ': <error
message>
05/03/2021 • 2 minutes to read • Edit Online

Il compilatore Visual Basic chiama assembly linker (Al.exe, noto anche come ALink) per generare un assembly
con un manifesto. Il linker ha segnalato un errore durante il tentativo di ottenere un nome di file in cui scrivere
una risorsa in memoria.
ID errore: BC30137

Per correggere l'errore


1. Esaminare il messaggio di errore tra virgolette e consultare l'argomento Al.exe. per altre spiegazioni e
consigli.
2. Se l'errore persiste, raccogliere informazioni sulla situazione contingente e informare il Servizio Supporto
Tecnico Clienti Microsoft.

Vedi anche
Al.exe
Opzioni per commenti e suggerimenti in Visual Studio
BC36810: si sono verificati errori durante la
compilazione degli XML Schema nel progetto
05/03/2021 • 2 minutes to read • Edit Online

Si sono verificati errori durante la compilazione degli XML Schema nel progetto. Per questo motivo, IntelliSense
XML non è disponibile.
Si è verificato un errore in uno schema XSD (XML Schema Definition) incluso nel progetto. Questo errore si
verifica quando si aggiunge un file di schema XSD (XSD) in conflitto con il set di schemi XSD esistente per il
progetto.
ID errore: BC36810

Per correggere l'errore


Fare doppio clic sull'avviso nella finestra Elenco errori . Visual Basic consentirà di passare al percorso
nel file XSD che rappresenta l'origine dell'avviso. Correggere l'errore nello schema XSD.
Verificare che tutti i file di schema XSD (. xsd) necessari siano inclusi nel progetto. Potrebbe essere
necessario fare clic su Mostra tutti i file nel menu progetto per visualizzare i file con estensione XSD
in Esplora soluzioni . Fare clic con il pulsante destro del mouse su un file con estensione XSD, quindi
scegliere Includi nel progetto per includere il file nel progetto.
Se si utilizza la procedura guidata XML per schema, questo errore può verificarsi se si deduce più di una
volta gli schemi dalla stessa origine. In questo caso, è possibile rimuovere i file di schema XSD esistenti
dal progetto, aggiungere un nuovo modello di elemento XML a schema, quindi fornire la procedura
guidata XML to schema con tutte le origini XML applicabili per il progetto.
Se nello schema XSD non viene identificato alcun errore, è possibile che il compilatore XML non disponga
di informazioni sufficienti per fornire un messaggio di errore dettagliato. Se si verifica che gli spazi dei
nomi XML per i file XSD inclusi nel progetto corrispondano agli spazi dei nomi XML identificati per il set
di XML Schema in Visual Studio, è possibile ottenere informazioni più dettagliate sugli errori.

Vedi anche
Finestra Elenco errori
XML
BC30722: timeout della valutazione dell'espressione
o dell'istruzione
05/03/2021 • 2 minutes to read • Edit Online

La valutazione di un'espressione non è stata completata in modo tempestivo.


ID errore: BC30722

Per correggere l'errore


1. Verificare che il codice immesso sia corretto.
2. Semplificare l'espressione in modo da impiegare meno tempo per l'esecuzione.

Vedi anche
Debug in Visual Studio
BC31423: l'evento ' <eventname1> ' non può
implementare <eventname2> l'evento ''
nell'interfaccia ' <interface> ' perché i tipi delegati '
<delegate1> ' è <delegate2> ' non corrispondono
05/03/2021 • 2 minutes to read • Edit Online

Visual Basic non è in grado di implementare un evento perché il tipo delegato dell'evento non corrisponde al
tipo delegato dell'evento nell'interfaccia. Questo errore può insorgere quando si definiscono più eventi in
un'interfaccia e si prova a implementarli assieme con lo stesso evento. Un evento può implementare due o più
eventi solo se tutti gli eventi implementati vengono dichiarati usando la sintassi As e se tutti specificano lo
stesso tipo delegato.
ID errore: BC31423

Per correggere l'errore


Implementare gli eventi separatamente.
-oppure-
Definire gli eventi nell'interfaccia usando la As sintassi e specificare lo stesso tipo delegato.

Vedi anche
Istruzione Event
Istruzione Delegate
Eventi
BC31084: non è possibile dichiarare gli eventi con
un tipo delegato che ha un tipo restituito
05/03/2021 • 2 minutes to read • Edit Online

È stato specificato un delegato per una routine di funzione.


ID errore: BC31084

Per correggere l'errore


Specificare un delegato per una Sub routine.

Vedi anche
Eventi
BC30594: gli eventi delle variabili WithEvents
condivise non possono essere gestiti da metodi non
condivisi
05/03/2021 • 2 minutes to read • Edit Online

Una variabile dichiarata con il Shared modificatore è una variabile condivisa. Una variabile condivisa identifica
esattamente un percorso di archiviazione. Una variabile dichiarata con il WithEvents modificatore dichiara che il
tipo a cui appartiene la variabile gestisce il set di eventi generato dalla variabile. Quando un valore viene
assegnato alla variabile, la proprietà creata dalla WithEvents dichiarazione sgancia qualsiasi gestore eventi
esistente e associa il nuovo gestore eventi tramite il Add metodo.
ID errore: BC30594

Per correggere l'errore


Dichiarare il gestore dell'evento Shared .

Vedi anche
Condivisa
WithEvents
BC30491: l'espressione non produce un valore
05/03/2021 • 2 minutes to read • Edit Online

Si è tentato di usare un'espressione che non produce un valore in un contesto che produce valori, ad esempio
chiamando un oggetto Sub in un contesto in cui Function è previsto un oggetto.
ID errore: BC30491

Per correggere l'errore


Modificare l'espressione in una che produce un valore.

Vedi anche
Tipi di errore
BC31393: l'espressione ha il tipo ' <typename> ' che
è un tipo con restrizioni e non può essere usato per
accedere ai membri ereditati da' Object ' o '
ValueType '
05/03/2021 • 2 minutes to read • Edit Online

Un'espressione restituisce un tipo che non può essere boxed dal Common Language Runtime (CLR) ma accede
a un membro che richiede la conversione boxing.
Il termine boxing indica il processo di elaborazione necessario per la conversione di un tipo in Object o
ValueType. Il Common Language Runtime non può eseguire il box di determinati tipi di struttura, ad esempio,
ArgIterator RuntimeArgumentHandle e TypedReference .
Questa espressione tenta di usare il tipo con restrizioni per chiamare un metodo ereditato da Object o
ValueType , ad esempio GetHashCode o ToString . Per accedere a questo metodo, Visual Basic ha tentato di
eseguire una conversione boxing implicita che genera questo errore.
ID errore: BC31393

Per correggere l'errore


1. Trovare l'espressione che restituisce il tipo citato.
2. Individuare la parte dell'istruzione che tenta di chiamare il metodo ereditato da Object o ValueType .
3. Riscrivere l'istruzione per evitare la chiamata al metodo.

Vedi anche
Conversioni implicite ed esplicite
BC30068: Expression è un valore e pertanto non
può essere la destinazione di un'assegnazione
05/03/2021 • 2 minutes to read • Edit Online

Un'istruzione tenta di assegnare un valore a un'espressione. È possibile assegnare un valore solo a una variabile
scrivibile, a una proprietà o a un elemento di matrice in fase di esecuzione. Nell'esempio seguente viene
illustrato come può verificarsi l'errore.

Dim yesterday As Integer


ReadOnly maximum As Integer = 45
yesterday + 1 = DatePart(DateInterval.Day, Now)
' The preceding line is an ERROR because of an expression on the left.
maximum = 50
' The preceding line is an ERROR because maximum is declared ReadOnly.

Esempi simili possono essere applicati alle proprietà e agli elementi di matrice.
Accesso indiretto. L'accesso indiretto tramite un tipo di valore può anche generare questo errore. Si consideri
l'esempio di codice seguente, che tenta di impostare il valore di Point accedendo indirettamente tramite
Location .

' Assume this code runs inside Form1.


Dim exitButton As New System.Windows.Forms.Button()
exitButton.Text = "Exit this form"
exitButton.Location.X = 140
' The preceding line is an ERROR because of no storage for Location.

L'ultima istruzione dell'esempio precedente ha esito negativo perché crea solo un'allocazione temporanea per la
Point struttura restituita dalla Location Proprietà. Una struttura è un tipo di valore e la struttura temporanea non
viene mantenuta dopo l'esecuzione dell'istruzione. Il problema viene risolto dichiarando e utilizzando una
variabile per Location , che consente di creare un'allocazione più permanente per la Point struttura. Nell'esempio
seguente viene illustrato il codice in grado di sostituire l'ultima istruzione dell'esempio precedente.

Dim exitLocation as New System.Drawing.Point(140, exitButton.Location.Y)


exitButton.Location = exitLocation

ID errore: BC30068

Per correggere l'errore


Se l'istruzione assegna un valore a un'espressione, sostituire l'espressione con una singola variabile
scrivibile, una proprietà o un elemento di matrice.
Se l'istruzione consente l'accesso indiretto tramite un tipo di valore (in genere una struttura), creare una
variabile che contenga il tipo di valore.
Assegnare la struttura appropriata (o un altro tipo di valore) alla variabile.
Utilizzare la variabile per accedere alla proprietà per assegnarle un valore.
Vedi anche
Operatori ed espressioni
Istruzioni
Risoluzione dei problemi relativi alle routine
BC36593: l'espressione di tipo <type> non è
Queryable
05/03/2021 • 2 minutes to read • Edit Online

L'espressione di tipo <type> non è Queryable. Verificare che non manchi un riferimento all'assembly e/o
l'importazione dello spazio dei nomi per il provider LINQ.
I tipi queryable sono definiti negli System.Linq System.Data.Linq System.Xml.Linq spazi dei nomi, e. Per eseguire
query LINQ è necessario importare uno o più di questi spazi dei nomi.
Lo System.Linq spazio dei nomi consente di eseguire query su oggetti quali raccolte e matrici utilizzando LINQ.
Lo System.Data.Linq spazio dei nomi consente di eseguire query sui set di dati ADO.NET e SQL Server database
usando LINQ.
Lo System.Xml.Linq spazio dei nomi consente di eseguire query su XML utilizzando LINQ e di utilizzare le
funzionalità XML in Visual Basic.
ID errore: BC36593

Per correggere l'errore


1. Aggiungere un' Import istruzione per lo System.Linq System.Data.Linq System.Xml.Linq spazio dei nomi,
o al file di codice. È anche possibile importare gli spazi dei nomi per il progetto tramite la pagina
riferimenti di progettazione progetti (progetto ).
2. Verificare che il tipo identificato come origine della query sia un tipo Queryable. Ovvero un tipo che
implementa IEnumerable<T> o IQueryable<T> .

Vedi anche
System.Linq
System.Data.Linq
System.Xml.Linq
Introduzione a LINQ in Visual Basic
LINQ
XML
Riferimenti e istruzione Imports
Istruzione Imports (tipo e spazio dei nomi .NET)
Riferimenti (pagina), Creazione progetti (Visual Basic)
BC42026: l'espressione chiama in modo ricorsivo la
proprietà'' che lo contiene <propertyname>
05/03/2021 • 2 minutes to read • Edit Online

Un'istruzione nella Set procedura di una definizione di proprietà archivia un valore nel nome della proprietà.
L'approccio consigliato per contenere il valore di una proprietà consiste nel definire una Private variabile nel
contenitore della proprietà e usarla in entrambe le Get routine e Set . La Set stored procedure deve quindi
archiviare il valore in ingresso in questa Private variabile.
La Get procedura si comporta come una Function routine, quindi può assegnare un valore al nome della
proprietà e restituire il controllo mediante l' End Get istruzione. Tuttavia, l'approccio consigliato consiste
nell'includere la Private variabile come valore in un' istruzione Return.
La Set procedura si comporta come una Sub routine che non restituisce un valore. Pertanto, il nome della
procedura o della proprietà non ha un significato speciale all'interno di una Set routine e non è possibile
archiviarvi un valore.
Nell'esempio seguente viene illustrato l'approccio che può causare questo errore, seguito dall'approccio
consigliato.

Public Class illustrateProperties


' The code in the following property causes this error.
Public Property badProp() As Char
Get
Dim charValue As Char
' Insert code to update charValue.
badProp = charValue
End Get
Set(ByVal Value As Char)
' The following statement causes this error.
badProp = Value
' The value stored in the local variable badProp
' is not used by the Get procedure in this property.
End Set
End Property
' The following code uses the recommended approach.
Private propValue As Char
Public Property goodProp() As Char
Get
' Insert code to update propValue.
Return propValue
End Get
Set(ByVal Value As Char)
propValue = Value
End Set
End Property
End Class

Per impostazione predefinita, si tratta di un messaggio di avviso. Per altre informazioni su come nascondere gli
avvisi o considerarli come errori, vedere Configuring Warnings in Visual Basic.
ID errore: BC42026

Per correggere l'errore


Riscrivere la definizione della proprietà in modo da usare l'approccio consigliato, come illustrato
nell'esempio precedente.

Vedi anche
Routine Property
Property Statement
Istruzione set
Espressione troppo complessa
05/03/2021 • 2 minutes to read • Edit Online

Un'espressione a virgola mobile contiene troppe sottoespressioni nidificate.

Per correggere l'errore


Suddividere l'espressione in tutte le espressioni separate necessarie per impedire che si verifichi l'errore.

Vedi anche
Operatori ed espressioni
BC36550: è possibile applicare l'attributo ' Extension
' solo alle dichiarazioni ' Module ',' Sub ' o '
Function '
05/03/2021 • 2 minutes to read • Edit Online

L'unico modo per estendere un tipo di dati in Visual Basic consiste nel definire un metodo di estensione
all'interno di un modulo standard. Il metodo di estensione può essere una Sub routine o una Function routine.
Tutti i metodi di estensione devono essere contrassegnati con l'attributo extension, <Extension()> , dallo
System.Runtime.CompilerServices spazio dei nomi. Facoltativamente, un modulo che contiene un metodo di
estensione può essere contrassegnato nello stesso modo. Nessun altro uso dell'attributo di estensione è valido.
ID errore: BC36550

Per correggere l'errore


Rimuovere l'attributo di estensione.
Riprogettare l'estensione come metodo, definito in un modulo contenitore.

Esempio
Nell'esempio seguente viene definito un Print metodo per il String tipo di dati.

Imports StringUtility
Imports System.Runtime.CompilerServices
Namespace StringUtility
<Extension()>
Module StringExtensions
<Extension()>
Public Sub Print (ByVal str As String)
Console.WriteLine(str)
End Sub
End Module
End Namespace

Vedi anche
Panoramica degli attributi
Metodi di estensione
Istruzione Module
File già aperto
05/03/2021 • 2 minutes to read • Edit Online

In alcuni casi è necessario chiudere un file prima che sia possibile eseguire un'altra FileOpen operazione o
un'altra. Di seguito sono riportate le cause possibili dell'errore:
FileOpen È stata eseguita un'operazione sequenziale in modalità output per un file già aperto
Un'istruzione fa riferimento a un file aperto.

Per correggere l'errore


Chiudere il file prima di eseguire l'istruzione.

Vedere anche
FileOpen
Il file è troppo grande per essere letto in una
matrice byte
05/03/2021 • 2 minutes to read • Edit Online

La dimensione del file che si sta tentando di leggere in una matrice di byte supera i 4 GB. Il
My.Computer.FileSystem.ReadAllBytes metodo non è in grado di leggere un file che supera questa dimensione.

Per correggere l'errore


Usare un StreamReader per leggere il file. Per ulteriori informazioni, vedere nozioni di base sull'i/O dei file
.NET Framework e sul file System (Visual Basic).

Vedi anche
ReadAllBytes
StreamReader
Accesso ai file con Visual Basic
Procedura: Leggere il testo da file con un oggetto StreamReader
Nome di file o nome di classe non trovato durante
un'operazione di automazione (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Impossibile trovare il nome specificato per il nome file o la classe in una chiamata alla GetObject funzione.

Per correggere l'errore


Controllare i nomi e riprovare. Verificare che il nome utilizzato per il class parametro corrisponda a quello
registrato con il sistema.

Vedi anche
Tipi di errore
Impossibile trovare il file (errore di run-time Visual
Basic)
05/03/2021 • 2 minutes to read • Edit Online

Il file non è stato trovato dove specificato. L'errore ha le seguenti cause possibili:
Un'istruzione fa riferimento a un file che non esiste.
È stato effettuato un tentativo di chiamare una routine in una libreria a collegamento dinamico (DLL), ma
la libreria specificata nella Lib clausola dell' Declare istruzione non è stata trovata.
Si è tentato di aprire un progetto o di caricare un file di testo inesistente.

Per correggere l'errore


Controllare l'ortografia del nome del file e la specifica del percorso.

Vedi anche
Declare Statement
BC33107: il primo operando in un'espressione ' If '
binaria deve essere nullable o un tipo riferimento
05/03/2021 • 2 minutes to read • Edit Online

Un' If espressione può assumere due o tre argomenti. Quando si inviano solo due argomenti, il primo
argomento deve essere un tipo di riferimento o un tipo di valore Nullable. Se il primo argomento restituisce
qualcosa di diverso da Nothing , viene restituito il relativo valore. Se il primo argomento restituisce Nothing , il
secondo argomento viene valutato e restituito.
Il codice seguente, ad esempio, contiene due If espressioni, una con tre argomenti e una con due argomenti.
Le espressioni calcolano e restituiscono lo stesso valore.

' firstChoice is a nullable value type.


Dim firstChoice? As Integer = Nothing
Dim secondChoice As Integer = 1128
' If expression with three arguments.
Console.WriteLine(If(firstChoice IsNot Nothing, firstChoice, secondChoice))
' If expression with two arguments.
Console.WriteLine(If(firstChoice, secondChoice))

Le seguenti espressioni generano questo errore:

Dim choice1 = 4
Dim choice2 = 5
Dim booleanVar = True

' Not valid.


'Console.WriteLine(If(choice1 < choice2, 1))
' Not valid.
'Console.WriteLine(If(booleanVar, "Test returns True."))

ID errore: BC33107

Per correggere l'errore


Se non è possibile modificare il codice in modo che il primo argomento sia un tipo di valore o un tipo di
riferimento Nullable, provare a eseguire la conversione in un'espressione a tre argomenti If o in un'
If...Then...Else istruzione.

Console.WriteLine(If(choice1 < choice2, 1, 2))


Console.WriteLine(If(booleanVar, "Test returns True.", "Test returns False."))

Vedi anche
Operatore If
Istruzione If...Then...Else
Tipi di valore Nullable
BC30148: la prima istruzione di questo ' Sub New '
deve essere una chiamata a' MyBase. New ' o a'
MyClass. New ' (nessun costruttore accessibile senza
parametri)
05/03/2021 • 2 minutes to read • Edit Online

La prima istruzione di questo ' Sub New ' deve essere una chiamata a' MyBase. New ' o a' MyClass. New '
perché la classe base ' <basename> ' di ' <derivedname> ' non ha un'Sub New ' accessibile che può essere
chiamato senza argomenti.
In una classe derivata ogni costruttore deve chiamare un costruttore della classe base ( MyBase.New ). Se la
classe base dispone di un costruttore senza parametri accessibile alle classi derivate, MyBase.New può essere
chiamato automaticamente. In caso contrario, è necessario chiamare un costruttore della classe base con
parametri e questa operazione non può essere eseguita automaticamente. In questo caso, la prima istruzione di
ogni costruttore della classe derivata deve chiamare un costruttore con parametri sulla classe di base o
chiamare un altro costruttore nella classe derivata che effettua una chiamata al costruttore della classe base.
ID errore: BC30148

Per correggere l'errore


Chiamare MyBase.New la fornitura dei parametri obbligatori o chiamare un costruttore peer che esegue
tale chiamata.
Se, ad esempio, la classe base ha un costruttore dichiarato come Public Sub New(ByVal index as Integer)
, la prima istruzione nel costruttore della classe derivata potrebbe essere MyBase.New(100) .

Vedi anche
Nozioni fondamentali sull'ereditarietà
BC30920: la prima istruzione di questo ' Sub New '
deve essere una chiamata esplicita a' MyBase. New '
o a' MyClass. New ' perché' <constructorname> '
nella classe base ' <baseclassname> ' di '
<derivedclassname> ' è contrassegnato come
obsoleto:' <errormessage> '
05/03/2021 • 2 minutes to read • Edit Online

Un costruttore di classe non chiama esplicitamente un costruttore della classe base e il costruttore della classe
base implicito è contrassegnato con l'attributo ObsoleteAttribute e la direttiva di considerarlo come un errore.
Quando un costruttore della classe derivata non chiama un costruttore della classe base, Visual Basic tenta di
generare una chiamata implicita a un costruttore della classe base senza parametri. Se nella classe base non è
presente alcun costruttore accessibile che può essere chiamato senza argomenti, Visual Basic non può generare
una chiamata implicita. In questo caso, il costruttore obbligatorio è contrassegnato con l' ObsoleteAttribute
attributo, quindi Visual Basic non può chiamarlo.
È possibile contrassegnare qualsiasi elemento di programmazione come non più in uso applicando
ObsoleteAttribute a tale elemento. In questo caso, è possibile impostare la proprietà IsError dell'attributo su
True o False . Se si imposta la proprietà su True , il compilatore considera il tentativo di usare l'elemento
come un errore. Se si imposta la proprietà su False , o si lascia l'impostazione predefinita False , il compilatore
genera un avviso se si prova a usare l'elemento.
ID errore: BC30920

Per correggere l'errore


1. Esaminare il messaggio di errore tra virgolette e intraprendere l'azione appropriata.
2. Includere una chiamata a MyBase.New() o MyClass.New() come prima istruzione di Sub New nella classe
derivata.

Vedi anche
Panoramica degli attributi
BC32096:' for each ' sul tipo ' <typename> ' è
ambiguo perché il tipo implementa più creazioni di
istanza di ' System. Collections. Generic.
IEnumerable (Of T)'
05/03/2021 • 2 minutes to read • Edit Online

Un' For Each istruzione specifica una variabile iteratore con più di un GetEnumerator metodo.
La variabile iteratore deve essere di un tipo che implementa System.Collections.IEnumerable l'
System.Collections.Generic.IEnumerable<T> interfaccia o in uno degli Collections spazi dei nomi del .NET
Framework. È possibile che una classe implementi più di un'interfaccia generica costruita, usando un argomento
di tipo diverso per ogni costruzione. Se una classe che esegue questa operazione viene usata per la variabile
iteratore, tale variabile ha più di un GetEnumerator metodo. In tal caso, Visual Basic non è in grado di scegliere il
metodo da chiamare.
ID errore: BC32096

Per correggere l'errore


Usare l'operatore DirectCast o TryCast per eseguire il cast del tipo di variabile iteratore all'interfaccia che
definisce il GetEnumerator metodo che si vuole usare.

Vedi anche
Istruzione For Each...Next
Interfacce
BC31535: il riferimento all'assembly Friend
<reference> non è valido
05/03/2021 • 2 minutes to read • Edit Online

Il riferimento all'assembly Friend <reference> non è valido. Gli assembly firmati con nome sicuro devono
specificare una chiave pubblica nelle relative dichiarazioni InternalsVisibleTo.
Il nome dell'assembly passato al InternalsVisibleToAttribute costruttore dell'attributo identifica un assembly con
nome sicuro, ma non include un PublicKey attributo.
ID errore: BC31535

Per correggere l'errore


1. Determinare la chiave pubblica per l'assembly Friend con nome sicuro. Includere la chiave pubblica come
parte del nome dell'assembly passato al InternalsVisibleToAttribute costruttore dell'attributo utilizzando l'
PublicKey attributo.

Vedi anche
AssemblyName
Assembly Friend
BC42105: la funzione ' <procedurename> ' non
restituisce un valore in tutti i percorsi del codice
05/03/2021 • 2 minutes to read • Edit Online

La funzione ' <procedurename> ' non restituisce un valore in tutti i percorsi del codice. Manca un'istruzione '
Return '?
Una Function routine ha almeno un possibile percorso nel codice che non restituisce un valore.
È possibile restituire un valore da una Function routine in uno dei modi seguenti:
Includere il valore in un' istruzione return.
Assegnare il valore al Function nome della stored procedure, quindi eseguire un' Exit Function
istruzione.
Assegnare il valore al Function nome della stored procedure, quindi eseguire l' End Function istruzione.
Se il controllo passa a Exit Function o End Function e non è stato assegnato alcun valore al nome della stored
procedure, la stored procedure restituisce il valore predefinito del tipo di dati restituito. Per ulteriori
informazioni, vedere "Behavior" nell' istruzione Function.
Per impostazione predefinita, si tratta di un messaggio di avviso. Per altre informazioni su come nascondere gli
avvisi o considerarli come errori, vedere Configuring Warnings in Visual Basic.
ID errore: BC42105

Per correggere l'errore


Controllare la logica del flusso di controllo e assicurarsi di assegnare un valore prima di ogni istruzione
che causa la restituzione.
È più facile garantire che ogni ritorno dalla procedura restituisca un valore se si usa sempre l' Return
istruzione. In tal caso, l'ultima istruzione prima End Function deve essere un' Return istruzione.

Vedi anche
Routine Function
Istruzione Function
Compilazione (pagina), Creazione progetti (Visual Basic)
BC30957: la valutazione della funzione è disabilitata
perché si è verificato il timeout di una valutazione di
funzione precedente
05/03/2021 • 2 minutes to read • Edit Online

Valutazione della funzione disabilitata a causa del timeout di una valutazione di funzione precedente. Per
riabilitare la valutazione della funzione, eseguire di nuovo l'istruzione o riavviare il debug.
Nel debugger di Visual Studio un'espressione specifica una chiamata di routine, ma si è verificato il timeout di
un'altra valutazione.
Le possibili cause di una chiamata di routine a timeout includono un ciclo infinito o infinito. Per ulteriori
informazioni, vedere per... Istruzione successiva.
Un caso speciale di un ciclo infinito è la ricorsione. Per ulteriori informazioni, vedere procedure ricorsive.
ID errore: BC30957

Per correggere l'errore


1. Se possibile, determinare la valutazione della funzione precedente e la causa del timeout. In caso
contrario, è possibile che si verifichi questo errore.
2. Eseguire di nuovo l'istruzione del debugger oppure terminare e riavviare il debug.

Vedi anche
Debug in Visual Studio
Spostarsi nel codice con il Debugger
BC32124: i parametri generici usati come tipi di
parametro facoltativi devono essere vincolati alla
classe
05/03/2021 • 2 minutes to read • Edit Online

Una routine viene dichiarata con un parametro facoltativo che utilizza un parametro di tipo che non è vincolato
come tipo di riferimento.
È sempre necessario specificare un valore predefinito per ogni parametro facoltativo. Se il parametro è di un
tipo di riferimento, il valore facoltativo deve essere Nothing , che è un valore valido per qualsiasi tipo di
riferimento. Tuttavia, se il parametro è di un tipo di valore, tale tipo deve essere un tipo di dati Elementary
predefinito da Visual Basic. Questo perché un tipo di valore composito, ad esempio una struttura definita
dall'utente, non ha un valore predefinito valido.
Quando si usa un parametro di tipo per un parametro facoltativo, è necessario garantire che sia di un tipo di
riferimento per evitare la possibilità di un tipo di valore senza valore predefinito valido. Ciò significa che è
necessario vincolare il parametro di tipo con la Class parola chiave o con il nome di una classe specifica.
ID errore: BC32124

Per correggere l'errore


Vincolare il parametro di tipo in modo che accetti solo un tipo riferimento o non lo usi per il parametro
facoltativo.

Vedi anche
Generic Types in Visual Basic
Type List
Istruzione Class
Parametri facoltativi
Strutture
Nothing
BC31103: la funzione di accesso ' Get ' della
proprietà' <propertyname> ' non è accessibile
05/03/2021 • 2 minutes to read • Edit Online

Un'istruzione tenta di recuperare il valore di una proprietà quando non ha accesso alla routine della proprietà
Get .

Se l' istruzione Get è contrassegnata con un livello di accesso più restrittivo rispetto alla relativa istruzione
Property, un tentativo di leggere il valore della proprietà potrebbe non riuscire nei casi seguenti:
L' Get istruzione è contrassegnata come privata e il codice chiamante è all'esterno della classe o della
struttura in cui è definita la proprietà.
L' Get istruzione è contrassegnata come protetta e il codice chiamante non si trova nella classe o nella
struttura in cui è definita la proprietà, né in una classe derivata.
L' Get istruzione è contrassegnata come Friend e il codice chiamante non si trova nello stesso assembly
in cui è definita la proprietà.
ID errore: BC31103

Per correggere l'errore


Se si ha il controllo del codice sorgente che definisce la proprietà, provare a dichiarare la Get routine con
lo stesso livello di accesso della proprietà stessa.
Se non si ha il controllo del codice sorgente che definisce la proprietà o se è necessario limitare il Get
livello di accesso della routine più della proprietà stessa, provare a spostare l'istruzione che legge il valore
della proprietà in un'area di codice con un accesso migliore alla proprietà.

Vedi anche
Routine Property
Procedura: dichiarare una proprietà con livelli di accesso misti
BC30506: la clausola Handles richiede una variabile
WithEvents definita nel tipo che lo contiene o in
uno dei relativi tipi di base
05/03/2021 • 2 minutes to read • Edit Online

Non è stata fornita una WithEvents variabile nella Handles clausola. La Handles parola chiave alla fine di una
dichiarazione di routine fa in modo che gestisca gli eventi generati da una variabile oggetto dichiarata con la
WithEvents parola chiave.

ID errore: BC30506

Per correggere l'errore


Specificare la WithEvents variabile necessaria.

Esempio
Nell'esempio seguente Visual Basic genera un errore del compilatore BC30506 perché la parola chiave
WithEvents non viene utilizzata nella definizione dell' System.Timers.Timer istanza.

Imports System.Timers

Module Module1
Private _timer1 As New Timer() With {.Interval = 1000, .Enabled = True}

Sub Main()
Console.WriteLine("Press any key to start the timer...")
Console.ReadKey()
_timer1.Start()
Console.ReadKey()
End Sub

Private Sub Timer1_Tick(sender As Object, args As EventArgs) Handles _timer1.Elapsed


Console.WriteLine("Press any key to terminate...")
End Sub
End Module

L'esempio seguente viene compilato correttamente perché la _timer1 variabile è definita con la WithEvents
parola chiave:
Imports System.Timers

Module Module1
Private WithEvents _timer1 As New Timer() With {.Interval = 1000}

Sub Main()
Console.WriteLine("Press any key to start the timer...")
Console.ReadKey()
_timer1.Start()
Console.ReadKey()
End Sub

Private Sub Timer1_Tick(sender As Object, args As EventArgs) Handles _timer1.Elapsed


Console.WriteLine("Press any key to terminate...")
End Sub

End Module

Vedi anche
Selettori
BC30203: previsto identificatore
05/03/2021 • 2 minutes to read • Edit Online

Un elemento di programmazione che non è un nome di elemento dichiarato riconoscibile si verifica dove il
contesto richiede un nome di elemento. Una delle possibili cause è che un attributo è stato specificato in un
punto diverso dall'inizio dell'istruzione.
ID errore: BC30203

Per correggere l'errore


Verificare che tutti gli attributi nell'istruzione siano tutti posizionati all'inizio.
Verificare che tutti i nomi degli elementi nell'istruzione siano stati digitati correttamente.

Vedi anche
Declared Element Names
Panoramica degli attributi
BC30033: identificatore troppo lungo
05/03/2021 • 2 minutes to read • Edit Online

Il nome, o identificatore, di ogni elemento di programmazione è limitato a 1023 caratteri. Inoltre, un nome
completo non può superare i 1023 caratteri. Ciò significa che l'intera stringa dell'identificatore (
<namespace>.<...>.<namespace>.<class>.<element> ) non può contenere più di 1023 caratteri, inclusi i caratteri
dell'operatore di accesso ai membri ( . ).
ID errore: BC30033

Per correggere l'errore


Ridurre la lunghezza dell'identificatore.

Vedi anche
Declared Element Names
BC30996: previsto inizializzatore
05/03/2021 • 2 minutes to read • Edit Online

Si è provato a dichiarare un'istanza di una classe usando un inizializzatore di oggetto in cui l'elenco di
inizializzazione è vuoto, come illustrato nell'esempio seguente.
' Not valid.

' Dim aStudent As New Student With {}

È necessario inizializzare almeno un campo o una proprietà nell'elenco di inizializzatori, come illustrato
nell'esempio seguente.
Dim aStudent As New Student With {.year = "Senior"}

ID errore: BC30996

Per correggere l'errore


Inizializzare almeno un campo o una proprietà nell'inizializzatore oppure non usare un inizializzatore di
oggetto.

Vedi anche
Inizializzatori di oggetto: tipi denominati e tipi anonimi
Procedura: dichiarare un oggetto utilizzando un inizializzatore di oggetto
Input oltre la fine del file
05/03/2021 • 2 minutes to read • Edit Online

Un' Input istruzione sta leggendo da un file vuoto o da un file in cui vengono utilizzati tutti i dati oppure è stata
utilizzata la EOF funzione con un file aperto per l'accesso binario.

Per correggere l'errore


1. Utilizzare la EOF funzione immediatamente prima dell' Input istruzione per rilevare la fine del file.
2. Se il file è aperto per l'accesso binario, utilizzare Seek e Loc .

Vedere anche
Input
EOF
Seek
Loc
Si è verificato un errore interno nella <location>
05/03/2021 • 2 minutes to read • Edit Online

Si è verificato un errore interno. La riga in cui si è verificata è contenuta nel messaggio di errore.

Per correggere l'errore


Verificare che questo errore non sia stato generato dall' Error istruzione o dal Raise metodo. in caso
contrario, contattare il servizio supporto tecnico Microsoft per segnalare le condizioni in cui è stato
visualizzato il messaggio.

Vedi anche
Nozioni di base sul debugger
BC41999: conversione implicita da' <typename1> '
a' <typename2> ' durante la copia del valore del
parametro ' ByRef '' <parametername> '
nell'argomento corrispondente.
05/03/2021 • 2 minutes to read • Edit Online

Una routine viene chiamata con un argomento ByRef di un tipo diverso rispetto a quello del parametro
corrispondente.
Se si passa un argomento ByRef , Visual Basic talvolta copia il valore dell'argomento in una variabile locale
nella procedura anziché passare un riferimento. In tal caso, quando la procedura viene restituita, Visual Basic
necessario copiare nuovamente il valore della variabile locale nell'argomento nel codice chiamante.
Se un valore dell'argomento ByRef viene copiato nella routine e l'argomento e il parametro sono dello stesso
tipo, non è necessaria alcuna conversione. Tuttavia, se i tipi sono diversi, Visual Basic necessario eseguire la
conversione in entrambe le direzioni. Poiché non è possibile usare CType o una delle altre parole chiave di
conversione in un argomento o parametro di routine, tale conversione è sempre implicita.
Per impostazione predefinita, si tratta di un messaggio di avviso. Per informazioni su come nascondere gli avvisi
o considerarli come errori, vedere Configuring Warnings in Visual Basic.
ID errore: BC41999

Per correggere l'errore


Se possibile, usare un argomento chiamante dello stesso tipo del parametro della routine, in modo che
Visual Basic non debba eseguire alcuna conversione.
Se è necessario chiamare la routine con un tipo di argomento diverso dal tipo del parametro, ma non è
necessario restituire un valore nell'argomento chiamante, definire il parametro in modo che sia ByVal
invece che ByRef .

Vedi anche
Procedure
Parametri e argomenti delle routine
Passaggio di argomenti per valore e per riferimento
Conversioni implicite ed esplicite
BC30020:' is ' richiede operandi con tipi di
riferimento, ma questo operando ha il tipo di valore
' <typename> '
05/03/2021 • 2 minutes to read • Edit Online

L' Is operatore di confronto determina se due variabili oggetto fanno riferimento alla stessa istanza. Questo
confronto non è definito per i tipi di valore.
ID errore: BC30020

Per correggere l'errore


Utilizzare l'operatore di confronto aritmetico appropriato o l' Like operatore per confrontare due tipi di
valore.

Vedi anche
Operatore Is
Operatore Like
Operatori di confronto
BC32128: l'operando ' non ' del tipo ' typename '
può essere confrontato solo con ' Nothing ' perché'
typename ' è un tipo Nullable
05/03/2021 • 2 minutes to read • Edit Online

Una variabile dichiarata come tipo di valore Nullable è stata confrontata con un'espressione diversa da quella
Nothing usata dall' IsNot operatore.

ID errore: BC32128

Per correggere l'errore


Per confrontare un tipo nullable con un'espressione diversa da Nothing usando l'operatore IsNot , chiamare il
metodo GetType sul tipo nullable e confrontare il risultato con l'espressione, come mostrato nell'esempio
seguente.

Dim number? As Integer = 5

If number IsNot Nothing Then


If number.GetType() IsNot Type.GetType("System.Int32") Then

End If
End If

Vedi anche
Tipi di valore Nullable
Operatore IsNot
BC30801: le etichette che sono numeri devono
essere seguite dai due punti
05/03/2021 • 2 minutes to read • Edit Online

I numeri di riga seguono le stesse regole di altri tipi di etichette e devono contenere i due punti.
ID errore: BC30801

Per correggere l'errore


Posizionare il numero seguito da due punti all'inizio di una riga di codice. Per esempio:

400: X += 1

Vedi anche
Istruzione GoTo
BC42326: l'espressione lambda non verrà rimossa
da questo gestore eventi
05/03/2021 • 2 minutes to read • Edit Online

L'espressione lambda non verrà rimossa da questo gestore eventi. Assegnare l'espressione lambda a una
variabile e usare la variabile per aggiungere e rimuovere l'evento.
Quando le espressioni lambda vengono usate con i gestori eventi, è possibile che non venga visualizzato il
comportamento previsto. Il compilatore genera un nuovo metodo per ogni definizione di espressione lambda,
anche se sono identici. Viene pertanto visualizzato il codice seguente False .

Module Module1

Sub Main()
Dim fun1 As ChangeInteger = Function(p As Integer) p + 1
Dim fun2 As ChangeInteger = Function(p As Integer) p + 1
Console.WriteLine(fun1 = fun2)
End Sub

Delegate Function ChangeInteger(ByVal x As Integer) As Integer

End Module

Quando le espressioni lambda vengono usate con i gestori eventi, è possibile che si verifichino risultati
imprevisti. Nell'esempio seguente l'espressione lambda aggiunta da AddHandler non viene rimossa dall'
RemoveHandler istruzione.

Module Module1

Event ProcessInteger(ByVal x As Integer)

Sub Main()

' The following line adds one listener to the event.


AddHandler ProcessInteger, Function(m As Integer) m

' The following statement searches the current listeners


' for a match to remove. However, this lambda is not the same
' as the previous one, so nothing is removed.
RemoveHandler ProcessInteger, Function(m As Integer) m

End Sub
End Module

Per impostazione predefinita, si tratta di un messaggio di avviso. Per altre informazioni su come nascondere gli
avvisi o considerarli come errori, vedere Configuring Warnings in Visual Basic.
ID errore: BC42326

Per correggere l'errore


Per evitare l'avviso e rimuovere l'espressione lambda, assegnare l'espressione lambda a una variabile e usare la
variabile in entrambe le AddHandler RemoveHandler istruzioni e, come illustrato nell'esempio seguente.
Module Module1

Event ProcessInteger(ByVal x As Integer)

Dim PrintHandler As ProcessIntegerEventHandler

Sub Main()

' Assign the lambda expression to a variable.


PrintHandler = Function(m As Integer) m

' Use the variable to add the listener.


AddHandler ProcessInteger, PrintHandler

' Use the variable again when you want to remove the listener.
RemoveHandler ProcessInteger, PrintHandler

End Sub
End Module

Vedi anche
Espressioni lambda
Conversione di tipo relaxed del delegato
Eventi
BC36635: le espressioni lambda non sono valide
nella prima espressione di un'istruzione ' Select Case
'
05/03/2021 • 2 minutes to read • Edit Online

Non è possibile usare un'espressione lambda per l'espressione di test in un' Select Case istruzione. Le
definizioni delle espressioni lambda restituiscono funzioni e l'espressione di test di un' Select Case istruzione
deve essere un tipo di dati elementare.
Il codice seguente causa questo errore:

' Select Case (Function(arg) arg Is Nothing)


' List of the cases.
' End Select

ID errore: BC36635

Per correggere l'errore


Esaminare il codice per determinare se funziona una costruzione condizionale diversa, ad esempio
un'istruzione If...Then...Else .
È possibile che si abbia intenzione di chiamare la funzione, come illustrato nel codice seguente:

Dim num? As Integer


Select Case ((Function(arg? As Integer) arg Is Nothing)(num))
' List of the cases
End Select

Vedi anche
Espressioni lambda
Istruzione If...Then...Else
Istruzione Select...Case
BC42017: risoluzione con associazione tardiva;
potrebbero verificarsi errori di runtime
05/03/2021 • 2 minutes to read • Edit Online

Un oggetto viene assegnato a una variabile dichiarata come tipo di dati Object.
Quando si dichiara una variabile come Object , il compilatore deve eseguire un' associazione tardiva, causando
operazioni aggiuntive in fase di esecuzione. Espone inoltre l'applicazione a possibili errori di runtime. Se ad
esempio si assegna un oggetto Form alla Object variabile e quindi si tenta di accedere alla
XmlDocument.NameTable proprietà, il runtime genera un'eccezione MemberAccessException perché la Form
classe non espone una NameTable Proprietà.
Se si dichiara che la variabile è di un tipo specifico, il compilatore può eseguire un' associazione anticipata in
fase di compilazione. Ciò comporta un miglioramento delle prestazioni, l'accesso controllato ai membri del tipo
specifico e una migliore leggibilità del codice.
Per impostazione predefinita, si tratta di un messaggio di avviso. Per informazioni su come nascondere gli avvisi
o considerarli come errori, vedere Configuring Warnings in Visual Basic.
ID errore: BC42017

Per correggere l'errore


Se possibile, dichiarare la variabile in modo che sia di un tipo specifico.

Vedi anche
Associazione anticipata e tardiva
Dichiarazione di variabili oggetto
BC30933: non è possibile applicare la risoluzione
dell'overload con associazione tardiva a'
<procedurename> ' perché l'istanza di accesso è un
tipo di interfaccia
05/03/2021 • 3 minutes to read • Edit Online

Il compilatore sta provando a risolvere un riferimento a una proprietà o una routine di overload, ma il
riferimento non riesce perché un argomento è di tipo Object e l'oggetto di riferimento ha il tipo di dati di
un'interfaccia. L' Object argomento impone al compilatore di risolvere il riferimento come ad associazione
tardiva.
In queste circostanze, il compilatore risolve l'overload tramite la classe di implementazione invece che tramite
l'interfaccia sottostante. Se la classe Rinomina una delle versioni di overload, il compilatore non considera tale
versione come un overload perché il nome è diverso. Ciò comporta a sua volta che il compilatore ignori la
versione rinominata quando potrebbe essere stata la scelta corretta per risolvere il riferimento.
ID errore: BC30933

Per correggere l'errore


Utilizzare CType per eseguire il cast dell'argomento da Object al tipo specificato dalla firma
dell'overload che si desidera chiamare.
Si noti che non consente di eseguire il cast dell'oggetto di riferimento all'interfaccia sottostante. Per
evitare questo errore, è necessario eseguire il cast dell'argomento.

Esempio
Nell'esempio seguente viene illustrata una chiamata a una routine di overload Sub che causa questo errore in
fase di compilazione.

Module m1
Interface i1
Sub s1(ByVal p1 As Integer)
Sub s1(ByVal p1 As Double)
End Interface
Class c1
Implements i1
Public Overloads Sub s1(ByVal p1 As Integer) Implements i1.s1
End Sub
Public Overloads Sub s2(ByVal p1 As Double) Implements i1.s1
End Sub
End Class
Sub Main()
Dim refer As i1 = New c1
Dim o1 As Object = 3.1415
' The following reference is INVALID and causes a compiler error.
refer.s1(o1)
End Sub
End Module
Nell'esempio precedente, se il compilatore consentiva la chiamata a s1 come scritto, la risoluzione verrebbe
eseguita tramite la classe c1 anziché l'interfaccia i1 . Ciò significa che il compilatore non prende in
considerazione s2 perché il nome è diverso in c1 , anche se è la scelta corretta in base a quanto definito da
i1 .

È possibile correggere l'errore modificando la chiamata a una delle righe di codice seguenti:

refer.s1(CType(o1, Integer))
refer.s1(CType(o1, Double))

Ognuna delle righe precedenti di codice esegue esplicitamente il cast della Object variabile o1 a uno dei tipi di
parametro definiti per gli overload.

Vedi anche
Overload della routine
Risoluzione dell'overload
CType Function
BC30157: il carattere ' .' o '!' principale può trovarsi
solo all'interno di un'istruzione ' with '
05/03/2021 • 2 minutes to read • Edit Online

Un punto (.) o punto esclamativo (!) che non si trova all'interno di un With blocco si verifica senza
un'espressione a sinistra. L'accesso ai membri ( . ) e l'accesso ai membri del dizionario ( ! ) richiedono
un'espressione che specifica l'elemento che contiene il membro. Deve essere visualizzato immediatamente a
sinistra della funzione di accesso o come destinazione di un With blocco contenente l'accesso ai membri.
ID errore: BC30157

Per correggere l'errore


1. Verificare che il With blocco sia formattato correttamente.
2. Se non è presente alcun With blocco, aggiungere un'espressione a sinistra della funzione di accesso che
restituisce un elemento definito contenente il membro.

Vedi anche
Caratteri speciali nel codice
Istruzione With...End With
BC30494: la riga è troppo lungo
05/03/2021 • 2 minutes to read • Edit Online

Le righe di testo di origine non possono superare i 65535 caratteri.


ID errore: BC30494

Per correggere l'errore


Ridurre la lunghezza della riga a 65535 caratteri o meno.

Vedi anche
Tipi di errore
BC30830: le istruzioni ' line ' non sono più
supportate
05/03/2021 • 2 minutes to read • Edit Online

Le istruzioni line non sono più supportate. La funzionalità di I/O di file è disponibile come
Microsoft.VisualBasic.FileSystem.LineInput e la funzionalità grafica è disponibile come
System.Drawing.Graphics.DrawLine .

ID errore: BC30830

Per correggere l'errore


Se si esegue l'accesso ai file, utilizzare Microsoft.VisualBasic.FileSystem.LineInput .
Per la grafica, usare System.Drawing.Graphics.Drawline .

Vedi anche
System.IO
System.Drawing
Accesso ai file con Visual Basic
BC36563: il metodo non dispone di una firma
compatibile con il delegato
05/03/2021 • 2 minutes to read • Edit Online

Esiste un'incompatibilità tra le firme del metodo e il delegato che si sta tentando di usare. L'istruzione Delegate
definisce i tipi di parametro e i tipi restituiti di una classe delegata. Per creare un'istanza di questo tipo di
delegato è possibile utilizzare qualsiasi routine con parametri corrispondenti di tipi compatibili e tipi restituiti.
ID errore: BC36563

Vedi anche
Operatore AddressOf
Istruzione Delegate
Risoluzione dell'overload
Generic Types in Visual Basic
BC32126: non è possibile usare i metodi di ' System.
Nullable (Of T)' come operandi dell'operatore '
AddressOf '
05/03/2021 • 2 minutes to read • Edit Online

Un'istruzione usa l' AddressOf operatore con un operando che rappresenta una routine della Nullable<T>
struttura.
ID errore: BC32126

Per correggere l'errore


Sostituire il nome della stored procedure nella AddressOf clausola con un operando che non è un
membro di Nullable<T> .
Scrivere una classe che esegue il wrapping del metodo di Nullable<T> che si desidera utilizzare.
Nell'esempio seguente, la NullableWrapper classe definisce un nuovo metodo denominato
GetValueOrDefault . Poiché questo nuovo metodo non è un membro di Nullable<T> , può essere
applicato a nullInstance , un'istanza di un tipo nullable, per formare un argomento per AddressOf .

Module Module1

Delegate Function Deleg() As Integer

Sub Main()
Dim nullInstance As New Nullable(Of Integer)(1)

Dim del As Deleg

' GetValueOrDefault is a method of the Nullable generic


' type. It cannot be used as an operand of AddressOf.
' del = AddressOf nullInstance.GetValueOrDefault

' The following line uses the GetValueOrDefault method


' defined in the NullableWrapper class.
del = AddressOf (New NullableWrapper(
Of Integer)(nullInstance)).GetValueOrDefault

Console.WriteLine(del.Invoke())
End Sub

Class NullableWrapper(Of T As Structure)


Private m_Value As Nullable(Of T)

Sub New(ByVal Value As Nullable(Of T))


m_Value = Value
End Sub

Public Function GetValueOrDefault() As T


Return m_Value.Value
End Function
End Class
End Module
Vedi anche
Nullable<T>
Operatore AddressOf
Tipi di valore Nullable
Generic Types in Visual Basic
BC30617: le istruzioni ' Module ' possono essere
eseguite solo a livello di file o di spazio dei nomi
05/03/2021 • 2 minutes to read • Edit Online

Module le istruzioni devono essere visualizzate nella parte superiore del file di origine immediatamente dopo
Option Imports le istruzioni and, gli attributi globali e le dichiarazioni dello spazio dei nomi, ma prima di tutte
le altre dichiarazioni.
ID errore: BC30617

Per correggere l'errore


Spostare l'istruzione Module all'inizio della dichiarazione dello spazio dei nomi o del file di origine.

Vedi anche
Istruzione Module
BC40031: il nome <membername> non è conforme
a CLS
05/03/2021 • 2 minutes to read • Edit Online

Un assembly è contrassegnato come <CLSCompliant(True)> ma espone un membro con un nome che inizia con
un carattere di sottolineatura ( _ ).
Un elemento di programmazione può contenere uno o più caratteri di sottolineatura, ma non deve iniziare con
un carattere di sottolineatura, ma deve essere conforme a CLS ( Language Independence and Language-
Independent Components ). Vedere Declared Element Names.
Quando CLSCompliantAttribute viene applicato a un elemento di programmazione, il parametro isCompliant
dell'attributo viene impostato su True o False per indicare la conformità o la non conformità. L'impostazione
predefinita per questo parametro non è disponibile, quindi è necessario specificare un valore.
Se a un elemento non viene applicato CLSCompliantAttribute , l'elemento non sarà considerato conforme.
Per impostazione predefinita, si tratta di un messaggio di avviso. Per informazioni su come nascondere gli avvisi
o considerarli come errori, vedere Configuring Warnings in Visual Basic.
ID errore: BC40031

Per correggere l'errore


Se si ha il controllo sul codice sorgente, modificare il nome del membro in modo che non inizi con un
carattere di sottolineatura.
Se è necessario che il nome del membro rimanga invariato, rimuovere CLSCompliantAttribute dalla
relativa definizione o contrassegnarlo come <CLSCompliant(False)> . È comunque possibile
contrassegnare l'assembly come <CLSCompliant(True)> .

Vedi anche
Declared Element Names
Convenzioni di denominazione di Visual Basic
BC30451: il nome ' <name> ' non è dichiarato
05/03/2021 • 3 minutes to read • Edit Online

Un'istruzione fa riferimento a un elemento di programmazione, ma il compilatore non trova un elemento con


quel nome esatto.
ID errore: BC30451

Per correggere l'errore


1. Controllare l'ortografia del nome nell'istruzione di riferimento. Visual Basic non fa distinzione tra
maiuscole e minuscole, ma qualsiasi altra variazione nell'ortografia viene considerata un nome
completamente diverso. Si noti che il carattere di sottolineatura ( _ ) fa parte del nome e quindi
dell'ortografia.
2. Verificare di disporre dell'operatore di accesso ai membri ( . ) tra un oggetto e il relativo membro. Ad
esempio, se è presente un controllo TextBox denominato TextBox1 , per accedere alla relativa proprietà
Text occorre digitare TextBox1.Text . Se invece si digita TextBox1Text , viene creato un nome diverso.
3. Se l'ortografia è corretta e la sintassi di qualsiasi accesso ai membri dell'oggetto è corretta, verificare che
l'elemento sia stato dichiarato. Per altre informazioni, vedere elementi dichiarati.
4. Se l'elemento di programmazione è stato dichiarato, verificare che sia nell'ambito. Se l'istruzione di
riferimento è esterna all'area che dichiara l'elemento di programmazione, potrebbe essere necessario
qualificare il nome dell'elemento. Per altre informazioni, vedere Scope in Visual Basic.
5. Se non si utilizza un tipo completo o un nome di membro (ad esempio, il codice fa riferimento a una
proprietà come MethodInfo.Name anziché System.Reflection.MethodInfo.Name ), aggiungere un' istruzione
Imports.
6. Se si sta tentando di compilare un progetto in stile SDK (un progetto con un * file con estensione vbproj
che inizia con la riga <Project Sdk="Microsoft.NET.Sdk"> ) e il messaggio di errore fa riferimento a un tipo
o a un membro nell'assembly Microsoft.VisualBasic.dll, configurare l'applicazione in modo che venga
compilata con un riferimento alla libreria di runtime Visual Basic. Per impostazione predefinita, un subset
della libreria è incorporato nell'assembly in un progetto di tipo SDK.
Ad esempio, l'esempio seguente non viene compilato perché
Microsoft.VisualBasic.CompilerServices.Conversions.ChangeType non è possibile trovare il metodo. Non
è incorporato nel subset del runtime Visual Basic incluso nell'applicazione.

Imports Microsoft.VisualBasic.CompilerServices

Public Module Example


Sub Main(args As String())
Dim originalValue As String = args(0)
Dim t As Type = GetType(Int32)
Dim i As Int32 = Conversions.ChangeType(originalValue, t)
Console.WriteLine($"'{originalValue}' --> {i}")
End Sub
End Module

Per risolvere questo errore, aggiungere l' <VBRuntime>Default</VBRuntime> elemento alla sezione Projects
<PropertyGroup> , come mostrato nel file di progetto Visual Basic seguente.
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<Reference Include="Microsoft.VisualBasic" />
</ItemGroup>
<PropertyGroup>
<VBRuntime>Default</VBRuntime>
<OutputType>Exe</OutputType>
<RootNamespace>vbruntime</RootNamespace>
<TargetFramework>net472</TargetFramework>
</PropertyGroup>

</Project>

Vedi anche
Riepilogo delle dichiarazioni e delle costanti
Convenzioni di denominazione di Visual Basic
Declared Element Names
References to Declared Elements
BC40039: <namespacename> il nome nello spazio
dei nomi radice <fullnamespacename> non è
conforme a CLS
05/03/2021 • 2 minutes to read • Edit Online

Un assembly è contrassegnato come <CLSCompliant(True)> , ma un elemento del nome dello spazio dei nomi
radice inizia con un carattere di sottolineatura ( _ ).
Un elemento di programmazione può contenere uno o più caratteri di sottolineatura, ma non deve iniziare con
un carattere di sottolineatura, ma deve essere conforme a CLS ( Language Independence and Language-
Independent Components ). Vedere Declared Element Names.
Quando CLSCompliantAttribute viene applicato a un elemento di programmazione, il parametro isCompliant
dell'attributo viene impostato su True o False per indicare la conformità o la non conformità. L'impostazione
predefinita per questo parametro non è disponibile, quindi è necessario specificare un valore.
Se a un elemento non viene applicato CLSCompliantAttribute , l'elemento non sarà considerato conforme.
Per impostazione predefinita, si tratta di un messaggio di avviso. Per informazioni su come nascondere gli avvisi
o considerarli come errori, vedere Configuring Warnings in Visual Basic.
ID errore: BC40039

Per correggere l'errore


Se è necessaria la conformità a CLS, modificare il nome dello spazio dei nomi radice in modo che
nessuno degli elementi inizi con un carattere di sottolineatura.
Se è necessario che il nome dello spazio dei nomi rimanga invariato, rimuovere CLSCompliantAttribute
dall'assembly o contrassegnarlo come <CLSCompliant(False)> .

Vedi anche
Istruzione Namespace
Spazi dei nomi in Visual Basic
-rootnamespace
Application Page, Project Designer (Visual Basic)
Declared Element Names
Convenzioni di denominazione di Visual Basic
BC40056: lo spazio dei nomi o il tipo specificato
nelle importazioni ' <qualifiedelementname> ' non
contiene alcun membro pubblico o non è stato
trovato
05/03/2021 • 2 minutes to read • Edit Online

Lo spazio dei nomi o il tipo specificato nelle importazioni ' <qualifiedelementname> ' non contiene alcun
membro pubblico o non è stato trovato. Verificare che lo spazio dei nomi o il tipo sia definito e contenga almeno
un membro pubblico. Verificare che il nome dell'alias non contenga altri alias.
Un' Imports istruzione specifica un elemento contenitore che non può essere trovato o non definisce Public
membri.
Un elemento contenitore può essere uno spazio dei nomi, una classe, una struttura, un modulo, un'interfaccia o
un'enumerazione. L'elemento contenitore contiene membri, ad esempio variabili, procedure o altri elementi
contenenti.
Lo scopo dell'importazione è consentire al codice di accedere ai membri dello spazio dei nomi o ai tipi senza
doverli qualificare. Il progetto potrebbe anche dover aggiungere un riferimento allo spazio dei nomi o al tipo.
Per ulteriori informazioni, vedere "importazione di elementi contenitore" in riferimenti a elementi dichiarati.
Se il compilatore non riesce a trovare l'elemento contenitore specificato, non può risolvere i riferimenti che lo
usano. Se trova l'elemento, ma l'elemento non espone Public membri, nessun riferimento può avere esito
positivo. In entrambi i casi non è significativo importare l'elemento.
Tenere presente che se si importa un elemento contenitore e si assegna un alias di importazione, non è possibile
usare tale alias di importazione per importare un altro elemento. Il codice seguente genera un errore del
compilatore.

Imports winfrm = System.Windows.Forms

' The following statement is INVALID because it reuses an import alias.

Imports behave = winfrm.Design.Behavior`

ID errore: BC40056

Per correggere l'errore


1. Verificare che l'elemento contenitore sia accessibile dal progetto.
2. Verificare che la specifica dell'elemento contenitore non includa alcun alias di importazione da un'altra
importazione.
3. Verificare che l'elemento contenitore esponga almeno un Public membro.

Vedi anche
Istruzione Imports (tipo e spazio dei nomi .NET)
Istruzione Namespace
Pubblica
Spazi dei nomi in Visual Basic
References to Declared Elements
BC40057: lo spazio dei nomi o il tipo specificato
nelle importazioni a livello di progetto '
<qualifiedelementname> ' non contiene alcun
membro pubblico o non è stato trovato
05/03/2021 • 2 minutes to read • Edit Online

Lo spazio dei nomi o il tipo specificato nelle importazioni a livello di progetto ' <qualifiedelementname> ' non
contiene alcun membro pubblico o non è stato trovato. Verificare che lo spazio dei nomi o il tipo sia definito e
contenga almeno un membro pubblico. Verificare che il nome dell'alias non contenga altri alias.
Una proprietà import di un progetto specifica un elemento contenitore che non può essere trovato o non
definisce Public membri.
Un elemento contenitore può essere uno spazio dei nomi, una classe, una struttura, un modulo, un'interfaccia o
un'enumerazione. L'elemento contenitore contiene membri, ad esempio variabili, procedure o altri elementi
contenenti.
Lo scopo dell'importazione è consentire al codice di accedere ai membri dello spazio dei nomi o ai tipi senza
doverli qualificare. Il progetto potrebbe anche dover aggiungere un riferimento allo spazio dei nomi o al tipo.
Per ulteriori informazioni, vedere "importazione di elementi contenitore" in riferimenti a elementi dichiarati.
Se il compilatore non riesce a trovare l'elemento contenitore specificato, non può risolvere i riferimenti che lo
usano. Se trova l'elemento, ma l'elemento non espone Public membri, nessun riferimento può avere esito
positivo. In entrambi i casi non è significativo importare l'elemento.
Per specificare gli elementi da importare, è possibile utilizzare Progettazione progetti . Utilizzare la sezione
spazi dei nomi impor tati della pagina riferimenti . È possibile ottenere la creazione di progetti facendo
doppio clic sull'icona del progetto in Esplora soluzioni .
ID errore: BC40057

Per correggere l'errore


1. Aprire Progettazione progetti e passare alla pagina di riferimento .
2. Nella sezione spazi dei nomi impor tati verificare che l'elemento contenitore sia accessibile dal
progetto.
3. Verificare che l'elemento contenitore esponga almeno un Public membro.

Vedi anche
Riferimenti (pagina), Creazione progetti (Visual Basic)
Gestione delle proprietà di progetti e soluzioni
Pubblica
Spazi dei nomi in Visual Basic
References to Declared Elements
Necessario indice della matrice di proprietà
05/03/2021 • 2 minutes to read • Edit Online

Questo valore della proprietà è costituito da una matrice, non da un unico valore. Non è stato specificato alcun
indice per la matrice di proprietà a cui si sta tentando di accedere.

Per correggere l'errore


Consultare la documentazione relativa al componente per individuare l'intervallo di indici appropriato per la
matrice. Specificare un indice appropriato nell'istruzione di accesso alla proprietà.

Vedi anche
Tipi di errore
Opzioni per commenti e suggerimenti in Visual Studio
BC36532: la funzione annidata non ha una firma
compatibile con il delegato ' <delegatename> '
05/03/2021 • 2 minutes to read • Edit Online

Un'espressione lambda è stata assegnata a un delegato con una firma incompatibile. Nel codice seguente, ad
esempio, il delegato Del ha due parametri Integer.

Delegate Function Del(ByVal p As Integer, ByVal q As Integer) As Integer

L'errore viene generato se un'espressione lambda con un argomento viene dichiarata come tipo Del :

' Neither of these is valid.


' Dim lambda1 As Del = Function(n As Integer) n + 1
' Dim lambda2 As Del = Function(n) n + 1

ID errore: BC36532

Per correggere l'errore


Modificare la definizione del delegato o l'espressione lambda assegnata in modo che le firme siano compatibili.

Vedi anche
Conversione di tipo relaxed del delegato
Espressioni lambda
BC30737: non è stato trovato alcun metodo ' Main '
accessibile con una firma appropriata in ' <name> '
05/03/2021 • 2 minutes to read • Edit Online

Per le applicazioni da riga di comando deve essere Sub Main definito. Main deve essere dichiarato come
Public Shared se fosse definito in una classe o come se fosse Public definito in un modulo.

ID errore: BC30737

Per correggere l'errore


Definire una Public Sub Main procedura per il progetto. Dichiararla come Shared se fosse e solo se viene
definita all'interno di una classe.

Vedi anche
Struttura di un programma Visual Basic
Procedure
BC40033: non conforme <membername> a CLS
non consentito in un'interfaccia conforme a CLS
05/03/2021 • 2 minutes to read • Edit Online

Una proprietà, una routine o un evento in un'interfaccia è contrassegnato come <CLSCompliant(True)> quando
l'interfaccia stessa è contrassegnata come <CLSCompliant(False)> o non è contrassegnata.
Affinché un'interfaccia sia conforme al linguaggio di indipendenza e Language-Independent componenti (CLS),
tutti i relativi membri devono essere conformi.
Quando CLSCompliantAttribute viene applicato a un elemento di programmazione, il parametro isCompliant
dell'attributo viene impostato su True o False per indicare la conformità o la non conformità. L'impostazione
predefinita per questo parametro non è disponibile, quindi è necessario specificare un valore.
Se a un elemento non viene applicato CLSCompliantAttribute , l'elemento non sarà considerato conforme.
Per impostazione predefinita, si tratta di un messaggio di avviso. Per informazioni su come nascondere gli avvisi
o considerarli come errori, vedere Configuring Warnings in Visual Basic.
ID errore: BC40033

Per correggere l'errore


Se è necessaria la conformità a CLS e si ha il controllo sul codice sorgente dell'interfaccia, contrassegnare
l'interfaccia come <CLSCompliant(True)> se tutti i relativi membri fossero conformi.
Se è necessaria la conformità a CLS e non si ha il controllo sul codice sorgente dell'interfaccia o se non si
è idonei per essere conforme, definire questo membro all'interno di un'interfaccia diversa.
Se è necessario che il membro rimanga all'interno dell'interfaccia corrente, rimuovere
CLSCompliantAttribute dalla relativa definizione o contrassegnarlo come <CLSCompliant(False)> .

Vedi anche
Istruzione Interface
BC36629: l'inferenza del tipo nullable non è
supportata in questo contesto
05/03/2021 • 2 minutes to read • Edit Online

I tipi di valore e le strutture possono essere dichiarati nullable.

Dim a? As Integer
Dim b As Integer?

Tuttavia, non è possibile usare la dichiarazione nullable in combinazione con l'inferenza del tipo. Nell'esempio
seguente viene generato questo errore.

' Not valid.


' Dim c? = 10
' Dim d? = a

ID errore: BC36629

Per correggere l'errore


Usare una As clausola per dichiarare la variabile come tipo di valore Nullable.

Vedi anche
Tipi di valore Nullable
Inferenza del tipo di variabile locale
BC30106: il numero di indici supera il numero di
dimensioni della matrice indicizzata
05/03/2021 • 2 minutes to read • Edit Online

Il numero di indici usati per accedere a un elemento di matrice deve essere esattamente uguale all'ordine di
priorità della matrice, vale a dire al numero di dimensioni dichiarate per la matrice.
ID errore: BC30106

Per correggere l'errore


Rimuovere gli indici dal riferimento alla matrice fino a quando il numero totale di pedici è uguale al
numero di dimensioni della matrice. Ad esempio:

Dim gameBoard(3, 3) As String

' Incorrect code. The array has two dimensions.


gameBoard(1, 1, 1) = "X"
gameBoard(2, 1, 1) = "O"

' Correct code.


gameBoard(0, 0) = "X"
gameBoard(1, 0) = "O"

Vedere anche
Matrici
L'oggetto o la classe non supporta il set di eventi
05/03/2021 • 2 minutes to read • Edit Online

Si è provato a usare una WithEvents variabile con un componente che non può funzionare come origine evento
per il set di eventi specificato. Si desidera, ad esempio, affondare gli eventi di un oggetto, quindi creare un altro
oggetto che Implements il primo oggetto. Sebbene si possa pensare che è possibile affondare gli eventi
dall'oggetto implementato, questo non è sempre il caso. Implements implementa solo un'interfaccia per metodi
e proprietà. WithEvents non è supportato per private UserControls , perché le informazioni sul tipo necessarie
per generare l'oggetto ObjectEvent non sono disponibili in fase di esecuzione.

Per correggere l'errore


Non è possibile eseguire il sink di eventi per un componente che non è un evento di origine.

Vedi anche
WithEvents
Istruzione Implements
Oggetto necessario (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

I riferimenti a proprietà e metodi richiedono spesso un qualificatore di oggetto esplicito. Questo è un caso di
questo tipo.

Per correggere l'errore


1. Verificare che i riferimenti a una proprietà o a un metodo dell'oggetto dispongano del qualificatore di
oggetto valido. Specificare un qualificatore di oggetto se non ne è stato fornito uno.
2. Controllare l'ortografia del qualificatore dell'oggetto e verificare che l'oggetto sia visibile nella parte del
programma in cui viene fatto riferimento.
3. Se viene fornito un percorso al comando di aper tura file di un'applicazione host, verificare che gli
argomenti siano corretti.
4. Controllare la documentazione dell'oggetto e verificare che l'azione sia valida.

Vedi anche
Tipi di errore
Variabile oggetto o variabile del blocco With non
impostata
05/03/2021 • 4 minutes to read • Edit Online

Viene fatto riferimento a una variabile oggetto non valida. L'errore può essere determinato da numerose cause:
Una variabile è stata dichiarata senza specificare un tipo. Se una variabile viene dichiarata senza
specificare un tipo, il valore predefinito è Type Object .
Ad esempio, una variabile dichiarata con Dim x sarebbe di tipo Object; una variabile dichiarata con
Dim x As String sarebbe di tipo String .

TIP
L' Option Strict istruzione impedisce la tipizzazione implicita che restituisce un Object tipo. Se si omette il
tipo, si verificherà un errore in fase di compilazione. Vedere istruzione Option Strict.

Si sta provando a fare riferimento a un oggetto che è stato impostato su Nothing .


Si sta tentando di accedere a un elemento di una variabile di matrice non dichiarata correttamente.
Ad esempio, una matrice dichiarata come products() As String attiverà l'errore se si tenta di fare
riferimento a un elemento della matrice products(3) = "Widget" . La matrice non ha elementi e viene
considerata come un oggetto.
Si sta tentando di accedere al codice all'interno di un With...End With blocco prima che il blocco sia stato
inizializzato. Un With...End With blocco deve essere inizializzato tramite l'esecuzione del With punto di
ingresso dell'istruzione.

NOTE
Nelle versioni precedenti di Visual Basic o VBA, questo errore è stato attivato anche assegnando un valore a una variabile
senza usare la Set parola chiave ( x = "name" anziché Set x = "name" ). La Set parola chiave non è più valida in
Visual Basic .NET.

Per correggere l'errore


1. Impostare Option Strict su aggiungendo On il codice seguente all'inizio del file:

Option Strict On

Quando si esegue il progetto, nel Elenco errori viene visualizzato un errore del compilatore per
qualsiasi variabile specificata senza un tipo.
2. Se non si vuole abilitare Option Strict , cercare nel codice qualsiasi variabile specificata senza un tipo (
Dim x anziché Dim x As String ) e aggiungere il tipo desiderato alla dichiarazione.

3. Assicurarsi che non si faccia riferimento a una variabile oggetto che è stata impostata su Nothing .
Cercare il codice per la parola chiave Nothing e modificare il codice in modo che l'oggetto non sia
impostato su fino a quando non viene Nothing fatto riferimento a esso.
4. Verificare che le variabili di matrice siano dimensionate prima di accedervi. È possibile assegnare una
dimensione alla prima creazione della matrice ( Dim x(5) As String anziché Dim x() As String ) oppure
utilizzare la ReDim parola chiave per impostare le dimensioni della matrice prima di accedervi per la
prima volta.
5. Verificare che il With blocco venga inizializzato eseguendo il With punto di ingresso dell'istruzione.

Vedi anche
Dichiarazione di variabili oggetto
Istruzione ReDim
Istruzione With...End With
BC33000: la dichiarazione dell'operatore deve
essere una delle seguenti: +,-, *, , /, ^, & , like, mod,
and, or, XOR, not, <<, >>...
05/03/2021 • 2 minutes to read • Edit Online

È possibile dichiarare solo un operatore idoneo per l'overload. Nella tabella seguente sono elencati gli operatori
che è possibile dichiarare.

T IP O O P ERATO RI

Unaria + , - , IsFalse , IsTrue , Not

Binary + , - , * , / , \ , & , ^ , >> , << , = , <> , > , >= ,


< , <= , And , Like , Mod , Or , Xor

Conversione (unario) CType

Si noti che l'operatore = nell'elenco binario è l'operatore di confronto, non l'operatore di assegnazione.
ID errore: BC33000

Per correggere l'errore


Selezionare un operatore dal set di operatori che supportano l'overload.
Se è necessario eseguire l'overload di un operatore che non può essere sottoposto a overload
direttamente, creare una routine Function che accetti i parametri appropriati e restituisca il valore
appropriato.

Vedi anche
Operator Statement
Routine di operatore
Procedura: definire un operatore
Procedura: Definire un operatore di conversione
Istruzione Function
BC30202: previsto ' optional '
05/03/2021 • 2 minutes to read • Edit Online

Un argomento facoltativo in una dichiarazione di routine è seguito da un argomento obbligatorio. Ogni


argomento che segue un argomento facoltativo deve anche essere facoltativo.
ID errore: BC30202

Per correggere l'errore


Se l'argomento deve essere necessario, spostarlo in modo che preceda il primo argomento facoltativo
nell'elenco di argomenti.
Se l'argomento è destinato a essere facoltativo, usare la Optional parola chiave.

Vedi anche
Parametri facoltativi
BC30812: i parametri facoltativi devono specificare
un valore predefinito
05/03/2021 • 2 minutes to read • Edit Online

I parametri facoltativi devono fornire valori predefiniti che possono essere usati se non viene fornito alcun
parametro da una routine chiamante.
ID errore: BC30812

Esempio
L'esempio seguente genera l'BC30812:

Sub Proc1(x As Integer, Optional y As String)


Console.WriteLine("Default argument is: " & y)
End Sub

Per correggere l'errore


Specificare i valori predefiniti per i parametri facoltativi:

Sub Proc1(x As Integer, Optional y As String = "Default Value")


Console.WriteLine("Default argument is: " & y)
End Sub

Vedi anche
Facoltativo
Ordinale non valido
05/03/2021 • 2 minutes to read • Edit Online

La chiamata a una libreria a collegamento dinamico (DLL) indica di usare un numero anziché un nome di
routine, usando la #num sintassi. Questo errore presenta le possibili cause seguenti:
Tentativo di conversione dell' #num espressione in un ordinale non riuscito.
Il #num parametro specificato non specifica alcuna funzione nella dll.
Una libreria dei tipi ha una dichiarazione non valida che comporta l'uso interno di un numero ordinale
non valido.

Per correggere l'errore


1. Verificare che l'espressione rappresenti un numero valido o chiamare la procedura in base al nome.
2. Assicurarsi che #num identifichi una funzione valida nella dll.
3. Isolare la chiamata di procedura che causa il problema impostando come commento il codice. Scrivere
un' Declare istruzione per la procedura e segnalare il problema al fornitore della libreria dei tipi.

Vedi anche
Declare Statement
BC2004: memoria insufficiente
05/03/2021 • 2 minutes to read • Edit Online

È necessaria una maggiore quantità di memoria rispetto a quella disponibile.


ID errore: BC2004

Per correggere l'errore


Chiudere le applicazioni, i documenti e i file di origine non necessari.
Eliminare i controlli e i form non necessari, in modo che vengano caricati un minor numero di volte
Ridurre il numero di Public variabili.
Controllare lo spazio disponibile su disco.
Aumentare la RAM disponibile installando memoria aggiuntiva o riallocando memoria.
Assicurarsi che la memoria venga liberata quando non è più necessaria.

Vedi anche
Tipi di errore
Spazio dello stack insufficiente (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Lo stack è un'area di lavoro di memoria che aumenta e compatta dinamicamente con le esigenze del
programma in esecuzione. Sono stati superati i limiti.

Per correggere l'errore


1. Verificare che le procedure non siano annidate troppo profondamente.
2. Verificare che le procedure ricorsive vengano terminate correttamente.
3. Se le variabili locali richiedono più spazio variabile locale rispetto a quanto disponibile, provare a
dichiarare alcune variabili a livello di modulo. È anche possibile dichiarare tutte le variabili nella
procedura statica facendo precedere Property la Sub Function parola chiave, o con Static . In
alternativa, è possibile usare l' Static istruzione per dichiarare singole variabili statiche all'interno delle
procedure.
4. Ridefinire alcune stringhe a lunghezza fissa come stringhe a lunghezza variabile, poiché le stringhe a
lunghezza fissa utilizzano più spazio dello stack rispetto alle stringhe a lunghezza variabile. È anche
possibile definire la stringa a livello di modulo, in cui non è necessario spazio dello stack.
5. Controllare il numero di chiamate di funzione annidate DoEvents , utilizzando la finestra Calls di
dialogo per visualizzare le procedure attive nello stack.
6. Assicurarsi che non sia stato causato un evento "Cascade" tramite l'attivazione di un evento che chiama
una routine di evento già presente nello stack. Un evento Cascade è simile a una chiamata di routine
ricorsiva senza terminazione, ma è meno ovvio, perché la chiamata viene eseguita da Visual Basic anziché
da una chiamata esplicita nel codice. Utilizzare la finestra Calls di dialogo per visualizzare le procedure
attive nello stack.

Vedi anche
Finestra Memoria
Spazio di stringa insufficiente (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Con Visual Basic, è possibile usare stringhe di grandi dimensioni. Tuttavia, i requisiti di altri programmi e il modo
in cui si lavora con le stringhe possono comunque causare questo errore.

Per correggere l'errore


1. Assicurarsi che un'espressione che richiede la creazione di stringhe temporanee durante la valutazione
non causi l'errore.
2. Rimuovere tutte le applicazioni non necessarie dalla memoria per creare altro spazio.

Vedi anche
Tipi di errore
Riepilogo della modifica delle stringhe
BC30036: overflow (errore Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Un valore letterale rappresenta un valore che non rientra nei limiti del tipo di dati a cui viene assegnato.
ID errore: BC30036

Per correggere l'errore


Consultare l'intervallo di valori per il tipo di dati di destinazione e riscrivere il valore letterale per conformarsi
a tale intervallo.

Vedi anche
Tipi di dati
Overflow (errore di run-time Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Un overflow viene restituito quando si tenta un'assegnazione che supera i limiti della destinazione
dell'assegnazione.

Per correggere l'errore


1. Verificare che i risultati di assegnazioni, calcoli e conversioni di tipi di dati non siano troppo grandi per
essere rappresentati nell'intervallo di variabili consentito per quel tipo di valore, quindi assegnare il
valore a una variabile di un tipo che può contenere un intervallo di valori più grande, se necessario.
2. Assicurarsi che le assegnazioni alle proprietà corrispondano all'intervallo della proprietà in cui vengono
eseguite.
3. Verificare che i numeri utilizzati nei calcoli assegnati a valori integer non contengano risultati maggiori di
quelli di tipo Integer.

Vedi anche
Int32.MaxValue
Double.MaxValue
Tipi di dati
Tipi di errore
Impossibile trovare il percorso
05/03/2021 • 2 minutes to read • Edit Online

Durante un'operazione di accesso ai file o di accesso al disco, il sistema operativo non è stato in grado di trovare
il percorso specificato. Il percorso di un file include la specifica dell'unità più le directory e le sottodirectory che
devono essere attraversate per individuare il file. Il percorso può essere relativo o assoluto.

Per correggere l'errore


Verificare e Rispecificare il percorso.

Vedi anche
Tipi di errore
Errore di accesso al percorso/file
05/03/2021 • 2 minutes to read • Edit Online

Durante un'operazione di accesso ai file o di accesso al disco, il sistema operativo non è in grado di effettuare
una connessione tra il percorso e il nome del file.

Per correggere l'errore


1. Verificare che la specifica del file sia formattata correttamente. Un nome file può contenere un percorso
completo (assoluto) o relativo. Un percorso completo inizia con il nome dell'unità (se il percorso si trova
in un'altra unità) ed elenca il percorso esplicito dalla radice al file. Qualsiasi percorso non completo è
relativo all'unità e alla directory correnti.
2. Assicurarsi di non aver tentato di salvare un file che sostituirebbe un file di sola lettura esistente. In tal
caso, modificare l'attributo di sola lettura del file di destinazione oppure salvare il file con un nome di file
diverso.
3. Assicurarsi che non si sia tentato di aprire un file di sola lettura in modalità sequenziale Output o Append
. In tal caso, aprire il file in Input modalità o modificare l'attributo di sola lettura del file.
4. Assicurarsi che non sia stato effettuato un tentativo di modifica di un progetto di Visual Basic all'interno
di un database o di un documento.

Vedi anche
Tipi di errore
Autorizzazione negata (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

È stato effettuato un tentativo di scrittura in un disco protetto da scrittura o di accesso a un file bloccato.

Per correggere l'errore


1. Per aprire un file protetto da scrittura, modificare l'attributo di protezione da scrittura del file.
2. Verificare che il file non sia bloccato da un altro processo e attendere che venga aperto il file fino a
quando non viene rilasciato da un altro processo.
3. Per accedere al registro di sistema, verificare che le autorizzazioni utente includano questo tipo di accesso
al registro di sistema.

Vedi anche
Tipi di errore
Chiamata di routine o argomento non valido (Visual
Basic)
05/03/2021 • 2 minutes to read • Edit Online

Non è possibile completare parte della chiamata.

Per correggere l'errore


Controllare gli intervalli consentiti per gli argomenti per assicurarsi che nessuna disposizione superi i valori
consentiti.

Vedi anche
Tipi di errore
BC42107: la proprietà' <propertyname> ' non
restituisce un valore in tutti i percorsi del codice
05/03/2021 • 2 minutes to read • Edit Online

La proprietà' <propertyname> ' non restituisce un valore per tutti i percorsi del codice. In fase di esecuzione,
quando viene usato il risultato, potrebbe verificarsi un'eccezione dovuta a un riferimento Null.
Una routine di proprietà Get ha almeno un possibile percorso nel codice che non restituisce un valore.
È possibile restituire un valore da una routine di proprietà Get in uno dei modi seguenti:
Assegnare il valore al nome della proprietà, quindi eseguire un' Exit Property istruzione.
Assegnare il valore al nome della proprietà, quindi eseguire l' End Get istruzione.
Includere il valore in un' istruzione return.
Se il controllo passa a Exit Property o End Get e non è stato assegnato alcun valore al nome della proprietà, la
Get stored procedure restituisce il valore predefinito del tipo di dati della proprietà. Per ulteriori informazioni,
vedere "Behavior" nell' istruzione Function.
Per impostazione predefinita, si tratta di un messaggio di avviso. Per altre informazioni su come nascondere gli
avvisi o considerarli come errori, vedere Configuring Warnings in Visual Basic.
ID errore: BC42107

Per correggere l'errore


Controllare la logica del flusso di controllo e assicurarsi di assegnare un valore prima di ogni istruzione
che causa la restituzione.
È più facile garantire che ogni ritorno dalla procedura restituisca un valore se si usa sempre l' Return
istruzione. In tal caso, l'ultima istruzione prima End Get deve essere un' Return istruzione.

Vedi anche
Routine Property
Property Statement
Istruzione Get
Indice della matrice di proprietà non valido
05/03/2021 • 2 minutes to read • Edit Online

Il valore fornito non è valido per l'indice di una matrice di proprietà.

Per correggere l'errore


Controllare la documentazione del componente per assicurarsi che l'indice sia compreso nell'intervallo
valido per la proprietà specificata.

Vedi anche
Matrici
La routine Property Let non è stata definita e la
routine Property Get non ha restituito un oggetto
05/03/2021 • 2 minutes to read • Edit Online

Alcune proprietà, metodi e operazioni possono essere applicati solo agli Collection oggetti. È stata specificata
un'operazione o una proprietà che è esclusiva per le raccolte, ma l'oggetto non è una raccolta.

Per correggere l'errore


1. Controllare l'ortografia del nome dell'oggetto o della proprietà oppure verificare che l'oggetto sia un
Collection oggetto.

2. Esaminare il Add metodo usato per aggiungere l'oggetto alla raccolta per assicurarsi che la sintassi sia
corretta e che gli identificatori siano stati digitati correttamente.

Vedere anche
Collection
Proprietà non trovata
05/03/2021 • 2 minutes to read • Edit Online

Questo oggetto non supporta la proprietà specificata.

Per correggere l'errore


1. Controllare l'ortografia del nome della proprietà.
2. Controllare la documentazione dell'oggetto per assicurarsi che non si stia tentando di accedere ad
elementi come una proprietà "Text" quando l'oggetto supporta effettivamente una "didascalia" o una
proprietà con nome simile.

Vedi anche
Tipi di errore
Proprietà o metodo non trovato
05/03/2021 • 2 minutes to read • Edit Online

Il metodo o la proprietà dell'oggetto a cui si fa riferimento non è definita.

Per correggere l'errore


È possibile che sia stato digitato in errore il nome dell'oggetto. Per visualizzare le proprietà e i metodi definiti
per un oggetto, visualizzare il Visualizzatore oggetti. Selezionare la libreria di oggetti appropriata per
visualizzare un elenco di proprietà e metodi disponibili.

Vedi anche
Tipi di errore
BC36633: la variabile <variable> di intervallo
nasconde una variabile in un blocco di inclusione,
una variabile di intervallo definita in precedenza o
una variabile dichiarata in modo implicito in
un'espressione di query
05/03/2021 • 2 minutes to read • Edit Online

Un nome di variabile di intervallo specificato in una Select From clausola,, Aggregate o Let Duplica il nome
di una variabile di intervallo già specificata in precedenza nella query o il nome di una variabile dichiarata in
modo implicito dalla query, ad esempio un nome di campo o il nome di una funzione di aggregazione.
ID errore: BC36633

Per correggere l'errore


Verificare che tutte le variabili di intervallo in un determinato ambito di query abbiano nomi univoci. È
possibile racchiudere una query tra parentesi per garantire che le query annidate abbiano un ambito
univoco.

Vedi anche
Introduzione a LINQ in Visual Basic
Clausola from
Clausola Let
Aggregate Clause
Clausola SELECT
BC36599: il nome della variabile di intervallo può
essere dedotto solo da un nome semplice o
completo senza argomenti
05/03/2021 • 2 minutes to read • Edit Online

Un elemento di programmazione che accetta uno o più argomenti è incluso in una query LINQ. Il compilatore
non è in grado di dedurre una variabile di intervallo da tale elemento di programmazione.
ID errore: BC36599

Per correggere l'errore


Specificare un nome di variabile esplicito per l'elemento di programmazione, come illustrato nel codice
seguente:

Dim query = From var1 In collection1


Select VariableAlias= SampleFunction(var1), var1

Vedi anche
Introduzione a LINQ in Visual Basic
Clausola SELECT
BC30969: è necessario un riferimento all'assembly '
<assemblyidentity> ' contenente <typename> il
tipo '', ma non è stato possibile trovare un
riferimento appropriato a causa dell'ambiguità tra i
progetti ' <projectname1> ' è <projectname2> '
05/03/2021 • 2 minutes to read • Edit Online

In un'espressione viene usato un tipo, ad esempio una classe, una struttura, un'interfaccia, un'enumerazione o
un delegato, definito all'esterno del progetto. Tuttavia, sono presenti riferimenti di progetto a più assembly che
definiscono quel tipo.
I progetti citati generano assembly con lo stesso nome. Pertanto, il compilatore non può determinare l'assembly
da usare per il tipo a cui si accede.
Per accedere a un tipo definito in un altro assembly, il compilatore Visual Basic deve avere un riferimento a tale
assembly. Deve trattarsi di un riferimento unico, non ambiguo, che non generi riferimenti circolari tra i progetti.
ID errore: BC30969

Per correggere l'errore


1. Determinare quale progetto produce l'assembly migliore per il progetto a cui fare riferimento. Per questa
decisione si potrebbero usare criteri quali la facilità di accesso al file e la frequenza di aggiornamenti.
2. Nelle proprietà del progetto aggiungere un riferimento al file contenente l'assembly che definisce il tipo
in uso.

Vedi anche
Gestione dei riferimenti in un progetto
References to Declared Elements
Gestione delle proprietà di progetti e soluzioni
Risoluzione dei problemi relativi ai riferimenti interrotti
BC30007: è necessario un riferimento all'assembly '
<assemblyname> ' contenente la classe base '
<classname> '
05/03/2021 • 2 minutes to read • Edit Online

È necessario il riferimento all'assembly ' <assemblyname> ' contenente la classe base ' <classname> '.
Aggiungerne uno al progetto.
La classe è definita in una libreria a collegamento dinamico (DLL) o in un assembly a cui non si fa direttamente
riferimento nel progetto. Il compilatore Visual Basic richiede un riferimento per evitare ambiguità nel caso in cui
la classe sia definita in più di una DLL o di un assembly.
ID errore: BC30007

Per correggere l'errore


Includere il nome della DLL o dell'assembly senza riferimento nei riferimenti del progetto.

Vedi anche
Gestione dei riferimenti in un progetto
Risoluzione dei problemi relativi ai riferimenti interrotti
BC35000: l'operazione richiesta non è disponibile
perché la funzione '' della libreria di runtime
<function> non è definita.
05/03/2021 • 2 minutes to read • Edit Online

Visual Basic sta tentando di effettuare una chiamata interna a una funzione nel runtime di Visual Basic
(Microsoft.VisualBasic.dll) non trovato.
ID errore: BC35000
Questo errore si verifica nei progetti di tipo SDK (progetti con un file con * estensione vbproj che inizia con la
riga <Project Sdk="Microsoft.NET.Sdk"> ). Per impostazione predefinita, solo un subset dell'assembly
Microsoft.VisualBasic.dll viene incorporato nell'assembly dell'applicazione e <function> non è incluso nel
subset.

Per correggere l'errore


Anziché incorporare un subset del runtime Visual Basic nell'assembly, è necessario compilarlo con un
riferimento. A tale scopo, aggiungere l'elemento seguente alla <PropertyGroup> sezione del file con * estensione
vbproj :

<VBRuntime>Default</VBRuntime>

Vedi anche
-vbruntime ( opzione del compilatore)
Resume senza errore
05/03/2021 • 2 minutes to read • Edit Online

Un'istruzione è stata rilevata al di Resume fuori del codice di gestione degli errori oppure il codice ha saltato un
gestore errori anche se non si è verificato alcun errore.

Per correggere l'errore


1. Spostare l' Resume istruzione in un gestore errori o eliminarla.
2. I salti alle etichette non possono essere eseguiti nelle procedure, quindi eseguire una ricerca nella routine
per l'etichetta che identifica il gestore errori. Se si trova un'etichetta duplicata specificata come
destinazione di un' GoTo istruzione che non è un' On Error GoTo istruzione, modificare l'etichetta della
riga in modo che corrisponda alla destinazione prevista.

Vedi anche
Istruzione Resume
Istruzione On Error
BC40027: il tipo restituito della funzione '
<procedurename> ' non è conforme a CLS
05/03/2021 • 3 minutes to read • Edit Online

Una Function routine è contrassegnata come <CLSCompliant(True)> , ma restituisce un tipo contrassegnato


come <CLSCompliant(False)> , non contrassegnato o non qualificato perché è un tipo non conforme.
Affinché una procedura risulti compatibile con l'indipendenza del linguaggio e i componenti indipendenti dal
linguaggio (CLS), deve usare solo tipi conformi a CLS. Questo scenario si applica ai tipi dei parametri, al tipo
restituito e ai tipi di tutte le variabili locali.
I tipi di dati Visual Basic seguenti non sono conformi a CLS:
Tipo di dati SByte
Tipo di dati UInteger
Tipo di dati ULong
Tipo di dati UShort
Quando CLSCompliantAttribute viene applicato a un elemento di programmazione, il parametro isCompliant
dell'attributo viene impostato su True o False per indicare la conformità o la non conformità. L'impostazione
predefinita per questo parametro non è disponibile, quindi è necessario specificare un valore.
Se a un elemento non viene applicato CLSCompliantAttribute , l'elemento non sarà considerato conforme.
Per impostazione predefinita, si tratta di un messaggio di avviso. Per informazioni su come nascondere gli avvisi
o considerarli come errori, vedere Configuring Warnings in Visual Basic.
ID errore: BC40027

Per correggere l'errore


Se la Function routine deve restituire questo particolare tipo, rimuovere CLSCompliantAttribute . La
procedura non può essere compatibile con CLS.
Se la Function routine deve essere conforme a CLS, impostare il tipo restituito sul tipo conforme a CLS
più vicino. Al posto di UInteger ad esempio può essere possibile usare Integer se non è necessario
l'intervallo di valore al di sopra di 2.147.483.647. Se è necessario l'intervallo esteso, è possibile sostituire
UInteger con Long .

Se si interagisce con gli oggetti COM o di automazione, tenere presente che alcuni tipi hanno larghezze di
dati diverse rispetto all'.NET Framework. Ad esempio, int è spesso a 16 bit in altri ambienti. Se si sta
restituendo un intero a 16 bit a tale componente, dichiararlo come Short anziché Integer nel codice
Visual Basic gestito.
BC31102: la funzione di accesso ' set ' della
proprietà' <propertyname> ' non è accessibile
05/03/2021 • 2 minutes to read • Edit Online

Un'istruzione tenta di archiviare il valore di una proprietà quando non ha accesso alla routine della proprietà
Set .

Se l' istruzione set è contrassegnata con un livello di accesso più restrittivo rispetto alla relativa istruzione
Property, un tentativo di impostare il valore della proprietà potrebbe non riuscire nei casi seguenti:
L' Set istruzione è contrassegnata come privata e il codice chiamante è all'esterno della classe o della
struttura in cui è definita la proprietà.
L' Set istruzione è contrassegnata come protetta e il codice chiamante non si trova nella classe o nella
struttura in cui è definita la proprietà, né in una classe derivata.
L' Set istruzione è contrassegnata come Friend e il codice chiamante non si trova nello stesso assembly
in cui è definita la proprietà.
ID errore: BC31102

Per correggere l'errore


Se si ha il controllo del codice sorgente che definisce la proprietà, provare a dichiarare la Set routine con
lo stesso livello di accesso della proprietà stessa.
Se non si ha il controllo del codice sorgente che definisce la proprietà o se è necessario limitare il Set
livello di accesso della routine più della proprietà stessa, provare a spostare l'istruzione che imposta il
valore della proprietà su un'area di codice che dispone di un accesso migliore alla proprietà.

Vedi anche
Routine Property
Procedura: dichiarare una proprietà con livelli di accesso misti
Impossibile eliminare alcune sottochiavi
05/03/2021 • 2 minutes to read • Edit Online

È stato effettuato un tentativo di eliminare una chiave del registro di sistema, ma l'operazione non è riuscita
perché alcune sottochiavi non possono essere eliminate. Questo è in genere dovuto alla mancanza di
autorizzazioni.

Per correggere l'errore


Assicurarsi di disporre di autorizzazioni sufficienti per eliminare le sottochiavi specificate.

Vedere anche
Microsoft.VisualBasic.MyServices.RegistryProxy
DeleteSubKey
RegistryPermission
BC32005: l'istruzione non può terminare un blocco
all'esterno di un'istruzione ' If ' della riga
05/03/2021 • 2 minutes to read • Edit Online

Un'istruzione a riga singola If contiene diverse istruzioni separate da due punti (:), una delle quali è un' End
istruzione per un blocco di controllo all'esterno della riga singola If . Per le istruzioni a riga singola If non
viene utilizzata l' End If istruzione.
ID errore: BC32005

Per correggere l'errore


Spostare l'istruzione a riga singola If all'esterno del blocco di controllo che contiene l' End If istruzione.

Vedi anche
Istruzione If...Then...Else
BC30001: istruzione non valida in uno spazio dei
nomi
05/03/2021 • 2 minutes to read • Edit Online

L'istruzione non può comparire al livello di uno spazio dei nomi. Le uniche dichiarazioni consentite a livello di
spazio dei nomi sono le dichiarazioni di moduli, interfacce, classi, delegati, enumerazioni e strutture.
ID errore: BC30001

Per correggere l'errore


Spostare l'istruzione in una posizione all'interno di un modulo, una classe, un'interfaccia, una struttura,
un'enumerazione o una definizione di delegato.

Vedi anche
Ambito in Visual Basic
Spazi dei nomi in Visual Basic
BC30024: istruzione non valida all'interno di un
metodo/espressione lambda su più righe
05/03/2021 • 2 minutes to read • Edit Online

L'istruzione non è valida all'interno di una Sub Function Get routine Property,, o Set . È possibile inserire
alcune istruzioni a livello di modulo o di classe. Altri, ad esempio Option Strict , devono essere a livello di
spazio dei nomi e precedere tutte le altre dichiarazioni.
ID errore: BC30024

Per correggere l'errore


Rimuovere l'istruzione dalla procedura.

Vedi anche
Istruzione Sub
Istruzione Function
Istruzione Get
Istruzione set
BC30648: le costanti stringa devono terminare con
virgolette doppie
05/03/2021 • 2 minutes to read • Edit Online

Le costanti di stringa devono iniziare e terminare con virgolette.


ErrorId: BC30648

Per correggere l'errore


Verificare che il valore letterale stringa termini con virgolette ("). Se si incollano i valori di altri editor di testo,
verificare che il carattere incollato sia una virgoletta valida e non uno dei caratteri simili, ad esempio
virgolette "intelligenti" o "riccie" ("o") o due virgolette singole ('').

Vedi anche
Stringhe
BC30941: la struttura ' <structurename> ' deve
contenere almeno una variabile membro di istanza
o almeno una dichiarazione di evento di istanza
non contrassegnata come ' Custom '
05/03/2021 • 2 minutes to read • Edit Online

Una definizione di struttura non include variabili non condivise o eventi non personalizzati non condivisi.
Ogni struttura deve avere una variabile o un evento che si applica a ogni istanza specifica (non condivisa) invece
che a tutte le istanze collettivamente (condivise). Le costanti, le proprietà e le routine non condivisi non
soddisfano questo requisito. Inoltre, se non sono presenti variabili non condivise e un solo evento non
condiviso, l'evento non può essere un Custom evento.
ID errore: BC30941

Per correggere l'errore


Definire almeno una variabile o un evento diverso da Shared . Se si definisce un solo evento, deve essere
non personalizzato e non condiviso.

Vedi anche
Strutture
Procedura: Dichiarare una struttura
Istruzione Structure
"" />

BC30420:' Sub Main ' non è stato trovato in '


<name> '
05/03/2021 • 2 minutes to read • Edit Online

L'istruzione Sub Main manca o è stata specificata la posizione sbagliata.


ID errore: BC30420

Per correggere l'errore


1. Fornire l'istruzione Sub Main mancante oppure, se esiste, spostarla nella posizione appropriata
all'interno del codice. Per ulteriori informazioni su Sub Main , vedere la procedura principale in Visual
Basic.
2. Specificare il percorso dell'oggetto di avvio del progetto nella casella form di avvio di Progettazione
progetti .

Vedi anche
Istruzione Sub
Routine Main in Visual Basic
Sub o Function non definita (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Per Sub poter Function essere chiamato, è necessario definire un oggetto o. Alcune cause possibili di questo
errore sono:
Ortografia del nome della procedura.
Tentativo di chiamare una routine da un altro progetto senza aggiungere esplicitamente un riferimento a
tale progetto nella finestra di dialogo riferimenti .
Specifica di una routine che non è visibile alla procedura chiamante.
Dichiarazione di una routine della libreria di collegamento dinamico (DLL) di Windows o di una routine di
risorsa di codice Macintosh che non si trova nella libreria o nella risorsa di codice specificata.

Per correggere l'errore


1. Verificare che il nome della stored procedure sia stato digitato correttamente.
2. Trovare il nome del progetto contenente la procedura che si desidera chiamare nella finestra di dialogo
riferimenti . Se non viene visualizzato, fare clic sul pulsante Sfoglia per cercarlo. Selezionare la casella
di controllo a sinistra del nome del progetto, quindi fare clic su OK .
3. Verificare il nome della routine.

Vedi anche
Tipi di errore
Gestione dei riferimenti in un progetto
Istruzione Sub
Istruzione Function
Indice non incluso nell'intervallo (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Un indice di matrice non è valido perché non rientra nell'intervallo consentito. Il valore di indice più basso per
una dimensione è sempre 0 e il valore di indice più alto viene restituito dal GetUpperBound metodo per tale
dimensione.

Per correggere l'errore


Modificare l'indice in modo che rientri nell'intervallo valido.

Vedi anche
Array.GetUpperBound
Matrici
Impossibile completare l'operazione di lettura con
TextFieldParser. È stata superata la dimensione
massima del buffer
05/03/2021 • 2 minutes to read • Edit Online

Non è possibile completare l'operazione perché è stata superata la dimensione massima del buffer (10 milioni
byte).

Per correggere l'errore


Verificare che nel file non siano presenti campi con formato non valido.

Vedi anche
OpenTextFieldParser
TextFieldParser
Procedura: Leggere da file di testo con più formati
Analisi dei file di testo con l'oggetto TextFieldParser
BC42110: il tipo per la variabile ' <variablename> '
non verrà dedotto perché è associato a un campo
in un ambito di inclusione
05/03/2021 • 3 minutes to read • Edit Online

Il tipo per la variabile ' <variablename> ' non verrà dedotto perché è associato a un campo in un ambito di
inclusione. Modificare il nome di ' <variablename> ' o usare il nome completo (ad esempio,' me. VariableName '
o ' MyBase. VariableName ').
Una variabile di controllo loop nel codice ha lo stesso nome di un campo della classe o di un altro ambito di
inclusione. Poiché la variabile di controllo viene utilizzata senza una As clausola, viene associata al campo
nell'ambito di inclusione e il compilatore non crea una nuova variabile o ne deduce il tipo.
Nell'esempio seguente, Index la variabile di controllo nell' For istruzione è associata al Index campo nella
Customer classe. Il compilatore non crea una nuova variabile per la variabile di controllo Index o ne deduce il
tipo.

Class Customer

' The class has a field named Index.


Private Index As Integer

Sub Main()

' The following line will raise this warning.


For Index = 1 To 10
' ...
Next

End Sub
End Class

Per impostazione predefinita, si tratta di un messaggio di avviso. Per informazioni su come nascondere gli avvisi
o considerarli come errori, vedere Configuring Warnings in Visual Basic.
ID errore: BC42110

Per risolvere questo avviso


Impostare la variabile di controllo del ciclo come variabile locale cambiando il nome in un identificatore
che non sia anche il nome di un campo della classe.

For I = 1 To 10

Chiarire che la variabile di controllo del ciclo viene associata al campo della classe anteponendo Me. il
nome della variabile.

For Me.Index = 1 To 10

Anziché basarsi sull'inferenza del tipo locale, usare una As clausola per specificare un tipo per la
variabile di controllo del ciclo.

For Index As Integer = 1 To 10

Esempio
Il codice seguente illustra l'esempio precedente con la prima correzione sul posto.

Class Customer

' The class has a field named Index.


Private Index As Integer

Sub Main()

For I = 1 To 10
' ...
Next

End Sub
End Class

Vedi anche
Option Infer (istruzione)
Istruzione For Each...Next
Istruzione For...Next
Procedura: fare riferimento all'istanza corrente di un oggetto
Inferenza del tipo di variabile locale
Me, My, MyBase e MyClass
La matrice è fissa o temporaneamente bloccata
(Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Questo errore presenta le possibili cause seguenti:


Utilizzo ReDim di per modificare il numero di elementi di una matrice di dimensioni fisse.
Ridimensionamento di una matrice dinamica a livello di modulo, in cui un elemento è stato passato come
argomento a una routine. Se viene passato un elemento, la matrice viene bloccata per impedire la
deallocazione della memoria per il parametro Reference all'interno della procedura.
Tentativo di assegnare un valore a una Variant variabile contenente una matrice, ma l'oggetto Variant
è attualmente bloccato.

Per correggere l'errore


1. Rendere la matrice originale dinamica anziché fissa dichiarando ReDim (se la matrice è dichiarata
all'interno di una routine) o dichiarando tale matrice senza specificare il numero di elementi (se la matrice
viene dichiarata a livello di modulo.
2. Determinare se è effettivamente necessario passare l'elemento, perché è visibile all'interno di tutte le
routine del modulo.
3. Determinare gli elementi che bloccano Variant e risolvere il problema.

Vedi anche
Matrici
Questa chiave è già associata a un elemento della
raccolta
05/03/2021 • 2 minutes to read • Edit Online

La chiave specificata per un membro della raccolta identifica già un altro membro della raccolta. Una chiave è
una stringa specificata nel Add metodo che identifica in modo univoco un membro specifico di una raccolta.

Per correggere l'errore


Usare una chiave diversa per il membro.

Vedi anche
Tipi di errore
Troppi file.
05/03/2021 • 2 minutes to read • Edit Online

Sono stati creati più file nella directory radice rispetto a quelli consentiti dal sistema operativo oppure sono stati
aperti più file rispetto al numero specificato nell'impostazione file = nel file di CONFIG.SYS.

Per correggere l'errore


1. Se il programma sta aprendo, chiudendo o salvando i file nella directory radice, modificare il programma
in modo che usi una sottodirectory.
2. Aumentare il numero di file specificati nell'impostazione file = nel file di CONFIG.SYS e riavviare il
computer.

Vedi anche
Tipi di errore
BC30251: il tipo ' <typename> ' non ha costruttori
05/03/2021 • 2 minutes to read • Edit Online

Un tipo non supporta una chiamata a Sub New() . Causa possibile: compilatore o un file binario danneggiato.
ID errore: BC30251

Per correggere l'errore


1. Se il tipo si trova in un progetto diverso o in un file di riferimento, reinstallare il progetto o il file.
2. Se il tipo si trova nello stesso progetto, ricompilare l'assembly in cui è contenuto.
3. Se l'errore si ripete, reinstallare il compilatore Visual Basic.
4. Se l'errore persiste, raccogliere informazioni sulla situazione contingente e informare il Servizio Supporto
Tecnico Clienti Microsoft.

Vedi anche
Oggetti e classi
Opzioni per commenti e suggerimenti in Visual Studio
BC40041: il tipo <typename> non è conforme a
CLS
05/03/2021 • 2 minutes to read • Edit Online

Una variabile, una proprietà o una funzione restituita è dichiarata con un tipo di dati che non è conforme a CLS.
Affinché un'applicazione sia compatibile con l'indipendenza del linguaggio e i componenti di Language-
Independent (CLS), è necessario utilizzare solo tipi conformi a CLS.
I tipi di dati Visual Basic seguenti non sono conformi a CLS:
Tipo di dati SByte
Tipo di dati UInteger
Tipo di dati ULong
Tipo di dati UShort
ID errore: BC40041

Per correggere l'errore


Se l'applicazione deve essere conforme a CLS, modificare il tipo di dati di questo elemento sul tipo
conforme a CLS più vicino. Al posto di UInteger ad esempio può essere possibile usare Integer se non
è necessario l'intervallo di valore al di sopra di 2.147.483.647. Se è necessario l'intervallo esteso, è
possibile sostituire UInteger con Long .
Se non è necessario che l'applicazione sia conforme a CLS, non è necessario apportare alcuna modifica. È
tuttavia necessario tenere presente la relativa non conformità.
BC30002: il tipo ' <typename> ' non è definito
05/03/2021 • 2 minutes to read • Edit Online

L'istruzione ha fatto riferimento a un tipo che non è stato definito. È possibile definire un tipo in un'istruzione di
dichiarazione, ad esempio Enum ,, Structure Class o Interface .
ID errore: BC30002

Per correggere l'errore


Verificare che la definizione del tipo e il relativo riferimento usino entrambi la stessa ortografia.
Verificare che la definizione del tipo sia accessibile al riferimento. Se, ad esempio, il tipo si trova in un
altro modulo ed è stato dichiarato Private , spostare la definizione del tipo nel modulo di riferimento o
dichiararlo Public .
Verificare che lo spazio dei nomi del tipo non sia ridefinito all'interno del progetto. In caso contrario,
utilizzare la Global parola chiave per qualificare completamente il nome del tipo. Se, ad esempio, un
progetto definisce uno spazio dei nomi denominato System , System.Object non è possibile accedere al
tipo a meno che non sia completo con la Global parola chiave: Global.System.Object .
Se il tipo è definito, ma la libreria di oggetti o la libreria dei tipi in cui è definita non è registrata in Visual
Basic, fare clic su Aggiungi riferimento nel menu progetto , quindi selezionare la libreria di oggetti o
la libreria dei tipi appropriata.
Verificare che il tipo si trovi in un assembly che fa parte del profilo di .NET Framework di destinazione. Per
altre informazioni, vedere Risoluzione dei problemi relativi agli errori di impostazione di .NET Framework
come destinazione.

Vedi anche
Spazi dei nomi in Visual Basic
Istruzione Enum
Istruzione Structure
Istruzione Class
Istruzione Interface
Gestione dei riferimenti in un progetto
BC36564: non è stato possibile dedurre gli
argomenti di tipo dal delegato
05/03/2021 • 2 minutes to read • Edit Online

Un'istruzione di assegnazione usa AddressOf per assegnare l'indirizzo di un oggetto generico a un delegato, ma
non fornisce alcun argomento di tipo alla routine generica.
Di norma, quando si richiama un tipo generico, si fornisce un argomento di tipo per ogni parametro di tipo
definito dal tipo generico. Se non si specifica alcun argomento di tipo, il compilatore prova a dedurre i tipi da
passare ai parametri di tipo. Se il contesto non fornisce informazioni sufficienti per consentire al compilatore di
dedurre i tipi, genera un errore.
ID errore: BC36564

Per correggere l'errore


Specificare gli argomenti di tipo per la routine generica nell'espressione AddressOf .

Vedi anche
Generic Types in Visual Basic
Operatore AddressOf
Generic Procedures in Visual Basic
Type List
Metodi di estensione
Tipo non corrispondente (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Si è provato a convertire un valore in un altro tipo in modo non valido.

Per correggere l'errore


1. Controllare l'assegnazione per assicurarsi che sia valida.
2. Assicurarsi che non sia stato passato un oggetto a una routine che prevede una singola proprietà o un
valore.
3. Assicurarsi che non sia stato utilizzato un modulo o un nome di progetto in cui era prevista
un'espressione.

Vedi anche
Tipi di errore
BC30982: non <variablename> è possibile dedurre
il tipo di '' perché i limiti del ciclo e la variabile Step
non si ampliano allo stesso tipo
05/03/2021 • 2 minutes to read • Edit Online

È stato scritto un For...Next ciclo in cui il compilatore non può dedurre un tipo di dati per la variabile di
controllo del ciclo perché sono soddisfatte le condizioni seguenti:
Il tipo di dati della variabile di controllo del ciclo non è specificato con una clausola As .
I limiti del ciclo e la clausola step contengono almeno due tipi di dati.
Non esistono conversioni standard tra i tipi di dati.
Pertanto, il compilatore non può dedurre il tipo di dati della variabile di controllo di un ciclo.
Nell'esempio seguente, la variabile Step è un carattere e i limiti del ciclo sono entrambi numeri interi. Poiché non
esiste una conversione standard tra i caratteri e i numeri interi, questo errore viene segnalato.

Dim stepVar = "1"c


Dim m = 0
Dim n = 20

' Not valid.


' For i = 1 To 10 Step stepVar
' Loop processing
' Next

ID errore: BC30982

Per correggere l'errore


Modificare i tipi di limiti del ciclo e la variabile Step in modo che almeno uno di essi sia un tipo a cui gli
altri si ampliano. Nell'esempio precedente, modificare il tipo di stepVar in Integer .

Dim stepVar = 1

-oppure-

Dim stepVar As Integer = 1

Utilizzare le funzioni di conversione esplicita per convertire i limiti del ciclo e la variabile Step nei tipi
appropriati. Nell'esempio precedente, applicare la Val funzione a stepVar .

For i = 1 To 10 Step Val(stepVar)


' Loop processing
Next

Vedi anche
Val
Istruzione For...Next
Conversioni implicite ed esplicite
Inferenza del tipo di variabile locale
Option Infer (istruzione)
CString
Widening and Narrowing Conversions
" non è conforme a CLS" />

BC40025: il tipo del membro ' <membername> '


non è conforme a CLS
05/03/2021 • 3 minutes to read • Edit Online

Il tipo di dati specificato per questo membro non fa parte dell' indipendenza del linguaggio e dei componenti di
Language-Independent (CLS). Non si tratta di un errore all'interno del componente, perché il .NET Framework e
Visual Basic supportano questo tipo di dati. Tuttavia, un altro componente scritto in codice strettamente
conforme a CLS potrebbe non supportare questo tipo di dati. Un componente di questo tipo potrebbe non
essere in grado di interagire correttamente con il componente.
I tipi di dati Visual Basic seguenti non sono conformi a CLS:
Tipo di dati SByte
Tipo di dati UInteger
Tipo di dati ULong
Tipo di dati UShort
Per impostazione predefinita, si tratta di un messaggio di avviso. Per altre informazioni su come nascondere gli
avvisi o considerarli come errori, vedere Configuring Warnings in Visual Basic.
ID errore: BC40025

Per correggere l'errore


Se il componente si interfaccia solo con altri componenti .NET Framework o non si interfaccia con altri
componenti, non è necessario apportare alcuna modifica.
Se si esegue l'interazione con un componente non scritto per il .NET Framework, potrebbe essere
possibile determinare, tramite reflection o dalla documentazione, se supporta questo tipo di dati. In tal
caso, non è necessario apportare alcuna modifica.
Se si esegue l'interazione con un componente che non supporta questo tipo di dati, è necessario
sostituirlo con il tipo più vicino conforme a CLS. Al posto di UInteger ad esempio può essere possibile
usare Integer se non è necessario l'intervallo di valore al di sopra di 2.147.483.647. Se è necessario
l'intervallo esteso, è possibile sostituire UInteger con Long .
Se si interagisce con gli oggetti COM o di automazione, tenere presente che alcuni tipi hanno larghezze di
dati diverse rispetto all'.NET Framework. Ad esempio, uint è spesso a 16 bit in altri ambienti. Se si passa
un argomento a 16 bit a tale componente, dichiararlo come UShort anziché UInteger nel codice gestito
del Visual Basic.

Vedi anche
Reflection
BC40042: il tipo di valore facoltativo per il
parametro facoltativo <parametername> non è
conforme a CLS
05/03/2021 • 3 minutes to read • Edit Online

Una procedura è contrassegnata come <CLSCompliant(True)> , ma viene dichiarato un parametro facoltativo con
valore predefinito di un tipo non conforme.
Affinché una procedura risulti compatibile con l'indipendenza del linguaggio e i componenti indipendenti dal
linguaggio (CLS), deve usare solo tipi conformi a CLS. Questo scenario si applica ai tipi dei parametri, al tipo
restituito e ai tipi di tutte le variabili locali. Si applica anche ai valori predefiniti dei parametri facoltativi.
I tipi di dati Visual Basic seguenti non sono conformi a CLS:
Tipo di dati SByte
Tipo di dati UInteger
Tipo di dati ULong
Tipo di dati UShort
Quando l'attributo CLSCompliantAttribute viene applicato a un elemento di programmazione, il parametro
isCompliant dell'attributo viene impostato su True o False per indicare la conformità o la non conformità.
L'impostazione predefinita per questo parametro non è disponibile, quindi è necessario specificare un valore.
Se a un elemento non viene applicato CLSCompliantAttribute , l'elemento non sarà considerato conforme.
Per impostazione predefinita, si tratta di un messaggio di avviso. Per informazioni su come nascondere gli avvisi
o considerarli come errori, vedere Configuring Warnings in Visual Basic.
ID errore: BC40042

Per correggere l'errore


Se il parametro facoltativo deve avere un valore predefinito di questo tipo specifico, rimuovere
CLSCompliantAttribute . La procedura non può essere compatibile con CLS.
Se la procedura deve essere compatibile con CLS, modificare il tipo di questo valore predefinito
impostandolo sul tipo con una compatibilità con CLS più vicina. Al posto di UInteger ad esempio può
essere possibile usare Integer se non è necessario l'intervallo di valore al di sopra di 2.147.483.647. Se
è necessario l'intervallo esteso, è possibile sostituire UInteger con Long .
Se si interagisce con gli oggetti COM o di automazione, tenere presente che alcuni tipi hanno larghezze di
dati diverse rispetto all'.NET Framework. Ad esempio, int è spesso a 16 bit in altri ambienti. Se si accetta
un valore integer a 16 bit da tale componente, dichiararlo come Short anziché Integer nel codice
Visual Basic gestito.
BC40028: il tipo di parametro ' <parametername> '
non è conforme a CLS
05/03/2021 • 3 minutes to read • Edit Online

Una routine è contrassegnata come <CLSCompliant(True)> ma dichiara un parametro con un tipo


contrassegnato come <CLSCompliant(False)> , non contrassegnato o non qualificato perché è un tipo non
conforme.
Affinché una procedura risulti compatibile con l'indipendenza del linguaggio e i componenti indipendenti dal
linguaggio (CLS), deve usare solo tipi conformi a CLS. Questo scenario si applica ai tipi dei parametri, al tipo
restituito e ai tipi di tutte le variabili locali.
I tipi di dati Visual Basic seguenti non sono conformi a CLS:
Tipo di dati SByte
Tipo di dati UInteger
Tipo di dati ULong
Tipo di dati UShort
Quando CLSCompliantAttribute viene applicato a un elemento di programmazione, il parametro isCompliant
dell'attributo viene impostato su True o False per indicare la conformità o la non conformità. L'impostazione
predefinita per questo parametro non è disponibile, quindi è necessario specificare un valore.
Se a un elemento non viene applicato CLSCompliantAttribute , l'elemento non sarà considerato conforme.
Per impostazione predefinita, si tratta di un messaggio di avviso. Per informazioni su come nascondere gli avvisi
o considerarli come errori, vedere Configuring Warnings in Visual Basic.
ID errore: BC40028

Per correggere l'errore


Se la routine deve prendere un parametro di questo tipo specifico, rimuovere CLSCompliantAttribute . La
procedura non può essere compatibile con CLS.
Se la routine deve essere conforme a CLS, modificare il tipo di questo parametro sul tipo conforme a CLS
più vicino. Al posto di UInteger ad esempio può essere possibile usare Integer se non è necessario
l'intervallo di valore al di sopra di 2.147.483.647. Se è necessario l'intervallo esteso, è possibile sostituire
UInteger con Long .

Se si interagisce con gli oggetti COM o di automazione, tenere presente che alcuni tipi hanno larghezze di
dati diverse rispetto all'.NET Framework. Ad esempio, int è spesso a 16 bit in altri ambienti. Se si accetta
un valore integer a 16 bit da tale componente, dichiararlo come Short anziché Integer nel codice
Visual Basic gestito.
BC32098: non è possibile usare i parametri di tipo
come qualificatori
05/03/2021 • 2 minutes to read • Edit Online

Un elemento di programmazione è qualificato con una stringa di qualificazione che include un parametro di
tipo.
Un parametro di tipo rappresenta un requisito per un tipo che deve essere specificato quando viene costruito il
tipo generico. Non rappresenta un tipo definito specifico. Una stringa di qualificazione deve includere solo
elementi definiti in fase di compilazione.
Il codice seguente può generare questo errore:

Public Function CheckText(Of c As System.Windows.Forms.Control)(


badText As String) As Boolean

Dim saveText As c.Text


' Insert code to look for badText within saveText.
End Function

ID errore: BC32098

Per correggere l'errore


1. Rimuovere il parametro di tipo dalla stringa di qualificazione o sostituirlo con un tipo definito.
2. Se è necessario usare un tipo costruito per individuare l'elemento di programmazione qualificato, è
necessario usare la logica di programma aggiuntiva.

Vedi anche
References to Declared Elements
Generic Types in Visual Basic
Type List
BC31026: Impossibile creare un assembly con nome
sicuro dal file di chiave ' <filename> ': <error>
05/03/2021 • 2 minutes to read • Edit Online

Non è stato possibile creare un assembly con nome sicuro dal file di chiave specificato.
ID errore: BC31026

Per correggere l'errore


1. Verificare che sia stato specificato il file di chiave corretto e che non sia bloccato da un'altra applicazione.

Vedi anche
Sn.exe (strumento nome sicuro)
BC30143: Impossibile incorporare il file di risorse '
<filename> ': <error message>
05/03/2021 • 2 minutes to read • Edit Online

Il compilatore Visual Basic chiama assembly linker (Al.exe, noto anche come ALink) per generare un assembly
con un manifesto. Il linker ha segnalato un errore durante l'incorporamento di un file di risorse COM+ nativo
nell'assembly.
ID errore: BC30143

Per correggere l'errore


1. Esaminare il messaggio di errore tra virgolette e consultare l'argomento Al.exe. per altre spiegazioni e
consigli.
2. Se l'errore persiste, raccogliere informazioni sulla situazione contingente e informare il Servizio Supporto
Tecnico Clienti Microsoft.

Vedi anche
Al.exe
Opzioni per commenti e suggerimenti in Visual Studio
BC30145: Impossibile creare l'assembly: <error
message>
19/03/2021 • 2 minutes to read • Edit Online

Il compilatore Visual Basic chiama assembly linker (Al.exe, noto anche come ALink) per generare un assembly
con un manifesto e il linker segnala un errore nella fase di emissione della creazione dell'assembly.
ID errore: BC30145

Per correggere l'errore


1. Esaminare il messaggio di errore tra virgolette e consultare l'argomento Al.exe per ulteriori spiegazioni e
consigli.
2. Provare a firmare l'assembly manualmente, usando il Al.exe o l' Sn.exe (strumento nome sicuro).
3. Se l'errore persiste, raccogliere informazioni sulla situazione contingente e informare il Servizio Supporto
Tecnico Clienti Microsoft.
Per firmare manualmente l'assembly
1. Usare il Sn.exe (strumento nome sicuro)) per creare un file di coppia di chiavi pubblica/privata.
Questo file ha un'estensione SNK .
2. Eliminare il riferimento COM che genera l'errore dal progetto.
3. Aprire Visual studio prompt dei comandi per gli sviluppatori o Visual Studio Developer PowerShell.
4. Passare alla directory in cui si vuole inserire il wrapper dell'assembly.
5. Immettere il comando seguente:

tlbimp <path to COM reference file> /out:<output assembly name> /keyfile:<path to .snk file>

Un esempio del comando effettivo che è possibile immettere è:

tlbimp c:\windows\system32\msi.dll /out:Interop.WindowsInstaller.dll /keyfile:"c:\documents and


settings\mykey.snk"

TIP
Se un percorso o un file contiene spazi, utilizzare le virgolette doppie.

6. In Visual Studio aggiungere un riferimento all'assembly .NET al file appena creato.

Vedi anche
Al.exe
Sn.exe (strumento nome sicuro)
Procedura: creare una coppia di chiavi di Public-Private
Opzioni per commenti e suggerimenti in Visual Studio
BC30655: Impossibile trovare il file richiesto '
<filename> '
05/03/2021 • 2 minutes to read • Edit Online

Un file richiesto da Visual Studio risulta mancante o danneggiato.


ID errore: BC30655

Per correggere l'errore


Reinstallare Visual Studio.

Vedi anche
Opzioni per commenti e suggerimenti in Visual Studio
Impossibile ottenere i nomi delle porte seriali a
causa di un errore di sistema interno
05/03/2021 • 2 minutes to read • Edit Online

Si è verificato un errore interno quando è stata chiamata la proprietà My.Computer.Ports.SerialPortNames .

Per correggere l'errore


1. Per ulteriori informazioni sulla risoluzione dei problemi, vedere nozioni di base sul debugger .
2. Prendere nota delle circostanze in cui si è verificato l'errore e contattare il Servizio Supporto Tecnico
Clienti Microsoft.

Vedi anche
SerialPortNames
Nozioni di base sul debugger
Opzioni per commenti e suggerimenti in Visual Studio
BC30144: Impossibile eseguire il collegamento al file
di risorse ' <filename> ': <error message>
05/03/2021 • 2 minutes to read • Edit Online

Il compilatore Visual Basic chiama assembly linker (Al.exe, noto anche come ALink) per generare un assembly
con un manifesto. Il linker ha segnalato un errore durante il collegamento di un file di risorse COM+ nativo
dall'assembly.
ID errore: BC30144

Per correggere l'errore


1. Esaminare il messaggio di errore tra virgolette e consultare l'argomento Al.exe. per altre spiegazioni e
consigli.
2. Se l'errore persiste, raccogliere informazioni sulla situazione contingente e informare il Servizio Supporto
Tecnico Clienti Microsoft.

Vedi anche
Al.exe
Opzioni per commenti e suggerimenti in Visual Studio
BC30712: non è possibile caricare le informazioni
per la classe ' <classname> '
05/03/2021 • 2 minutes to read • Edit Online

È stato creato un riferimento a una classe che non è disponibile.


ID errore: BC30712

Per correggere l'errore


1. Verificare che la classe sia definita e che il nome sia stato digitato correttamente.
2. Provare ad accedere a uno dei membri dichiarati nel modulo. In alcuni casi l'ambiente di debug non può
trovare i membri perché i moduli in cui sono dichiarati non sono ancora stati caricati.

Vedi anche
Debug in Visual Studio
BC31020: Impossibile scrivere l'output in memoria
05/03/2021 • 2 minutes to read • Edit Online

Si è verificato un problema durante la scrittura dell'output in memoria.


ID errore: BC31020

Per correggere l'errore


1. Ripetere la compilazione del programma, per controllare se l'errore si verifica di nuovo.
2. Se l'errore persiste, salvare il lavoro e riavviare Visual Studio.
3. Se l'errore si ripete, reinstallare Visual Basic.
4. Se l'errore persiste dopo la reinstallazione, inviare una notifica al Servizio Supporto Tecnico Clienti
Microsoft.

Vedi anche
Opzioni per commenti e suggerimenti in Visual Studio
BC30698: Impossibile scrivere il file temporaneo
perché il percorso temporaneo non è disponibile
05/03/2021 • 2 minutes to read • Edit Online

Visual Basic non è stato in grado di determinare il percorso in cui sono archiviati i file temporanei.
ID errore: BC30698

Per correggere l'errore


1. Riavviare Visual Studio.
2. Se il problema persiste, reinstallare Visual Studio.

Vedi anche
Opzioni per commenti e suggerimenti in Visual Studio
BC31019: Impossibile scrivere nel file di output '
<filename> ': <error>
05/03/2021 • 2 minutes to read • Edit Online

Si è verificato un problema durante la creazione del file.


Non è possibile aprire un file di output per la scrittura. È possibile che il file (o la cartella contenente il file) sia
aperto per l'uso esclusivo da parte di un altro processo o è stato impostato l'attributo di sola lettura del file.
Di seguito sono elencate alcune situazioni comuni in cui un file è aperto in modo esclusivo:
L'applicazione è già in esecuzione e sta usando i file correlati. Per risolvere il problema, assicurarsi che
l'applicazione non sia in esecuzione.
Un'altra applicazione ha aperto il file. Per risolvere il problema, assicurarsi che altre applicazioni non
accedano ai file. Non è sempre semplice capire quale applicazione sta accedendo ai file. In questo caso,
riavviare il computer potrebbe rappresentare il modo più semplice per arrestare l'applicazione.
Se anche uno solo dei file di output del progetto è contrassegnato come di sola lettura, sarà generata questa
eccezione.
ID errore: BC31019

Per correggere l'errore


1. Ripetere la compilazione del programma, per controllare se l'errore si verifica di nuovo.
2. Se l'errore persiste, salvare il lavoro e riavviare Visual Studio.
3. Se l'errore si ripresenta, riavviare il computer.
4. Se l'errore si ripete, reinstallare Visual Basic.
5. Se l'errore persiste dopo la reinstallazione, inviare una notifica al Servizio Supporto Tecnico Clienti
Microsoft.
Per controllare gli attributi di file in Esplora file
1. Aprire la cartella a cui si è interessati.
2. Fare clic sull'icona visualizzazioni e scegliere Dettagli .
3. Fare clic con il pulsante destro del mouse sull'intestazione di colonna e scegliere attributi dall'elenco a
discesa.
Per modificare gli attributi di un file o una cartella
1. In Esplora file fare clic con il pulsante destro del mouse sul file o sulla cartella e scegliere Proprietà .
2. Nella sezione attributi della scheda generale deselezionare la casella di sola lettura .
3. Fare clic su OK .

Vedi anche
Opzioni per commenti e suggerimenti in Visual Studio
BC40032: il tipo sottostante <typename> di enum
non è conforme a CLS
05/03/2021 • 3 minutes to read • Edit Online

Il tipo di dati specificato per questa enumerazione non fa parte dell' indipendenza del linguaggio e dei
componenti di Language-Independent (CLS). Non si tratta di un errore all'interno del componente, perché il
.NET Framework e Visual Basic supportano questo tipo di dati. Tuttavia, un altro componente scritto in codice
strettamente conforme a CLS potrebbe non supportare questo tipo di dati. Un componente di questo tipo
potrebbe non essere in grado di interagire correttamente con il componente.
I tipi di dati Visual Basic seguenti non sono conformi a CLS:
Tipo di dati SByte
Tipo di dati UInteger
Tipo di dati ULong
Tipo di dati UShort
Per impostazione predefinita, si tratta di un messaggio di avviso. Per altre informazioni su come nascondere gli
avvisi o considerarli come errori, vedere Configuring Warnings in Visual Basic.
ID errore: BC40032

Per correggere l'errore


Se il componente si interfaccia solo con altri componenti .NET Framework o non si interfaccia con altri
componenti, non è necessario apportare alcuna modifica.
Se si esegue l'interazione con un componente non scritto per il .NET Framework, potrebbe essere
possibile determinare, tramite reflection o dalla documentazione, se supporta questo tipo di dati. In tal
caso, non è necessario apportare alcuna modifica.
Se si esegue l'interazione con un componente che non supporta questo tipo di dati, è necessario
sostituirlo con il tipo più vicino conforme a CLS. Al posto di UInteger ad esempio può essere possibile
usare Integer se non è necessario l'intervallo di valore al di sopra di 2.147.483.647. Se è necessario
l'intervallo esteso, è possibile sostituire UInteger con Long .
Se si interagisce con gli oggetti COM o di automazione, tenere presente che alcuni tipi hanno larghezze di
dati diverse rispetto all'.NET Framework. Ad esempio, uint è spesso a 16 bit in altri ambienti. Se si passa
un argomento a 16 bit a tale componente, dichiararlo come UShort anziché UInteger nel codice gestito
del Visual Basic.

Vedi anche
Reflection (Visual Basic)
Reflection
BC42324: l'uso della variabile di iterazione in
un'espressione lambda può produrre risultati
imprevisti
05/03/2021 • 2 minutes to read • Edit Online

L'uso della variabile di iterazione in un'espressione lambda può produrre risultati imprevisti. Al contrario, creare
una variabile locale all'interno del ciclo e assegnarle il valore della variabile di iterazione.
Questo avviso viene visualizzato quando si usa una variabile di iterazione del ciclo in un'espressione lambda
dichiarata all'interno del ciclo. Nell'esempio seguente, ad esempio, viene visualizzato l'avviso.

For i As Integer = 1 To 10
' The warning is given for the use of i.
Dim exampleFunc As Func(Of Integer) = Function() i
Next

Nell'esempio seguente vengono illustrati i risultati imprevisti che possono verificarsi.

Module Module1
Sub Main()
Dim array1 As Func(Of Integer)() = New Func(Of Integer)(4) {}

For i As Integer = 0 To 4
array1(i) = Function() i
Next

For Each funcElement In array1


System.Console.WriteLine(funcElement())
Next

End Sub
End Module

Il For ciclo crea una matrice di espressioni lambda, ciascuna delle quali restituisce il valore della variabile di
iterazione del ciclo i . Quando le espressioni lambda vengono valutate nel For Each ciclo, è possibile che
vengano visualizzati 0, 1, 2, 3 e 4, ovvero i valori successivi del i For ciclo. Viene invece visualizzato il valore
finale di i cinque volte:
5

Per impostazione predefinita, si tratta di un messaggio di avviso. Per altre informazioni su come nascondere gli
avvisi o considerarli come errori, vedere Configuring Warnings in Visual Basic.
ID errore: BC42324
Per correggere l'errore
Assegnare il valore della variabile di iterazione a una variabile locale e usare la variabile locale
nell'espressione lambda.

Module Module1
Sub Main()
Dim array1 As Func(Of Integer)() = New Func(Of Integer)(4) {}

For i As Integer = 0 To 4
Dim j = i
array1(i) = Function() j
Next

For Each funcElement In array1


System.Console.WriteLine(funcElement())
Next

End Sub
End Module

Vedi anche
Espressioni lambda
BC30955: il valore di tipo ' <typename1> ' non può
essere convertito in ' <typename2> '
05/03/2021 • 3 minutes to read • Edit Online

Non è possibile convertire il valore di tipo ' <typename1> ' in ' <typename2> '. Il tipo non corrisponde
potrebbe essere dovuto alla combinazione di un riferimento file con un riferimento di progetto all'assembly '
<assemblyname> '. Provare a sostituire il riferimento file <filepath> con '' nel progetto ' <projectname1> ' con
un riferimento di progetto a' <projectname2> '.
In una situazione in cui un progetto rende un riferimento al progetto e un file di riferimento, il compilatore non
può garantire che un tipo possa essere convertito in un altro.
Lo pseudo-codice seguente illustra una situazione in cui è possibile generare questo errore.
' ================ Visual Basic project P1 ================

' P1 makes a PROJECT REFERENCE to project P2

' and a FILE REFERENCE to project P3.

Public commonObject As P3.commonClass

commonObject = P2.getCommonClass()

' ================ Visual Basic project P2 ================

' P2 makes a PROJECT REFERENCE to project P3

Public Function getCommonClass() As P3.commonClass

Return New P3.commonClass

End Function

' ================ Visual Basic project P3 ================

Public Class commonClass

End Class

P1 Il progetto esegue un riferimento indiretto al progetto tramite P2 il progetto al progetto P3 e anche un


riferimento diretto a un file P3 . La dichiarazione di commonObject utilizza il riferimento al file P3 , mentre la
chiamata a P2.getCommonClass utilizza il riferimento del progetto a P3 .
Il problema in questa situazione è che il riferimento al file specifica un percorso e un nome di file per il file di
output di P3 (in genere p3.dll), mentre i riferimenti al progetto identificano il progetto di origine ( P3 ) in base
al nome del progetto. Per questo motivo, il compilatore non può garantire che il tipo P3.commonClass provenga
dallo stesso codice sorgente attraverso i due riferimenti diversi.
Questa situazione si verifica in genere quando i riferimenti al progetto e i riferimenti ai file sono misti.
Nell'illustrazione precedente il problema non si verifica se è P1 stato creato un riferimento diretto a un
progetto P3 anziché un riferimento a un file.
ID errore: BC30955
Per correggere l'errore
Modificare il riferimento al file in un riferimento al progetto.

Vedi anche
Conversioni di tipi in Visual Basic
Gestione dei riferimenti in un progetto
BC30961: il valore di tipo ' <typename1> ' non può
essere convertito in ' <typename2> ' (riferimenti a
più file)
05/03/2021 • 2 minutes to read • Edit Online

Non è possibile convertire il valore di tipo ' <typename1> ' in ' <typename2> '. Il tipo non corrispondente
potrebbe essere dovuto alla combinazione di un riferimento file a' <filepath1> ' nel progetto ' <projectname1>
' con un riferimento file a' <filepath2> ' nel progetto ' <projectname2> '. Se gli assembly sono identici, provare
a definire lo stesso percorso per entrambi i riferimenti.
In una situazione in cui un progetto crea più di un riferimento di file a un assembly, il compilatore non può
garantire che un tipo possa essere convertito in un altro.
Ogni riferimento a file specifica un percorso e un nome di file per il file di output di un progetto (in genere un
file DLL). Il compilatore non può garantire che i file di output provengano dalla stessa origine o che
rappresentino la stessa versione dello stesso assembly. Pertanto, non è in grado di garantire che i tipi nei diversi
riferimenti siano dello stesso tipo o anche che uno possa essere convertito nell'altro.
È possibile utilizzare un singolo riferimento a file se si è certi che gli assembly a cui si fa riferimento hanno la
stessa identità di assembly. L' identità dell'assembly include il nome dell'assembly, la versione, la chiave
pubblica, se presente, e le impostazioni cultura. Queste informazioni identificano l'assembly in modo univoco.
ID errore: BC30961

Per correggere l'errore


Se gli assembly a cui si fa riferimento hanno la stessa identità di assembly, rimuovere o sostituire uno dei
riferimenti al file in modo che sia presente un solo riferimento a un file.
Se gli assembly a cui si fa riferimento non hanno la stessa identità di assembly, modificare il codice in
modo che non tenti di convertire un tipo in un tipo in un altro.

Vedi anche
Conversioni di tipi in Visual Basic
Gestione dei riferimenti in un progetto
BC31194: non è possibile convertire il valore di tipo '
tipo1' in ' tipo2'
05/03/2021 • 2 minutes to read • Edit Online

Non è possibile convertire il valore di tipo ' tipo1' in ' tipo2'. È possibile usare la proprietà' value ' per ottenere il
valore stringa del primo elemento di ' <parentElement> '.
Si è provato a eseguire implicitamente il cast di un valore letterale XML a un tipo specifico. Non è possibile
eseguire implicitamente il cast del valore letterale XML al tipo specificato.
ID errore: BC31194

Per correggere l'errore


Usare la proprietà Value del valore letterale XML per fare riferimento al relativo valore come String . Usare
la funzione CType , un'altra funzione di conversione del tipo oppure la classe Convert per eseguire il cast del
valore come tipo specificato.

Vedi anche
Convert
CString
Valori letterali XML
XML
BC30616: la variabile ' <variablename> ' nasconde
una variabile in un blocco di inclusione
05/03/2021 • 2 minutes to read • Edit Online

Una variabile racchiusa in un blocco ha lo stesso nome di un'altra variabile locale.


ID errore: BC30616

Per correggere l'errore


Rinominare la variabile nel blocco racchiuso in modo che non corrisponda ad altre variabili locali. Ad
esempio:

Dim a, b, x As Integer
If a = b Then
Dim y As Integer = 20 ' Uniquely named block variable.
End If

Una cause comune di questo errore è l'uso di Catch e As Exception all'interno di un gestore eventi. In tal
caso, denominare la Catch variabile Block ex anziché e .
Un'altra fonte comune di questo errore è un tentativo di accedere a una variabile locale dichiarata
all'interno di un Try blocco in un Catch blocco separato. Per risolvere il problema, dichiarare la
variabile all'esterno della Try...Catch...Finally struttura.

Vedi anche
Istruzione Try...Catch...Finally
Dichiarazione di variabile
BC42104: la variabile ' <variablename> ' viene usata
prima dell'assegnazione di un valore
05/03/2021 • 2 minutes to read • Edit Online

La variabile ' <variablename> ' viene usata prima dell'assegnazione di un valore. È possibile che in fase di
esecuzione venga restituita un'eccezione dovuta a un riferimento Null.
Un'applicazione ha almeno un possibile percorso attraverso il codice che legge una variabile prima che venga
assegnato un qualsiasi valore.
Se a una variabile non è mai stato assegnato alcun valore, questa manterrà il valore predefinito per il tipo di dati.
Per un tipo di dati di riferimento, il valore predefinito è Nothing. La lettura di una variabile di riferimento con un
valore Nothing può causare un'eccezione NullReferenceException in alcune circostanze.
Per impostazione predefinita, si tratta di un messaggio di avviso. Per altre informazioni su come nascondere gli
avvisi o considerarli come errori, vedere Configuring Warnings in Visual Basic.
ID errore: BC42104

Per correggere l'errore


Controllare la logica del flusso di controllo e verificare che la variabile abbia un valore valido prima che il
controllo passi a qualsiasi istruzione che la legga.
Un modo per garantire che la variabile abbia sempre un valore valido consiste nell'inizializzarla come
parte della relativa dichiarazione. Vedere "inizializzazione" nell' istruzione Dim.

Vedi anche
Istruzione Dim
Dichiarazione di variabile
Risoluzione dei problemi relativi alle variabili
La variabile utilizza un tipo di automazione non
supportato in Visual Basic
05/03/2021 • 2 minutes to read • Edit Online

Si è tentato di utilizzare una variabile definita in una libreria dei tipi o in una libreria di oggetti con tipo di dati
non supportato da Visual Basic.

Per correggere l'errore


Usare una variabile di un tipo riconosciuto dal Visual Basic.
-oppure-
Se si verifica questo errore quando si usa FileGet o FileGetObject , assicurarsi che il file che si sta
provando a usare sia stato scritto con FilePut o FilePutObject .

Vedi anche
Tipi di dati
BC31168: le proprietà Axis XML non supportano
l'associazione tardiva
05/03/2021 • 2 minutes to read • Edit Online

Per un oggetto non tipizzato è stato fatto riferimento a una proprietà Axis XML.
ID errore: BC31168

Per correggere l'errore


Verificare che l'oggetto sia un oggetto fortemente tipizzato prima di fare XElement riferimento alla proprietà
Axis XML.

Vedi anche
Proprietà Axis XML
XML
BC42319: l'eccezione del commento XML deve
avere un attributo ' cref '
05/03/2021 • 2 minutes to read • Edit Online

Il <exception> tag fornisce un modo per documentare le eccezioni che possono essere generate da un metodo.
L' cref attributo required designa il nome di un membro, che viene controllato dal generatore di
documentazione. Se il membro esiste, viene convertito nel nome canonico dell'elemento nel file di
documentazione.
ID errore: BC42319

Per correggere l'errore


Aggiungere l' cref attributo all'eccezione come segue:

<exception cref="member">description</exception>

Vedi anche
<exception>
Procedura: Creare documentazione XML
Tag di commento XML
BC31180: i riferimenti alle entità XML non sono
supportati
05/03/2021 • 2 minutes to read • Edit Online

Un riferimento all'entità, ad esempio, © che non è definito nella specifica xml 1,0 è incluso come valore per un
valore letterale XML. & " < > ' Nei valori letterali XML sono supportati solo i riferimenti a entità,,, e XML.
ID errore: BC31180

Per correggere l'errore


Rimuovere il riferimento all'entità non supportato.

Vedi anche
Valori letterali XML e specifica XML 1.0
Valori letterali XML
XML
BC31200: i valori letterali XML e le proprietà XML
non sono supportati nel codice incorporato in
ASP.NET
05/03/2021 • 2 minutes to read • Edit Online

I valori letterali XML e le proprietà XML non sono supportati nel codice incorporato all'interno di ASP.NET. Per
utilizzare le funzionalità XML, spostare il codice nel code-behind.
Un valore letterale XML o una proprietà Axis XML viene definito all'interno del codice incorporato ( <%= => ) in
un file ASP.NET.
ID errore: BC31200

Per correggere l'errore


Spostare il codice che include il valore letterale XML o la proprietà Axis XML in un file code-behind ASP.NET.

Vedi anche
Valori letterali XML
Proprietà Axis XML
XML
BC31183: URI dello spazio dei nomi XML
http://www.w3.org/XML/1998/namespace ; può essere
associato solo a' xmlns '
05/03/2021 • 2 minutes to read • Edit Online

L'URI http://www.w3.org/XML/1998/namespace viene usato in una dichiarazione dello spazio dei nomi XML. Questo
URI è uno spazio dei nomi riservato e non può essere incluso in una dichiarazione dello spazio dei nomi XML.
ID errore: BC31183

Per correggere l'errore


Rimuovere la dichiarazione dello spazio dei nomi XML o sostituire l'URI http://www.w3.org/XML/1998/namespace
con un URI dello spazio dei nomi valido.

Vedi anche
Istruzione Imports (spazio dei nomi XML)
Valori letterali XML
XML
Riferimenti (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

In questa sezione vengono forniti collegamenti a informazioni di riferimento su vari aspetti della
programmazione Visual Basic.

Contenuto della sezione


Riferimenti al linguaggio Visual Basic
Vengono fornite informazioni di riferimento per diversi aspetti del linguaggio Visual Basic.
Compilatore della riga di comando di Visual Basic
Fornisce collegamenti a informazioni sul compilatore da riga di comando, che rappresenta un'alternativa alla
compilazione dei programmi dall'IDE di Visual Studio.
Informazioni di riferimento su .NET Framework
Vengono forniti collegamenti alle informazioni sull'utilizzo della libreria di classi .NET Framework.
Specifica del linguaggio Visual Basic
Fornisce collegamenti alla specifica del linguaggio di Visual Basic completa, che contiene informazioni
dettagliate su tutti gli aspetti del linguaggio.

Sezioni correlate
Elementi generali dell'interfaccia utente (Visual Studio)
Contiene argomenti relativi alle finestre di dialogo e alle finestre usate in Visual Studio.
Strumenti XML in Visual Studio
Fornisce collegamenti ad argomenti sui vari strumenti XML disponibili in Visual Studio.
Automation and Extensibility Reference (Riferimenti su automazione ed estendibilità)
Fornisce collegamenti ad argomenti relativi a automazione ed estensibilità in Visual Studio, sia per i componenti
condivisi che per quelli specifici del linguaggio.
Visual Basic compilatore da riga di comando
05/03/2021 • 2 minutes to read • Edit Online

Il Visual Basic compilatore della riga di comando fornisce un'alternativa alla compilazione dei programmi
dall'interno di Visual Studio Integrated Development Environment (IDE). Questa sezione contiene le descrizioni
per le opzioni del compilatore Visual Basic.
Ogni opzione del compilatore è disponibile in due forme: -opzione e (opzione) . La documentazione mostra
solo la forma -opzione.

Contenuto della sezione


Compilazione dalla riga di comando
Descrive il Visual Basic compilatore della riga di comando, fornito come alternativa alla compilazione di
programmi dall'IDE di Visual Studio.
Opzioni del compilatore Visual Basic in ordine alfabetico
Elenca le opzioni del compilatore in una tabella in ordine alfabetico
Opzioni del compilatore Visual Basic elencate per categoria
Presenta le opzioni del compilatore in gruppi funzionali.
Compilazione dalla riga di comando (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Un progetto Visual Basic è costituito da uno o più file di origine separati. Durante il processo noto come
compilazione, questi file vengono raggruppati in un unico pacchetto, ovvero un singolo file eseguibile che può
essere eseguito come applicazione.
Visual Basic fornisce un compilatore da riga di comando come alternativa alla compilazione di programmi
dall'interno di Visual Studio Integrated Development Environment (IDE). Il compilatore da riga di comando è
progettato per le situazioni in cui non è necessario il set completo di funzionalità nell'IDE, ad esempio quando si
usa o si scrive per computer con memoria di sistema limitata o spazio di archiviazione.
Per compilare i file di origine dall'IDE di Visual Studio, scegliere il comando Compila dal menu Compila .

TIP
Quando si compilano i file di progetto usando l'IDE di Visual Studio, è possibile visualizzare informazioni sul comando vbc
associato e sulle relative opzioni nella finestra output. Per visualizzare queste informazioni, aprire la finestra di dialogo
Opzioni, progetti e soluzioni, compila ed Esegui, quindi impostare il livello di dettaglio dell'output di compilazione
del progetto MSBuild su normale o su un livello di dettaglio superiore. Per altre informazioni, vedere procedura:
visualizzare, salvare e configurare i file di log di compilazione.

È possibile compilare file di progetto (con estensione vbproj) da un prompt dei comandi utilizzando MSBuild.
Per altre informazioni, vedere Guida di riferimento alla riga di comando e procedura dettagliata: uso di MSBuild.

Contenuto della sezione


Procedura: richiamare il compilatore Command-Line
Viene descritto come richiamare il compilatore da riga di comando al prompt di MS-DOS o da una
sottodirectory specifica.
Esempi di righe di comando di compilazione
Fornisce un elenco di righe di comando di esempio che è possibile modificare per uso personale.

Sezioni correlate
Compilatore Command-Line Visual Basic
Fornisce elenchi di opzioni del compilatore, organizzate in ordine alfabetico o per scopo.
Compilazione condizionale
Viene descritto come compilare sezioni di codice specifiche.
Compilazione e pulizia di progetti e soluzioni in Visual Studio
Viene descritto come organizzare gli elementi che verranno inclusi in compilazioni diverse, scegliere le proprietà
del progetto e assicurarsi che i progetti vengano compilati in base all'ordine corretto.
Procedura: richiamare il compilatore da riga di
comando (Visual Basic)
05/03/2021 • 5 minutes to read • Edit Online

È possibile richiamare il compilatore da riga di comando digitando il nome del relativo file eseguibile nella riga
di comando, noto anche come prompt di MS-DOS. Se si esegue la compilazione dal prompt dei comandi di
Windows predefinito, è necessario digitare il percorso completo del file eseguibile. Per eseguire l'override di
questo comportamento predefinito, è possibile usare la Prompt dei comandi per gli sviluppatori per Visual
Studio o modificare la variabile di ambiente PATH. Entrambi consentono di compilare da qualsiasi directory
semplicemente digitando il nome del compilatore.

NOTE
Nomi o percorsi visualizzati per alcuni elementi dell'interfaccia utente di Visual Studio nelle istruzioni seguenti potrebbero
essere diversi nel computer in uso. La versione di Visual Studio in uso e le impostazioni configurate determinano questi
elementi. Per altre informazioni, vedere Personalizzazione dell'IDE.

Per richiamare il compilatore usando il Prompt dei comandi per gli


sviluppatori per Visual Studio
1. Aprire la cartella del programma Strumenti di Visual Studio nel gruppo Microsoft Visual Studio Program.
2. È possibile usare la Prompt dei comandi per gli sviluppatori per Visual Studio per accedere al compilatore
da qualsiasi directory nel computer, se è installato Visual Studio.
3. Richiamare il Prompt dei comandi per gli sviluppatori per Visual Studio.
4. Nella riga di comando digitare vbc.exe sourceFileName e quindi premere INVIO.
Ad esempio, se il codice sorgente è stato archiviato in una directory denominata SourceFiles , si aprirà il
prompt dei comandi e il tipo cd SourceFiles per passare a tale directory. Se la directory contiene un file
di origine denominato Source.vb , è possibile compilarlo digitando vbc.exe Source.vb .

Per impostare la variabile di ambiente PATH sul compilatore per il


prompt dei comandi di Windows
1. Utilizzare la funzionalità di ricerca di Windows per trovare Vbc.exe nel disco locale.
Il nome esatto della directory in cui si trova il compilatore dipende dalla posizione della directory di
Windows e dalla versione di ".NET Framework" installata. Se è installata più di una versione di ".NET
Framework", è necessario determinare la versione da usare (in genere la versione più recente).
2. Dal menu Star t , fare clic con il pulsante destro del mouse su computer locale , quindi scegliere
proprietà dal menu di scelta rapida.
3. Fare clic sulla scheda Avanzate e quindi su Variabili di ambiente .
4. Nel riquadro variabili di sistema selezionare percorso dall'elenco e fare clic su modifica .
5. Nella finestra di dialogo Modifica variabile di sistema spostare il punto di inserimento alla fine della
stringa nel campo valore variabile e digitare un punto e virgola (;) seguito dal nome completo della
directory disponibile nel passaggio 1.
6. Fare clic su OK per confermare le modifiche e chiudere le finestre di dialogo.
Dopo aver modificato la variabile di ambiente PATH, è possibile eseguire il compilatore Visual Basic al
prompt dei comandi di Windows da qualsiasi directory del computer.

Per richiamare il compilatore tramite il prompt dei comandi di


Windows
1. Dal menu Star t fare clic sulla cartella Accessories , quindi aprire il prompt dei comandi di Windows .
2. Nella riga di comando digitare vbc.exe sourceFileName e quindi premere INVIO.
Ad esempio, se il codice sorgente è stato archiviato in una directory denominata SourceFiles , si aprirà il
prompt dei comandi e il tipo cd SourceFiles per passare a tale directory. Se la directory contiene un file
di origine denominato Source.vb , è possibile compilarlo digitando vbc.exe Source.vb .

Vedi anche
Compilatore della riga di comando di Visual Basic
Compilazione condizionale
Righe di comando di compilazione di esempio
(Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

In alternativa alla compilazione di Visual Basic programmi da Visual Studio, è possibile eseguire la compilazione
dalla riga di comando per produrre file eseguibili (exe) o file dll (Dynamic-Link Library).
Il Visual Basic compilatore della riga di comando supporta un set completo di opzioni che controllano i file di
input e di output, gli assembly e le opzioni di debug e preprocessore. Ogni opzione è disponibile in due forme
intercambiabili: -option e /option . Questa documentazione Mostra solo il -option modulo.
La tabella seguente elenca alcune righe di comando di esempio che è possibile modificare per uso personale.

A USO

Compilare file. vb e creare File.exe vbc -reference:Microsoft.VisualBasic.dll File.vb

Compilare file. vb e creare File.dll vbc -target:library File.vb

Compilare file. vb e creare My.exe vbc -out:My.exe File.vb

Compilare file. vb e creare una libreria e un assembly di vbc -target:library -ref:.\debug\bin\ref\file.dll


riferimento denominato File.dll File.vb

Compilare tutti i file Visual Basic nella directory corrente, con vbc -define:DEBUG=1 -optimize -out:File2.exe *.vb
le ottimizzazioni su e il DEBUG simbolo definito, producendo
File2.exe

Compila tutti i file di Visual Basic nella directory corrente, vbc -target:library -out:File2.dll -nowarn -nologo
producendo una versione di debug di File2.dll senza -debug *.vb
visualizzare il logo o gli avvisi

Compila tutti i file di Visual Basic nella directory corrente per vbc -target:library -out:Something.dll *.vb
Something.dll

TIP
Quando si compila un progetto usando l'IDE di Visual Studio, è possibile visualizzare informazioni sul comando vbc
associato con le relative opzioni del compilatore nella finestra output. Per visualizzare queste informazioni, aprire la finestra
di dialogo Opzioni, progetti e soluzioni, compila ed Esegui, quindi impostare il livello di dettaglio dell'output di
compilazione del progetto MSBuild su normale o su un livello di dettaglio superiore.

Vedi anche
Compilatore della riga di comando di Visual Basic
Compilazione condizionale
Opzioni del compilatore Visual Basic elencate in
ordine alfabetico
05/03/2021 • 7 minutes to read • Edit Online

Il Visual Basic compilatore della riga di comando viene fornito come alternativa alla compilazione di programmi
da Visual Studio Integrated Development Environment (IDE). Di seguito è riportato un elenco delle opzioni del
compilatore da riga di comando Visual Basic ordinate alfabeticamente.
Ogni opzione del compilatore è disponibile in due forme: -opzione e (opzione) . La documentazione mostra
solo la forma -opzione.

O P Z IO N E SC O P O

@ (Specifica di un file di risposta) Specifica un file di risposta.

-? Visualizza le opzioni del compilatore. Questo comando ha la


stessa funzione dell'opzione -help . Non viene effettuata
alcuna compilazione.

-additionalfile Assegna un nome ad altri file che non influiscono


direttamente sulla generazione del codice, ma possono
essere usati dagli analizzatori per produrre errori o avvisi.

-addmodule Fa sì che il compilatore renda disponibili per il progetto in


compilazione tutte le informazioni sui tipi presenti nei file
specificati.

-analyzer Esegue gli analizzatori da questo assembly (forma breve: -a)

-baseaddress Specifica l'indirizzo di base di una DLL.

-bugreport Crea un file contenente informazioni che rendono più


semplice segnalare un bug.

-checksumalgorithm:<alg> Specificare l'algoritmo per il calcolo del checksum del file di


origine archiviato nel file PDB. I valori supportati sono: SHA1
(predefinito) o SHA256.
A causa di problemi di collisione con SHA1, Microsoft
consiglia di SHA256 o meglio.

-codepage Specifica la tabella codici da usare per tutti i file del codice
sorgente nella compilazione.

-debug Crea informazioni di debug.

-definizione Definisce simboli per la compilazione condizionale.

-delaysign Specifica se l'assembly avrà firma completa o parziale.


O P Z IO N E SC O P O

-deterministico Fa sì che l'output del compilatore sia un assembly il cui


contenuto binario è identico in tutte le compilazioni se gli
input sono identici.

-doc Elabora commenti sulla documentazione in un file XML.

-errorreport Specifica il modo in cui il compilatore di Visual Basic deve


segnalare gli errori interni del compilatore.

-filealign Specifica la posizione di allineamento per le sezioni del file di


output.

-Guida Visualizza le opzioni del compilatore. Questo comando ha la


stessa funzione dell'opzione -? . Non viene effettuata
alcuna compilazione.

-highentropyva Indica se un particolare eseguibile supporta ASLR (Address


Space Layout Randomization) a entropia elevata.

-imports Importa uno spazio dei nomi dall'assembly specificato.

-keycontainer Specifica il nome di un contenitore di chiavi per una coppia di


chiavi allo scopo di assegnare a un assembly un nome sicuro.

-keyfile Specifica un file che contiene una chiave o una coppia di


chiavi allo scopo di assegnare a un assembly un nome sicuro.

-langversion Specificare la versione del linguaggio: 9|9,0|10|10,0|11|11,0.

-LIBPATH Specifica il percorso degli assembly a cui fa riferimento


l'opzione -Reference .

-linkresource Crea un collegamento a una risorsa gestita.

-principale Specifica la classe che contiene la Sub Main procedura da


utilizzare all'avvio.

-moduleassemblyname Specifica il nome dell'assembly che conterrà un modulo.

-modulename:<string> Specificare il nome del modulo di origine

-netcf Imposta il compilatore in modo che abbia come destinazione


la .NET Compact Framework.

-noconfig La compilazione non viene eseguita con Vbc.rsp.

-nologo Elimina i messaggi informativi del compilatore.

-nostdlib Indica al compilatore di non fare riferimento alle librerie


standard.

-nowarn Inibisce la capacità del compilatore di generare avvisi.


O P Z IO N E SC O P O

-nowin32manifest Indica al compilatore di non incorporare un manifesto


dell'applicazione nel file eseguibile.

-Ottimizza Abilita/disabilita l'ottimizzazione del codice.

-optioncompare Specifica se il confronto si verifica tra stringhe di tipo binario


oppure se usare una semantica basata sul testo specifica
delle impostazioni locali definite.

-optionexplicit Richiede la dichiarazione esplicita delle variabili.

-optioninfer Consente di usare l'inferenza del tipo di variabile locale nelle


dichiarazioni di variabile.

-optionstrict Attiva la semantica del linguaggio rigorosa.

-out Specifica un file di output.

-parallel[+|-] Specifica se usare la compilazione simultanea (+).

-piattaforma Specifica la piattaforma del processore da impostare come


destinazione del file di output.

-preferreduilang Specificare il nome della lingua di output preferita.

-non interattiva Impedisce al compilatore di visualizzare codice per avvisi ed


errori relativi alla sintassi.

-recurse Cerca nelle sottodirectory i file di origine da compilare.

-riferimento Importa metadati da un assembly.

-refonly Restituisce solo un assembly di riferimento.

-refout Specifica il percorso di output di un assembly di riferimento.

-removeintchecks Disabilita il controllo dell'overflow di Integer.

-risorsa Incorpora una risorsa gestita in un assembly.

-rootnamespace Specifica uno spazio dei nomi per tutte le dichiarazioni di


tipo.

-ruleset:<file> Specificare un file di set di regole che disabilita la diagnostica


specifica.

-sdkpath Specifica il percorso dei file Mscorlib.dll e


Microsoft.VisualBasic.dll.

-subsystemversion Specifica la versione minima del sottosistema che può essere


usata dal file eseguibile generato.
O P Z IO N E SC O P O

-destinazione Specifica il formato del file di output.

-utf8output Visualizza l'output del compilatore usando la codifica UTF-8.

-vbruntime Indica che il compilatore deve compilare senza un riferimento


alla libreria di runtime di Visual Basic oppure con un
riferimento a una libreria di runtime specifica.

-Verbose Restituisce informazioni supplementari durante la


compilazione.

-warnaserror Alza il livello degli avvisi a errori.

-win32icon Inserisce un file ico nel file di output.

-win32manifest Identifica un file manifesto dell'applicazione Win32 definito


dall'utente da incorporare nel file eseguibile di tipo PE di un
progetto.

-win32resource Inserisce una risorsa Win32 nel file di output.

Vedi anche
Opzioni del compilatore Visual Basic elencate per categoria
Gestire le proprietà di progetti e soluzioni
@ (specificare il file di risposta) (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Specifica un file che contiene le opzioni del compilatore e i file del codice sorgente da compilare.

Sintassi
@response_file

Argomenti
response_file
Obbligatorio. File che elenca le opzioni del compilatore o i file del codice sorgente da compilare. Racchiudere il
nome file tra virgolette ("") se contiene uno spazio.

Commenti
Il compilatore elabora le opzioni del compilatore e i file del codice sorgente specificati in un file di risposta come
se fossero stati specificati nella riga di comando.
Per specificare più di un file di risposta in una compilazione, specificare più opzioni del file di risposta, ad
esempio la seguente.

@file1.rsp @file2.rsp

In un file di risposta, più opzioni del compilatore e file del codice sorgente possono essere visualizzati in una
sola riga. Una singola specifica dell'opzione del compilatore deve essere visualizzata su una riga (non può
estendersi su più righe). I file di risposta possono avere commenti che iniziano con il # simbolo.
È possibile combinare le opzioni specificate nella riga di comando con le opzioni specificate in uno o più file di
risposta. Il compilatore elabora le opzioni del comando mentre le rileva. Pertanto, gli argomenti della riga di
comando possono eseguire l'override delle opzioni elencate in precedenza nei file di risposta. Viceversa, le
opzioni in un file di risposta sostituiscono le opzioni elencate in precedenza nella riga di comando o in altri file di
risposta.
Visual Basic fornisce il file Vbc. rsp, che si trova nella stessa directory del file di Vbc.exe. Il file Vbc. RSP è incluso
per impostazione predefinita, a meno che non -noconfig venga utilizzata l'opzione. Per ulteriori informazioni,
vedere -noconfig.

NOTE
L' @ opzione non è disponibile nell'ambiente di sviluppo di Visual Studio. è disponibile solo quando si esegue la
compilazione dalla riga di comando.

Esempio
Le righe seguenti sono riportate in un file di risposta di esempio.
# build the first output file
-target:exe
-out:MyExe.exe
source1.vb
source2.vb

Esempio
Nell'esempio seguente viene illustrato come utilizzare l' @ opzione con il file di risposta denominato File1.rsp
.

vbc @file1.rsp

Vedi anche
Compilatore della riga di comando di Visual Basic
-noconfig
Esempi di righe di comando di compilazione
-addmodule
05/03/2021 • 2 minutes to read • Edit Online

Fa sì che il compilatore renda disponibili per il progetto in compilazione tutte le informazioni sui tipi presenti nei
file specificati.

Sintassi
-addmodule:fileList

Argomenti
fileList
Obbligatorio. Elenco delimitato da virgole di file che contengono metadati ma che non contengono manifesti di
assembly. I nomi di file contenenti spazi devono essere racchiusi tra virgolette ("").

Commenti
I file elencati dal fileList parametro devono essere creati con l' -target:module opzione o con un altro
compilatore equivalente a -target:module .
Tutti i moduli aggiunti con -addmodule devono trovarsi nella stessa directory del file di output in fase di
esecuzione. In altre termini, è possibile specificare un modulo in qualsiasi directory in fase di compilazione, ma il
modulo deve trovarsi nella directory dell'applicazione in fase di esecuzione. In caso contrario, viene ricevuto un
TypeLoadException errore.
Se si specifica (in modo implicito o esplicito) qualsiasi opzione didestinazione (Visual Basic) diversa da
-target:module con -addmodule , i file passati a -addmodule diventano parte dell'assembly del progetto. Per
eseguire un file di output con uno o più file aggiunti con, è necessario un assembly -addmodule .
Use -Reference (Visual Basic) per importare metadati da un file che contiene un assembly.

NOTE
L' -addmodule opzione non è disponibile nell'ambiente di sviluppo di Visual Studio. è disponibile solo quando si esegue la
compilazione dalla riga di comando.

Esempio
Il codice seguente crea un modulo.

' t1.vb
' Compile with vbc /target:module t1.vb.
' Outputs t1.netmodule.

Public Class TestClass


Public i As Integer
End Class

Il codice seguente importa i tipi del modulo.


' t2.vb
' Compile with vbc /addmodule:t1.netmodule t2.vb.
Option Strict Off

Namespace NetmoduleTest
Module Module1
Sub Main()
Dim x As TestClass
x = New TestClass
x.i = 802
System.Console.WriteLine(x.i)
End Sub
End Module
End Namespace

Quando si esegue t1 , viene restituito 802 .

Vedi anche
Compilatore della riga di comando di Visual Basic
-target (Visual Basic)
-Reference (Visual Basic)
Esempi di righe di comando di compilazione
-baseaddress
05/03/2021 • 2 minutes to read • Edit Online

Specifica un indirizzo di base predefinito durante la creazione di una DLL.

Sintassi
-baseaddress:address

Argomenti
T ERM IN E DEF IN IZ IO N E

address Obbligatorio. Indirizzo di base per la DLL. Questo indirizzo


deve essere specificato come numero esadecimale.

Commenti
L'indirizzo di base predefinito per una DLL viene impostato dal .NET Framework.
Tenere presente che la parola di ordine inferiore in questo indirizzo viene arrotondata. Se ad esempio si specifica
0x11110001, viene arrotondato a 0x11110000.
Per completare il processo di firma di una DLL, utilizzare l' –R opzione dello strumento per la denominazione
sicura (Sn.exe).
Questa opzione viene ignorata se la destinazione non è una DLL.

P ER IM P O STA RE- B A SEA DDRESS N EL L 'IDE DI VISUA L ST UDIO

1. è stato selezionato un progetto in Esplora soluzioni. Scegliere Proprietà dal menu Progetto .
2. fare clic sulla scheda Compila .
3. fare clic su Avanzate .
4. modificare il valore nella casella indirizzo di base dll: . Nota: Indirizzo di base dll: box è di sola lettura, a meno che la
destinazione non sia una dll.

Vedi anche
Compilatore della riga di comando di Visual Basic
-target (Visual Basic)
Esempi di righe di comando di compilazione
Sn.exe (strumento nome sicuro)
-bugreport
05/03/2021 • 4 minutes to read • Edit Online

Consente di creare un file che è possibile utilizzare per il file di un report sui bug.

Sintassi
-bugreport:file

Argomenti
T ERM IN E DEF IN IZ IO N E

file Obbligatorio. Nome del file che conterrà il report sui bug.
Racchiudere il nome file tra virgolette ("") se il nome contiene
uno spazio.

Commenti
Vengono aggiunte le informazioni seguenti a file :
Copia di tutti i file del codice sorgente nella compilazione.
Elenco delle opzioni del compilatore utilizzate nella compilazione.
Informazioni sulla versione del compilatore, della Common Language Runtime e del sistema operativo.
L'eventuale output del compilatore.
Una descrizione del problema, per cui viene richiesto.
Una descrizione del modo in cui si ritiene che il problema venga risolto, per cui viene richiesto.
Poiché una copia di tutti i file di codice sorgente è inclusa in file , potrebbe essere necessario riprodurre
l'errore del codice (sospetto) nel programma più breve possibile.

IMPORTANT
L' -bugreport opzione produce un file che contiene informazioni potenzialmente riservate. Sono inclusi l'ora corrente, la
versione del compilatore, la versione .NET Framework, la versione del sistema operativo, il nome utente, gli argomenti
della riga di comando con cui è stato eseguito il compilatore, tutto il codice sorgente e il formato binario di qualsiasi
assembly a cui si fa riferimento. Per accedere a questa opzione, è possibile specificare le opzioni della riga di comando nel
file Web.config per una compilazione lato server di un'applicazione ASP.NET. Per evitare questo problema, modificare il file
di Machine.config per non consentire agli utenti di eseguire la compilazione nel server.

Se questa opzione viene utilizzata con -errorreport:prompt , -errorreport:queue o -errorreport:send e


l'applicazione rileva un errore interno del compilatore, le informazioni contenute in file vengono inviate a
Microsoft Corporation. Tali informazioni consentiranno ai tecnici Microsoft di identificare la ragione dell'errore e
contribuire a migliorare la prossima versione di Visual Basic. Per impostazione predefinita, nessuna
informazione viene inviata a Microsoft. Tuttavia, quando si compila un'applicazione utilizzando
-errorreport:queue , che è abilitata per impostazione predefinita, l'applicazione raccoglie i report degli errori.
Quindi, quando l'amministratore del computer accede, il sistema di segnalazione degli errori Visualizza una
finestra popup che consente all'amministratore di trasmettere a Microsoft eventuali segnalazioni di errore che si
sono verificate dopo l'accesso.

NOTE
L' -bugreport opzione non è disponibile nell'ambiente di sviluppo di Visual Studio. è disponibile solo quando si esegue la
compilazione dalla riga di comando.

Esempio
Nell'esempio seguente viene compilato T2. vb e vengono inserite tutte le informazioni di segnalazione dei bug
nel file Problem.txt.

vbc -bugreport:problem.txt t2.vb

Vedi anche
Compilatore della riga di comando di Visual Basic
-debug (Visual Basic)
-errorreport
Esempi di righe di comando di compilazione
Elemento trustLevel per securityPolicy (schema delle impostazioni ASP.NET)
-tabella codici (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica la tabella codici da usare per tutti i file del codice sorgente nella compilazione.

Sintassi
-codepage:id

Argomenti
T ERM IN E DEF IN IZ IO N E

id Obbligatorio. Il compilatore usa la tabella codici specificata


da id per interpretare la codifica dei file di origine.

Commenti
Per compilare il codice sorgente salvato con una codifica specifica, è possibile usare -codepage per specificare la
tabella codici da usare. L' -codepage opzione si applica a tutti i file del codice sorgente nella compilazione. Per
ulteriori informazioni, vedere codifica dei caratteri nella .NET Framework.
L' -codepage opzione non è necessaria se i file del codice sorgente sono stati salvati usando la tabella codici
ANSI corrente, Unicode o UTF-8 con una firma. Per impostazione predefinita, Visual Studio Salva tutti i file del
codice sorgente con la tabella codici ANSI corrente, a meno che l'utente non specifichi un'altra codifica nella
finestra di dialogo codifica . Visual Studio usa la finestra di dialogo codifica per aprire i file di codice sorgente
salvati con una tabella codici diversa.

NOTE
L' -codepage opzione non è disponibile nell'ambiente di sviluppo di Visual Studio. è disponibile solo quando si esegue la
compilazione dalla riga di comando.

Vedi anche
Compilatore della riga di comando di Visual Basic
-debug (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Consente al compilatore di generare informazioni di debug e di inserirle nei file di output.

Sintassi
-debug[+ | -]

oppure

-debug:[full | pdbonly]

Argomenti
T ERM IN E DEF IN IZ IO N E

+ | - facoltativo. + Se si specifica o, -debug il compilatore


genera informazioni di debug e le inserisce in un file con
estensione pdb. - La specifica di ha lo stesso effetto di non
specificare -debug .

full | pdbonly facoltativo. Specifica il tipo di informazioni di debug generate


dal compilatore. Se non si specifica -debug:pdbonly , il
valore predefinito è full , che consente di aggiungere un
debugger al programma in esecuzione. L' pdbonly
argomento consente il debug del codice sorgente quando il
programma viene avviato nel debugger, ma Visualizza il
codice in linguaggio assembly solo quando il programma in
esecuzione è collegato al debugger.

Commenti
Usare questa opzione per creare build di debug. Se non si specifica -debug , o, non sarà possibile -debug+
-debug:full eseguire il debug del file di output del programma.

Per impostazione predefinita, le informazioni di debug non vengono emesse ( -debug- ). Per creare
informazioni di debug, specificare -debug o -debug+ .
Per informazioni su come configurare le prestazioni di debug di un'applicazione, vedere Semplificazione del
debug di un'immagine.

P ER IM P O STA RE- DEB UG IN VISUA L ST UDIO IN T EGRAT ED DEVELO P M EN T EN VIRO N M EN T

1. con un progetto selezionato in Esplora soluzioni, scegliere proprietà dal menu progetto .
2. fare clic sulla scheda Compila .
3. fare clic su Opzioni di compilazione avanzate .
4. modificare il valore nella casella genera informazioni di debug .
Esempio
Nell'esempio seguente vengono inserite le informazioni di debug nel file di output App.exe .

vbc -debug -out:app.exe test.vb

Vedi anche
Compilatore della riga di comando di Visual Basic
-bugreport
Esempi di righe di comando di compilazione
-define (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Definisce le costanti del compilatore condizionali.

Sintassi
-define:["]symbol[=value][,symbol[=value]]["]

oppure

-d:["]symbol[=value][,symbol[=value]]["]

Argomenti
T ERM IN E DEF IN IZ IO N E

symbol Obbligatorio. Il simbolo da definire.

value facoltativo. Il valore da assegnare a symbol . Se value è


una stringa, deve essere racchiusa tra sequenze di barre
rovesciate o virgolette ( \ ") anziché virgolette. Se non è
specificato un valore, è considerato True.

Commenti
L' -define opzione ha un effetto simile all'uso di una #Const direttiva per il preprocessore nel file di origine, ad
eccezione del fatto che le costanti definite con -define sono pubbliche e si applicano a tutti i file nel progetto.
È possibile usare i simboli creati mediante questa opzione con la direttiva #If ... Then ... #Else per eseguire la
compilazione condizionale dei file di origine.
-d è la versione abbreviata di -define .
È possibile definire più simboli con -define , separando le definizioni dei simboli con una virgola.

P ER IM P O STA RE- DEF IN E IN VISUA L ST UDIO IN T EGRAT ED DEVELO P M EN T EN VIRO N M EN T

1. è stato selezionato un progetto in Esplora soluzioni. Scegliere Proprietà dal menu Progetto .
2. fare clic sulla scheda Compila .
3. fare clic su Avanzate .
4. modificare il valore nella casella costanti personalizzate .

Esempio
Nel codice seguente sono definite e usate due costanti di compilazione condizionale.
' Vbc /define:DEBUGMODE=True,TRAPERRORS=False test.vb
Sub mysub()
#If debugmode Then
' Insert debug statements here.
MsgBox("debug mode")
#Else
' Insert default statements here.
#End If
End Sub

Vedi anche
Compilatore della riga di comando di Visual Basic
#If... Direttive then... #Else
#Const (direttiva)
Esempi di righe di comando di compilazione
-delaysign
05/03/2021 • 2 minutes to read • Edit Online

Specifica se l'assembly avrà firma completa o parziale.

Sintassi
-delaysign[+ | -]

Argomenti
+ | -
facoltativo. Utilizzare -delaysign- se si desidera che l'assembly abbia firma completa. Usare -delaysign+ se si
vuole inserire la chiave pubblica nell'assembly e lo spazio riservato per l'hash firmato. Il valore predefinito è
-delaysign- .

Commenti
L' -delaysign opzione non ha alcun effetto a meno che non venga usata con - filecontainer o-filecontainer.
Quando si richiede un assembly con firma completa, il compilatore genera un hash per il file contenente il
manifesto (i metadati dell'assembly) e firma tale hash con la chiave privata. La firma digitale risultante viene
archiviata nel file contenente il manifesto. Quando un assembly ha una firma ritardata, il compilatore non
calcola e archivia la firma, ma riserva spazio nel file in modo che la firma possa essere aggiunta in un secondo
momento.
Usando, ad esempio -delaysign+ , uno sviluppatore di un'organizzazione può distribuire le versioni di test
senza segno di un assembly che i tester possono registrare con il global assembly cache e usare. Al termine
dell'operazione sull'assembly, la persona responsabile della chiave privata dell'organizzazione può firmare
completamente l'assembly. Questo compartimentazione protegge la chiave privata dell'organizzazione dalla
divulgazione, consentendo a tutti gli sviluppatori di lavorare sugli assembly.
Per ulteriori informazioni sulla firma di un assembly , vedere Creazione e utilizzo di assembly Strong-Named .
Per impostare -delaysign in Visual Studio Integrated Development Environment
1. Selezionare un progetto in Esplora soluzioni . Scegliere Proprietà dal menu Progetto .
2. Fare clic sulla scheda Firma .
3. Impostare il valore nella casella solo firma ritardata .

Vedi anche
Compilatore della riga di comando di Visual Basic
-keyfile
-keycontainer
Esempi di righe di comando di compilazione
-deterministic
05/03/2021 • 3 minutes to read • Edit Online

Fa sì che il compilatore generi un assembly il cui output byte per byte è identico in tutte le compilazioni se si
usano input identici.

Sintassi
-deterministic

Osservazioni
Per impostazione predefinita, l'output del compilatore che deriva da un determinato set di input è univoco,
poiché il compilatore aggiunge un timestamp e un GUID generato da numeri casuali. L'opzione -deterministic
si usa per generare un assembly deterministico il cui contenuto binario è identico in tutte le compilazioni purché
l'input rimanga lo stesso.
Il compilatore considera i seguenti input al fine del determinismo:
La sequenza dei parametri della riga di comando.
Il contenuto del file di risposta del file RSP del compilatore.
La versione precisa del compilatore in uso e i relativi assembly di riferimento.
Il percorso della directory corrente.
Il contenuto binario di tutti i file passati in modo esplicito al compilatore direttamente o indirettamente, tra
cui:
File di origine
Assembly di riferimento
Moduli a cui viene fatto riferimento
Risorse
Il file di chiave con nome sicuro
@ file di risposta
Analizzatori
Set di regole
File aggiuntivi che possono essere usati dagli analizzatori
Le impostazioni cultura correnti (per la lingua in cui vengono generati la diagnostica e i messaggi di
eccezione).
La codifica predefinita (o la tabella codici corrente) se non è specificata la codifica.
L'esistenza, non esistenza e contenuto dei file nei percorsi di ricerca del compilatore (specificati, ad esempio,
da -lib o -recurse ).
La piattaforma CLR in cui viene eseguito il compilatore.
Il valore di %LIBPATH% , che può influenzare il caricamento delle dipendenze dell'analizzatore.
Quando le origini sono disponibili pubblicamente, la compilazione deterministica può essere usata per stabilire
se un file binario viene compilato da un'origine attendibile. Può anche essere utile in un sistema di compilazione
continua per determinare se è necessario eseguire le istruzioni di compilazione che dipendono dalle modifiche
apportate a un file binario.
Vedi anche
Compilatore della riga di comando di Visual Basic
Esempi di righe di comando di compilazione
-doc
05/03/2021 • 3 minutes to read • Edit Online

Elabora commenti sulla documentazione in un file XML.

Sintassi
-doc[+ | -]

oppure

-doc:file

Argomenti
T ERM IN E DEF IN IZ IO N E

+ | - facoltativo. Se si specifica +, o semplicemente -doc , il


compilatore genera informazioni di documentazione e le
inserisce in un file XML. La specifica di - equivale a non
specificare -doc , quindi non vengono create informazione
di documentazione.

file Richiesto se è usato -doc: . Specifica il file di output XML,


popolato con i commenti dai file del codice sorgente della
compilazione. Se il nome del file contiene uno spazio,
racchiudere il nome tra virgolette doppie (" ").

Commenti
L'opzione -doc controlla se il compilatore genera un file XML contenente i commenti della documentazione. Se
si usa la sintassi -doc:file , il parametro file specifica il nome del file XML. Se si usa -doc o -doc+ , il
compilatore ottiene il nome del file XML dal file eseguibile o dalla libreria che il compilatore sta creando. Se si
usa -doc- o non si specifica l'opzione -doc , il compilatore non crea un file XML.
Nei file di codice sorgente, i commenti della documentazione possono precedere le definizioni seguenti:
Tipi definiti dall'utente, ad esempio una classe o interfaccia
Membri, ad esempio un campo, un evento, una proprietà, una funzione oppure una subroutine.
Per usare il file XML generato con la funzionalità IntelliSense di Visual Studio, usare un nome per il file XML
uguale al nome dell'assembly che si vuole supportare. Assicurarsi che il file XML sia nella stessa directory
dell'assembly, in modo che quando si fa riferimento all'assembly nel progetto di Visual Studio, venga trovato
anche il file XML. I file di documentazione XML non sono necessari per il funzionamento di IntelliSense per il
codice all'interno di un progetto o all'interno di progetti a cui viene fatto riferimento da un progetto.
A meno che non si esegua la compilazione con -target:module , il file XML contiene i tag <assembly></assembly> .
Questi tag specificano il nome del file contenente il manifesto dell'assembly per il file di output della
compilazione.
Vedere Tag XML consigliati per i commenti relativi alla documentazione per informazioni su come generare
documentazione dai commenti nel codice.

P ER IM P O STA RE - DO C N EL L 'A M B IEN T E DI SVIL UP P O IN T EGRATO DI VISUA L ST UDIO

1. è stato selezionato un progetto in Esplora soluzioni. Scegliere Proprietà dal menu Progetto .
2. fare clic sulla scheda Compila .
3. impostare il valore nella casella genera file di documentazione XML .

Esempio
Vedere Documentazione del codice tramite XML per un esempio.

Vedi anche
Compilatore della riga di comando di Visual Basic
Documentazione del codice tramite XML
-errorreport
05/03/2021 • 4 minutes to read • Edit Online

Specifica il modo in cui il compilatore di Visual Basic deve segnalare gli errori interni del compilatore.

Sintassi
-errorreport:{ prompt | queue | send | none }

Osservazioni
Questa opzione offre un modo pratico per segnalare un errore interno del compilatore Visual Basic al team di
Visual Basic di Microsoft. Per impostazione predefinita, il compilatore non invia alcuna informazione a Microsoft.
Tuttavia, se si verifica un errore interno del compilatore, questa opzione consente di segnalare l'errore a
Microsoft. Tali informazioni consentiranno ai tecnici Microsoft di identificare la cause e possono contribuire a
migliorare la prossima versione di Visual Basic.
La capacità di un utente di inviare i report dipende dalle autorizzazioni dei criteri utente e del computer.
Nella tabella seguente sono riepilogati gli effetti dell' -errorreport opzione.

O P Z IO N E C O M P O RTA M EN TO

prompt Se si verifica un errore interno del compilatore, viene


visualizzata una finestra di dialogo in cui è possibile
visualizzare i dati esatti raccolti dal compilatore. È possibile
determinare se nel report degli errori sono presenti
informazioni riservate e decidere se inviarle a Microsoft. Se si
decide di inviarlo e le impostazioni dei criteri utente e del
computer lo consentono, il compilatore invia i dati a
Microsoft.

queue Accoda la segnalazione errori. Quando si esegue l'accesso


con privilegi di amministratore, è possibile segnalare
eventuali errori dall'ultima volta che è stato effettuato
l'accesso. non verrà richiesto di inviare i report per gli errori
più di una volta ogni tre giorni. Si tratta del comportamento
predefinito quando l' -errorreport opzione non è
specificata.

send Se si verifica un errore interno del compilatore e le


impostazioni dei criteri utente e del computer lo consentono,
il compilatore invia i dati a Microsoft.

L'opzione -errorreport:send tenta di inviare


automaticamente le informazioni sugli errori a Microsoft se
la creazione di report è abilitata dalle impostazioni di sistema
segnalazione errori Windows .

none Se si verifica un errore interno del compilatore, non verrà


raccolto né inviato a Microsoft.

Il compilatore invia i dati che includono lo stack al momento dell'errore, che in genere include un codice
sorgente. Se -errorreport viene usato con l'opzione -bugreport ( , viene inviato l'intero file di origine.
Questa opzione è ideale per l'uso con l'opzione -bugreport ( , perché consente ai tecnici Microsoft di riprodurre
più facilmente l'errore.

NOTE
L' -errorreport opzione non è disponibile nell'ambiente di sviluppo di Visual Studio. è disponibile solo quando si esegue
la compilazione dalla riga di comando.

Esempio
Il codice seguente tenta di compilare T2.vb e se il compilatore rileva un errore interno del compilatore, viene
richiesto di inviare la segnalazione di errore a Microsoft.

vbc -errorreport:prompt t2.vb

Vedi anche
Compilatore della riga di comando di Visual Basic
Esempi di righe di comando di compilazione
-bugreport
-filealign
05/03/2021 • 2 minutes to read • Edit Online

Specifica la posizione di allineamento per le sezioni del file di output.

Sintassi
-filealign:number

Argomenti
number
Obbligatorio. Valore che specifica l'allineamento delle sezioni nel file di output. I valori validi sono 512, 1024,
2048, 4096 e 8192. I valori sono in byte.

Commenti
È possibile usare l' -filealign opzione per specificare l'allineamento delle sezioni nel file di output. Le sezioni
sono blocchi di memoria contigua in un file eseguibile portabile (PE) che contiene il codice o i dati. L'
-filealign opzione consente di compilare l'applicazione con un allineamento non standard. la maggior parte
degli sviluppatori non è necessario utilizzare questa opzione.
Ogni sezione è allineata a un limite che corrisponde a un multiplo del -filealign valore. Non vi è alcun valore
predefinito fisso. Se -filealign non viene specificato, il compilatore sceglie un valore predefinito in fase di
compilazione.
Specificando le dimensioni della sezione, è possibile modificare le dimensioni del file di output. La modifica delle
dimensioni della sezione può essere utile per i programmi che verranno eseguiti su dispositivi di piccole
dimensioni.

NOTE
L' -filealign opzione non è disponibile nell'ambiente di sviluppo di Visual Studio. è disponibile solo quando si esegue la
compilazione dalla riga di comando.

Vedi anche
Compilatore della riga di comando di Visual Basic
-help, -? (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Visualizza le opzioni del compilatore.

Sintassi
-help

oppure

-?

Commenti
Se si include questa opzione in una compilazione, non viene creato alcun file di output e non si verifica alcuna
compilazione.

NOTE
L' -help opzione non è disponibile nell'ambiente di sviluppo di Visual Studio. è disponibile solo quando si esegue la
compilazione dalla riga di comando.

Esempio
Il codice seguente Visualizza la guida dalla riga di comando.

vbc -help

Vedi anche
Compilatore della riga di comando di Visual Basic
Esempi di righe di comando di compilazione
-highentropyva (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Indica se un eseguibile a 64 bit o un eseguibile contrassegnato dall'opzione del compilatore -Platform: anycpu
supporta la sequenza casuale del layout dello spazio degli indirizzi a entropia elevata (ASLR).

Sintassi
-highentropyva[+ | -]

Argomenti
+ | -
facoltativo. L'opzione è disattivata per impostazione predefinita o se si specifica -highentropyva- . L'opzione è
attiva se si specifica -highentropyva o -highentropyva+ .

Commenti
Se si specifica questa opzione, le versioni compatibili del kernel di Windows possono usare livelli di entropia più
elevati quando il kernel esegue in modo casuale il layout dello spazio degli indirizzi di un processo come parte
di ASLR. Se il kernel usa livelli di entropia più elevati, è possibile allocare un numero maggiore di indirizzi alle
aree di memoria quali stack e heap. Di conseguenza, è più difficile indovinare la posizione di una determinata
area di memoria.
Quando l'opzione è impostata su on, l'eseguibile di destinazione e tutti i moduli da cui dipende devono essere in
grado di gestire valori di puntatore maggiori di 4 gigabyte (GB) quando tali moduli sono in esecuzione come
processi a 64 bit.

Vedi anche
Compilatore della riga di comando di Visual Basic
Esempi di righe di comando di compilazione
-Imports (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Importa gli spazi dei nomi da un assembly specificato.

Sintassi
-imports:namespaceList

Argomenti
T ERM IN E DEF IN IZ IO N E

namespaceList Obbligatorio. Elenco delimitato da virgole di spazi dei nomi


da importare.

Commenti
L' -imports opzione importa qualsiasi spazio dei nomi definito all'interno del set di file di origine corrente o da
qualsiasi assembly a cui si fa riferimento.
I membri in uno spazio dei nomi specificato con -imports sono disponibili per tutti i file del codice sorgente
nella compilazione. Usare l' istruzione Imports (tipo e spazio dei nomi .NET) per usare uno spazio dei nomi in un
unico file del codice sorgente.

P ER IM P O STA RE- IM P O RT S IN VISUA L ST UDIO IN T EGRAT ED DEVELO P M EN T EN VIRO N M EN T

1. è stato selezionato un progetto in Esplora soluzioni. Scegliere Proprietà dal menu Progetto .
2. fare clic sulla scheda riferimenti .
3. Immettere il nome dello spazio dei nomi nella casella accanto al pulsante Aggiungi impor tazione utente .
4. fare clic sul pulsante Aggiungi impor tazione utente .

Esempio
Il codice seguente viene compilato quando -imports:system.globalization si specifica. In caso contrario, la
compilazione riuscita richiede l' Imports System.Globalization inclusione di un'istruzione all'inizio del file di
codice sorgente o che la proprietà sia completamente qualificata come
System.Globalization.CultureInfo.CurrentCulture.Name .

Module Example
Public Sub Main()
Console.WriteLine($"The current culture is {CultureInfo.CurrentCulture.Name}")
End Sub
End Module

Vedi anche
Compilatore della riga di comando di Visual Basic
Riferimenti e istruzione Imports
Esempi di righe di comando di compilazione
-keycontainer
05/03/2021 • 2 minutes to read • Edit Online

Specifica il nome di un contenitore di chiavi per una coppia di chiavi allo scopo di assegnare a un assembly un
nome sicuro.

Sintassi
-keycontainer:container

Argomenti
T ERM IN E DEF IN IZ IO N E

container Obbligatorio. File contenitore contenente la chiave.


Racchiudere il nome file tra virgolette ("") se il nome contiene
uno spazio.

Commenti
Il compilatore crea il componente condivisibile inserendo una chiave pubblica nel manifesto dell'assembly e
firmando l'assembly finale con la chiave privata. Per generare un file di chiave, digitare sn -k file nella riga di
comando. L' -i opzione installa la coppia di chiavi in un contenitore. Per ulteriori informazioni, vedere Sn.exe
(strumento nome sicuro).
Se si esegue la compilazione con -target:module , il nome del file di chiave viene mantenuto nel modulo e
incorporato nell'assembly creato quando si compila un assembly con -addmodule.
Questa opzione può essere specificata anche come attributo personalizzato AssemblyKeyNameAttribute nel
codice sorgente di qualsiasi modulo MSIL (Microsoft Intermediate Language).
È possibile passare al compilatore le informazioni di crittografia anche tramite -keyfile. Usare -delaysign se si
vuole un assembly con firma parziale.
Per ulteriori informazioni sulla firma di un assembly , vedere Creazione e utilizzo di assembly Strong-Named .

NOTE
L' -keycontainer opzione non è disponibile nell'ambiente di sviluppo di Visual Studio. è disponibile solo quando si
esegue la compilazione dalla riga di comando.

Esempio
Il codice seguente compila il file Input.vb di origine e specifica un contenitore di chiavi.

vbc -keycontainer:key1 input.vb


Vedi anche
Assembly in .NET
Compilatore della riga di comando di Visual Basic
-keyfile
Esempi di righe di comando di compilazione
-keyfile
05/03/2021 • 3 minutes to read • Edit Online

Specifica un file contenente una chiave o una coppia di chiavi allo scopo di assegnare a un assembly un nome
sicuro.

Sintassi
-keyfile:file

Argomenti
file
Obbligatorio. File contenente la chiave. Se il nome del file contiene uno spazio, racchiudere il nome tra virgolette
("").

Commenti
Il compilatore inserisce la chiave pubblica nel manifesto dell'assembly e quindi firma l'assembly finale con la
chiave privata. Per generare un file di chiave, digitare sn -k file nella riga di comando. Per ulteriori
informazioni, vedere Sn.exe (strumento nome sicuro).
Se si esegue la compilazione con -target:module , il nome del file di chiave viene mantenuto nel modulo e
incorporato nell'assembly creato quando si compila un assembly con -addmodule.
È possibile passare al compilatore le informazioni di crittografia anche tramite -keycontainer. Usare -delaysign
se si vuole un assembly con firma parziale.
È possibile specificare questa opzione anche come attributo personalizzato ( AssemblyKeyFileAttribute ) nel
codice sorgente di qualsiasi modulo Microsoft Intermediate Language.
Se -keyfile nella stessa compilazione vengono specificati sia che -key container (per opzione della riga di
comando o attributo personalizzato), il compilatore tenta prima di tutto il contenitore di chiavi. Se l'operazione
riesce, l'assembly viene firmato con le informazioni incluse nel contenitore di chiavi. Se il compilatore non trova
il contenitore di chiavi, tenta il file specificato con -keyfile . Se l'operazione ha esito positivo, l'assembly viene
firmato con le informazioni contenute nel file di chiave e le informazioni sulla chiave vengono installate nel
contenitore di chiavi (simile a sn -i ) in modo che nella compilazione successiva il contenitore di chiavi sarà
valido.
Si noti che un file di chiave può contenere solo la chiave pubblica.
Per ulteriori informazioni sulla firma di un assembly , vedere Creazione e utilizzo di assembly Strong-Named .

NOTE
L' -keyfile opzione non è disponibile nell'ambiente di sviluppo di Visual Studio. è disponibile solo quando si esegue la
compilazione dalla riga di comando.

Esempio
Il codice seguente compila il file Input.vb di origine e specifica un file di chiave.

vbc -keyfile:myfile.sn input.vb

Vedi anche
Assembly in .NET
Compilatore della riga di comando di Visual Basic
-Reference (Visual Basic)
Esempi di righe di comando di compilazione
-langversion (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Fa in modo che il compilatore accetti solo la sintassi inclusa nella versione della lingua Visual Basic specificata.

Sintassi
-langversion:version

Argomenti
version
Obbligatorio. La versione del linguaggio da utilizzare durante la compilazione. I valori accettati sono 9 ,, 10
11 , 12 , 14 , 15 , 15.3 , 15.5 , 16 default e latest .

I numeri interi possono essere specificati anche usando .0 come versione secondaria, ad esempio 11.0 .
È possibile visualizzare l'elenco di tutti i valori possibili specificando -langversion:? nella riga di comando.

Commenti
L' -langversion opzione specifica la sintassi accettata dal compilatore. Se, ad esempio, si specifica che la
versione del linguaggio è 9,0, il compilatore genera errori per la sintassi valida solo nella versione 10,0 e
successive.
È possibile utilizzare questa opzione quando si sviluppano applicazioni destinate a versioni diverse del .NET
Framework. Ad esempio, se la destinazione è .NET Framework 3,5, è possibile usare questa opzione per
assicurarsi di non usare la sintassi della versione 10,0 del linguaggio.
È possibile impostare -langversion direttamente solo tramite la riga di comando. Per ulteriori informazioni,
vedere la pagina relativa alla destinazione di una specifica .NET Framework versione.

Esempio
Il codice seguente viene compilato sample.vb per Visual Basic 9,0.

vbc -langversion:9.0 sample.vb

Vedi anche
Compilatore della riga di comando di Visual Basic
Esempi di righe di comando di compilazione
-libpath
05/03/2021 • 2 minutes to read • Edit Online

Specifica il percorso degli assembly a cui si fa riferimento.

Sintassi
-libpath:dirList

Argomenti
T ERM IN E DEF IN IZ IO N E

dirList Obbligatorio. Elenco delimitato da punti e virgola di


directory per il compilatore da cercare se un assembly a cui
si fa riferimento non viene trovato nella directory di lavoro
corrente (la directory da cui si richiama il compilatore) o nella
directory di sistema del Common Language Runtime. Se il
nome della directory contiene uno spazio, racchiudere il
nome tra virgolette ("").

Commenti
L' -libpath opzione specifica il percorso degli assembly a cui fa riferimento l'opzione -Reference .
La ricerca dei riferimenti non completi agli assembly viene operata nell'ordine seguente:
1. Directory di lavoro corrente, ovvero la directory da cui viene chiamato il compilatore.
2. Directory di sistema di Common Language Runtime.
3. Directory specificate da -libpath .
4. Directory specificate dalla variabile di ambiente LIB.
L' -libpath opzione è additiva, che viene specificata più di una volta in aggiunta a qualsiasi valore precedente.
Usare -reference per specificare un riferimento a un assembly.

P ER IM P O STA RE- L IB PAT H IN VISUA L ST UDIO IN T EGRAT ED DEVELO P M EN T EN VIRO N M EN T

1. è stato selezionato un progetto in Esplora soluzioni. Scegliere Proprietà dal menu Progetto .
2. fare clic sulla scheda riferimenti .
3. fare clic sul pulsante Percorsi riferimento... .
4. nella finestra di dialogo Percorsi riferimento immettere il nome della directory nella casella car tella: .
5. fare clic su Aggiungi car tella .

Esempio
Il codice seguente esegue la compilazione T2.vb per creare un file con estensione exe. Il compilatore cerca nella
directory di lavoro, nella directory radice dell'unità C: e nella nuova directory degli assembly dell'unità C: per i
riferimenti all'assembly.
vbc -libpath:c:\;"c:\New Assemblies" -reference:t2.dll t2.vb

Vedi anche
Assembly in .NET
Compilatore della riga di comando di Visual Basic
Esempi di righe di comando di compilazione
-collegamento (Visual Basic)
05/03/2021 • 7 minutes to read • Edit Online

Indica al compilatore di rendere disponibili al progetto in fase di compilazione le informazioni sui tipi COM
presenti negli assembly specificati.

Sintassi
-link:fileList

oppure

-l:fileList

Argomenti
T ERM IN E DEF IN IZ IO N E

fileList Obbligatorio. Elenco di nomi di file di assembly delimitato da


virgole. Se il nome del file contiene uno spazio, racchiudere il
nome tra virgolette.

Commenti
L'opzione -link consente di distribuire un'applicazione in cui sono incorporate informazioni sul tipo.
L'applicazione può quindi usare i tipi in un assembly di runtime che implementano le informazioni sul tipo
incorporate senza dovere far riferimento all'assembly di runtime. Se vengono pubblicate diverse versioni
dell'assembly di runtime, l'applicazione che contiene le informazioni sul tipo incorporate può funzionare con le
diverse versioni senza che sia necessaria la ricompilazione. Per un esempio, vedere Procedura dettagliata:
incorporamento dei tipi da assembly gestiti.
L'opzione -link è particolarmente utile quando si usa l'interoperabilità COM. È possibile incorporare tipi COM
in modo che per l'applicazione non sia più necessario un assembly di interoperabilità primario nel computer di
destinazione. L'opzione -link indica al compilatore di incorporare le informazioni sul tipo COM dall'assembly
di interoperabilità a cui si fa riferimento nel codice compilato risultante. Il tipo COM viene identificato dal valore
CLSID (GUID). Di conseguenza, l'applicazione può essere eseguita in un computer di destinazione in cui sono
stati installati gli stessi tipi COM con gli stessi valori CLSID. Le applicazioni che consentono di automatizzare
Microsoft Office costituiscono un valido esempio. Poiché applicazioni come Office mantengono in genere lo
stesso valore CLSID in versioni diverse, l'applicazione può usare i tipi COM a cui si fa riferimento purché .NET
Framework 4 o versioni successive sia installato nel computer di destinazione e l'applicazione usi metodi,
proprietà o eventi inclusi nei tipi COM a cui si fa riferimento.
L'opzione -link incorpora solo interfacce, strutture e delegati. L'incorporamento di classi COM non è
supportato.
NOTE
Quando si crea un'istanza di un tipo COM incorporato nel codice, è necessario creare l'istanza usando l'interfaccia
appropriata. Il tentativo di creare un'istanza di un tipo COM incorporato usando la coclasse genera un errore.

Per impostare l'opzione -link in Visual Studio, aggiungere un riferimento all'assembly e impostare la proprietà
Embed Interop Types su true . Il valore predefinito della proprietà Embed Interop Types è false .

Se si collega a un assembly COM (assembly A) che fa riferimento a un altro assembly COM (assembly B), è
necessario eseguire il collegamento anche all'assembly B se si verifica una delle condizioni seguenti:
Un tipo dell'assembly A eredita da un tipo o implementa un'interfaccia dall'assembly B.
Viene richiamato un campo, una proprietà, un evento o un metodo che presenta un tipo restituito o un
tipo di parametro proveniente dall'assembly B.
Usare -LIBPATH per specificare la directory in cui si trova uno o più riferimenti ad assembly.
Analogamente all'opzione del compilatore -Reference , l' -link opzione del compilatore usa il file di risposta
vbc. rsp, che fa riferimento a assembly .NET Framework di uso frequente. Usare l'opzione del compilatore -
noconfig se non si vuole che il compilatore usi il file Vbc. rsp.
La forma breve di -link è -l .

Generics e tipi incorporati


Nelle sezioni seguenti vengono descritte le limitazioni all'uso di tipi generici in applicazioni che incorporano tipi
di interoperabilità.
Interfacce generiche
Le interfacce generiche incorporate da un assembly di interoperabilità non possono essere usate, come illustrato
nell'esempio seguente.

' The following code causes an error if ISampleInterface is an embedded interop type.
Dim sample As ISampleInterface(Of SampleType)

Tipi con parametri generici


I tipi che hanno un parametro generico il cui tipo è incorporato da un assembly di interoperabilità non possono
essere usati se tale tipo proviene da un assembly esterno. Tale restrizione non si applica tuttavia alle interfacce.
Si consideri ad esempio l'interfaccia Range definita nell'assembly Microsoft.Office.Interop.Excel. Se una libreria
incorpora tipi di interoperabilità dall'assembly Microsoft.Office.Interop.Excel ed espone un metodo che
restituisce un tipo generico che ha un parametro il cui tipo è l'interfaccia Range, il metodo deve restituire
un'interfaccia generica, come illustrato nell'esempio di codice seguente.

Imports System.Collections.Generic
Imports Microsoft.Office.Interop.Excel

Class Utility
' The following code causes an error when called by a client assembly.
Public Function GetRange1() As List(Of Range)
End Function

' The following code is valid for calls from a client assembly.
Public Function GetRange2() As IList(Of Range)

End Function
End Class

Nell'esempio seguente, il codice client può chiamare il metodo che restituisce l'interfaccia generica IList senza
errori.

Module Client
Public Sub Main()
Dim util As New Utility()

' The following code causes an error.


Dim rangeList1 As List(Of Range) = util.GetRange1()

' The following code is valid.


Dim rangeList2 As List(Of Range) = CType(util.GetRange2(), List(Of Range))
End Sub
End Module

Esempio
La riga di comando seguente compila il file di origine OfficeApp.vb e gli assembly di riferimento da
COMData1.dll e COMData2.dll per produrre OfficeApp.exe .

vbc -link:COMData1.dll,COMData2.dll -out:OfficeApp.exe OfficeApp.vb

Vedi anche
Compilatore della riga di comando di Visual Basic
Procedura dettagliata: incorporamento dei tipi da assembly gestiti
-Reference (Visual Basic)
-noconfig
-LIBPATH
Esempi di righe di comando di compilazione
Introduzione all'interoperabilità COM
-linkresource ((Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Crea un collegamento a una risorsa gestita.

Sintassi
-linkresource:filename[,identifier[,public|private]]

oppure

-linkres:filename[,identifier[,public|private]]

Argomenti
filename
Obbligatorio. File di risorse da collegare all'assembly. Se il nome del file contiene uno spazio, racchiudere il
nome tra virgolette ("").
identifier
facoltativo. Nome logico della risorsa. Nome usato per caricare la risorsa. L'impostazione predefinita
corrisponde al nome del file. Facoltativamente, è possibile specificare se il file è pubblico o privato nel manifesto
dell'assembly, ad esempio: -linkres:filename.res,myname.res,public . Per impostazione predefinita, filename è
Public nell'assembly.

Commenti
L' -linkresource opzione non incorpora il file di risorse nel file di output. utilizzare l' -resource opzione per
eseguire questa operazione.
L' -linkresource opzione richiede una delle -target opzioni diverse da -target:module .
Se filename è un file di risorse .NET Framework creato, ad esempio dal Resgen.exe (Generatore di file di risorse)
o nell'ambiente di sviluppo, è possibile accedervi con membri nello System.Resources spazio dei nomi. Per
ulteriori informazioni, vedere ResourceManager . Per accedere a tutte le altre risorse in fase di esecuzione, usare
i metodi che iniziano con GetManifestResource nella Assembly classe.
Il nome del file può essere qualsiasi formato di file. Può ad esempio risultare opportuno rendere una DLL nativa
parte dell'assembly in modo che possa essere installata nella Global Assembly Cache e che sia possibile
accedervi dal codice gestito nell'assembly.
La forma breve di -linkresource è -linkres .

NOTE
L' -linkresource opzione non è disponibile nell'ambiente di sviluppo di Visual Studio. è disponibile solo quando si
esegue la compilazione dalla riga di comando.
Esempio
Il codice seguente compila in.vb e collega a un file di risorse rf.resource .

vbc -linkresource:rf.resource in.vb

Vedi anche
Compilatore della riga di comando di Visual Basic
-target (Visual Basic)
-Resource (Visual Basic)
Esempi di righe di comando di compilazione
-main
05/03/2021 • 2 minutes to read • Edit Online

Specifica la classe o il modulo che contiene la procedura Sub Main .

Sintassi
-main:location

Argomenti
location
Obbligatorio. Nome della classe o del modulo che contiene la Sub Main stored procedure da chiamare all'avvio
del programma. Il formato può essere Main: module o -Main: Namespace. Module .

Commenti
Usare questa opzione quando si crea un file eseguibile o un programma eseguibile di Windows. Se l'opzione -
Main viene omessa, il compilatore cerca una condivisione valida Sub Main in tutti i moduli e le classi pubbliche.
Per una descrizione delle diverse forme della procedura, vedere la procedura principale in Visual Basic Main .
Quando location è una classe che eredita da Form , il compilatore fornisce una Main routine predefinita che
avvia l'applicazione se la classe non ha Main routine. In questo modo è possibile compilare il codice dalla riga di
comando creata nell'ambiente di sviluppo.

' Compile with /r:System.dll,SYSTEM.WINDOWS.FORMS.DLL /main:MyC


Public Class MyC
Inherits System.Windows.Forms.Form
End Class

Per impostare -Main in Visual Studio Integrated Development Environment


1. Selezionare un progetto in Esplora soluzioni . Scegliere Proprietà dal menu Progetto .
2. Fare clic sulla scheda Applicazione .
3. Verificare che la casella di controllo Abilita framework applicazione non sia selezionata.
4. Modificare il valore nella casella oggetto di avvio .

Esempio
Il codice seguente compila T2.vb e T3.vb , specificando che la Sub Main stored procedure verrà trovata nella
Test2 classe.

vbc t2.vb t3.vb -main:Test2

Vedi anche
Compilatore della riga di comando di Visual Basic
-target (Visual Basic)
Esempi di righe di comando di compilazione
Routine Main in Visual Basic
-moduleassemblyname
05/03/2021 • 2 minutes to read • Edit Online

Specifica il nome dell'assembly di cui fa parte il modulo.

Sintassi
-moduleassemblyname:assembly_name

Argomenti
T ERM IN E DEF IN IZ IO N E

assembly_name Nome dell'assembly di cui questo modulo farà parte.

Commenti
Il compilatore elabora l' -moduleassemblyname opzione solo se -target:module è stata specificata l'opzione. In
questo modo il compilatore crea un modulo. Il modulo creato dal compilatore è valido solo per l'assembly
specificato con l' -moduleassemblyname opzione. Se si inserisce il modulo in un assembly diverso, si
verificheranno errori di run-time.
L' -moduleassemblyname opzione è necessaria solo quando sono soddisfatte le condizioni seguenti:
Un tipo di dati nel modulo deve accedere a un Friend tipo in un assembly a cui si fa riferimento.
L'assembly a cui si fa riferimento ha concesso l'accesso dell'assembly Friend all'assembly in cui verrà
compilato il modulo.
Per ulteriori informazioni sulla creazione di un modulo, vedere -target (Visual Basic). Per ulteriori informazioni
sugli assembly Friend, vedere assembly Friend.

NOTE
L' -moduleassemblyname opzione non è disponibile nell'ambiente di sviluppo di Visual Studio. è disponibile solo quando
si compila da un prompt dei comandi.

Vedi anche
Procedura: compilare un assembly su più file
Compilatore della riga di comando di Visual Basic
-target (Visual Basic)
-principale
-Reference (Visual Basic)
-addmodule
Assembly in .NET
Esempi di righe di comando di compilazione
Assembly Friend
-netcf
05/03/2021 • 4 minutes to read • Edit Online

Imposta il compilatore in modo che abbia come destinazione la .NET Compact Framework.

Sintassi
-netcf

Osservazioni
L' -netcf opzione fa sì che il compilatore di Visual Basic faccia riferimento al .NET Compact Framework anziché
al .NET Framework completo. La funzionalità del linguaggio presente solo nella .NET Framework completa è
disabilitata.
L' -netcf opzione è progettata per essere usata con -sdkpath (. Le funzionalità del linguaggio disabilitate da
-netcf sono le stesse funzionalità del linguaggio non presenti nei file assegnati a -sdkpath .

NOTE
L' -netcf opzione non è disponibile nell'ambiente di sviluppo di Visual Studio. è disponibile solo quando si esegue la
compilazione dalla riga di comando. L' -netcf opzione viene impostata quando viene caricato un progetto Visual Basic
dispositivo.

L' -netcf opzione modifica le funzionalità del linguaggio seguenti:


La parola chiave <keyword> Statement end , che termina l'esecuzione di un programma, è disabilitata. Il
programma seguente compila ed esegue senza -netcf ma ha esito negativo in fase di compilazione con
-netcf .

Module Module1
Sub Main()
End ' not valid to terminate execution with /netcf
End Sub
End Module

L'associazione tardiva, in tutti i form, è disabilitata. Gli errori in fase di compilazione vengono generati
quando si rilevano scenari di associazione tardiva riconosciuti. Il programma seguente compila ed esegue
senza -netcf ma ha esito negativo in fase di compilazione con -netcf .
Class LateBoundClass
Sub S1()
End Sub

Default Property P1(ByVal s As String) As Integer


Get
End Get
Set(ByVal Value As Integer)
End Set
End Property
End Class

Module Module1
Sub Main()
Dim o1 As Object
Dim o2 As Object
Dim o3 As Object
Dim IntArr(3) As Integer

o1 = New LateBoundClass
o2 = 1
o3 = IntArr

' Late-bound calls


o1.S1()
o1.P1("member") = 1

' Dictionary member access


o1!member = 1

' Late-bound overload resolution


LateBoundSub(o2)

' Late-bound array


o3(1) = 1
End Sub

Sub LateBoundSub(ByVal n As Integer)


End Sub

Sub LateBoundSub(ByVal s As String)


End Sub
End Module

I modificatori auto, ANSIe Unicode sono disabilitati. La sintassi dell' istruzione Declare viene inoltre
modificata in Declare Sub|Function name Lib "library" [Alias "alias"] [([arglist])] . Nel codice
seguente viene illustrato l'effetto di -netcf su una compilazione.

' compile with: /target:library


Module Module1
' valid with or without /netcf
Declare Sub DllSub Lib "SomeLib.dll" ()

' not valid with /netcf


Declare Auto Sub DllSub1 Lib "SomeLib.dll" ()
Declare Ansi Sub DllSub2 Lib "SomeLib.dll" ()
Declare Unicode Sub DllSub3 Lib "SomeLib.dll" ()
End Module

L'uso di Visual Basic parole chiave 6,0 che sono state rimosse da Visual Basic genera un errore diverso
quando -netcf si usa. Ciò influiscono sui messaggi di errore per le parole chiave seguenti:
Open
Close

Put

Print

Write

Input

Lock

Unlock

Seek

Width

Name

FreeFile

EOF

Loc

LOF

Line

Esempio
Il codice seguente viene compilato Myfile.vb con il .NET Compact Framework, usando le versioni di
mscorlib.dll e Microsoft.VisualBasic.dll disponibili nella directory di installazione predefinita del .NET Compact
Framework nell'unità C. In genere, si utilizzerà la versione più recente del .NET Compact Framework.

vbc -netcf -sdkpath:"c:\Program Files\Microsoft Visual Studio .NET


2003\CompactFrameworkSDK\v1.0.5000\Windows CE " myfile.vb

Vedi anche
Compilatore della riga di comando di Visual Basic
Esempi di righe di comando di compilazione
-sdkpath
-noconfig
05/03/2021 • 2 minutes to read • Edit Online

Specifica che il compilatore non deve fare riferimento automaticamente agli assembly .NET Framework di uso
comune o importare gli System Microsoft.VisualBasic spazi dei nomi e.

Sintassi
-noconfig

Osservazioni
L' -noconfig opzione indica al compilatore di non compilare con il file Vbc. rsp, che si trova nella stessa
directory del file Vbc.exe. Il file Vbc. rsp fa riferimento agli assembly di .NET Framework di uso comune e
importa gli System Microsoft.VisualBasic spazi dei nomi e. Il compilatore fa riferimento in modo implicito
all'assembly System.dll a meno che non -nostdlib venga specificata l'opzione. L' -nostdlib opzione indica al
compilatore di non eseguire la compilazione con Vbc. rsp o di fare automaticamente riferimento all'assembly
System.dll.

NOTE
Viene sempre fatto riferimento agli assembly Mscorlib.dll e Microsoft.VisualBasic.dll.

È possibile modificare il file Vbc. rsp per specificare altre opzioni del compilatore da includere in ogni
compilazione di Vbc.exe, tranne quando si specifica l' -noconfig opzione. Per ulteriori informazioni, vedere @
(specificare il file di risposta).
Il compilatore elabora le opzioni passate al vbc comando per ultimo. Pertanto, qualsiasi opzione nella riga di
comando esegue l'override dell'impostazione della stessa opzione nel file Vbc. rsp.

NOTE
L' -noconfig opzione non è disponibile nell'ambiente di sviluppo di Visual Studio. è disponibile solo quando si esegue la
compilazione dalla riga di comando.

Vedi anche
-nostdlib (Visual Basic)
Compilatore della riga di comando di Visual Basic
@ (Specifica di un file di risposta)
-Reference (Visual Basic)
-nologo (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Evita la visualizzazione del banner sul copyright e dei messaggi informativi durante la compilazione.

Sintassi
-nologo

Osservazioni
Se si specifica -nologo , il compilatore non visualizza un banner sul copyright. Per impostazione predefinita,
l'opzione -nologo non è attiva.

NOTE
L' -nologo opzione non è disponibile nell'ambiente di sviluppo di Visual Studio. è disponibile solo quando si esegue la
compilazione dalla riga di comando.

Esempio
Il codice seguente compila T2.vb e non visualizza un banner sul copyright.

vbc -nologo t2.vb

Vedi anche
Compilatore della riga di comando di Visual Basic
Esempi di righe di comando di compilazione
-nostdlib (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Fa in modo che il compilatore non faccia automaticamente riferimento alle librerie standard.

Sintassi
-nostdlib

Osservazioni
L' -nostdlib opzione rimuove il riferimento automatico all'assembly System.dll e impedisce al compilatore di
leggere il file Vbc. rsp. Il file Vbc. rsp, che si trova nella stessa directory del file Vbc.exe, fa riferimento agli
assembly .NET Framework di uso comune e importa gli System Microsoft.VisualBasic spazi dei nomi e.

NOTE
Viene sempre fatto riferimento agli assembly Mscorlib.dll e Microsoft.VisualBasic.dll.

NOTE
L' -nostdlib opzione non è disponibile nell'ambiente di sviluppo di Visual Studio. è disponibile solo quando si esegue la
compilazione dalla riga di comando.

Esempio
Il codice seguente viene compilato T2.vb senza fare riferimento alle librerie standard. Per rimuovere l'oggetto,
è necessario impostare la _MYTYPE costante di compilazione condizionale sulla stringa "Empty" My .

vbc -nostdlib -define:_MYTYPE=\"Empty\" T2.vb

Vedi anche
-noconfig
Compilatore della riga di comando di Visual Basic
Esempi di righe di comando di compilazione
Personalizzazione degli oggetti disponibili in My
-nowarn
05/03/2021 • 2 minutes to read • Edit Online

Inibisce la capacità del compilatore di generare avvisi.

Sintassi
-nowarn[:numberList]

Argomenti
T ERM IN E DEF IN IZ IO N E

numberList facoltativo. Elenco delimitato da virgole dei numeri di ID


avviso che il compilatore deve escludere. Se gli ID avviso non
vengono specificati, vengono eliminati tutti gli avvisi.

Commenti
L' -nowarn opzione fa sì che il compilatore non generi avvisi. Per escludere un singolo avviso, fornire l'ID avviso
all' -nowarn opzione che segue i due punti. Separare più numeri di avviso con virgole.
È necessario specificare solo la parte numerica dell'identificatore di avviso. Se ad esempio si desidera disattivare
BC42024, viene visualizzato l'avviso relativo alle variabili locali non utilizzate -nowarn:42024 .
Per ulteriori informazioni sui numeri ID avviso, vedere Configuring Warnings in Visual Basic.

P ER IM P O STA RE- N O WA RN IN VISUA L ST UDIO IN T EGRAT ED DEVELO P M EN T EN VIRO N M EN T

1. è stato selezionato un progetto in Esplora soluzioni. Scegliere Proprietà dal menu Progetto .
2. fare clic sulla scheda Compila .
3. Selezionare la casella di controllo Disabilita tutti gli avvisi per disabilitare tutti gli avvisi.
- oppure -
Per disabilitare un avviso particolare, fare clic su nessuno nell'elenco a discesa accanto all'avviso.

Esempio
Il codice seguente compila T2.vb e non visualizza alcun avviso.

vbc -nowarn t2.vb

Esempio
Il codice seguente compila T2.vb e non Visualizza gli avvisi per le variabili locali non usate (42024).

vbc -nowarn:42024 t2.vb


Vedi anche
Compilatore della riga di comando di Visual Basic
Esempi di righe di comando di compilazione
Configuring Warnings in Visual Basic
-nowin32manifest (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Indica al compilatore di non incorporare un manifesto dell'applicazione nel file eseguibile.

Sintassi
-nowin32manifest

Osservazioni
Quando viene usata questa opzione, l'applicazione è soggetta a virtualizzazione in Windows Vista a meno che
non venga specificato un manifesto dell'applicazione in un file di risorsa Win32 file o durante una istruzione di
compilazione successiva. Per altre informazioni sulla virtualizzazione, vedere Distribuzione ClickOnce in
Windows Vista.
Per altre informazioni sulla creazione di manifesti, vedere -win32manifest (Visual Basic).

Vedi anche
Compilatore della riga di comando di Visual Basic
Application Page, Project Designer (Visual Basic)
-optimize
05/03/2021 • 2 minutes to read • Edit Online

Abilita o Disabilita le ottimizzazioni del compilatore.

Sintassi
-optimize[ + | - ]

Argomenti
T ERM IN E DEF IN IZ IO N E

+ | - facoltativo. L' -optimize- opzione Disabilita le


ottimizzazioni del compilatore. L' -optimize+ opzione
consente le ottimizzazioni. Per impostazione predefinita, le
ottimizzazioni sono disabilitate.

Commenti
Le ottimizzazioni del compilatore consentono di ridurre le dimensioni del file di output rendendolo più veloce ed
efficiente. Tuttavia, poiché le ottimizzazioni generano una riorganizzazione del codice nel file di output,
-optimize+ può rendere difficile il debug.

Tutti i moduli generati con -target:module per un assembly devono usare le stesse -optimize impostazioni
dell'assembly. Per ulteriori informazioni, vedere -target (Visual Basic).
È possibile combinare le -optimize -debug Opzioni e.

P ER IM P O STA RE- O P T IM IZ E IN VISUA L ST UDIO IN T EGRAT ED DEVELO P M EN T EN VIRO N M EN T

1. è stato selezionato un progetto in Esplora soluzioni. Scegliere Proprietà dal menu Progetto .

2. fare clic sulla scheda Compila .


3. fare clic sul pulsante Avanzate .
4. modificare la casella di controllo Abilita ottimizzazioni .

Esempio
Il codice seguente compila T2.vb e Abilita le ottimizzazioni del compilatore.

vbc t2.vb -optimize

Vedi anche
Compilatore della riga di comando di Visual Basic
-debug (Visual Basic)
Esempi di righe di comando di compilazione
-target (Visual Basic)
-optioncompare
05/03/2021 • 2 minutes to read • Edit Online

Specifica la modalità con cui vengono confrontate le stringhe.

Sintassi
-optioncompare:{binary | text}

Osservazioni
È possibile specificare -optioncompare in uno dei due formati seguenti: -optioncompare:binary per usare i
confronti di stringhe binarie e -optioncompare:text per usare i confronti di stringhe di testo. Per impostazione
predefinita, il compilatore utilizza -optioncompare:binary .
In Microsoft Windows la tabella codici corrente determina l'ordinamento binario. Un ordinamento binario tipico
è il seguente:
A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø

I confronti di stringhe basati su testo sono basati su un ordinamento del testo senza distinzione tra maiuscole e
minuscole determinato dalle impostazioni locali del sistema. Di seguito è riportato un tipico ordinamento del
testo:
(A = a) < (À = à) < (B=b) < (E=e) < (Ê = ê) < (Z=z) < (Ø = ø)

Per impostare -optioncompare (nell'IDE di Visual Studio


1. Selezionare un progetto in Esplora soluzioni . Scegliere Proprietà dal menu Progetto .
2. Fare clic sulla scheda Compila .
3. Modificare il valore nella casella Option Compare .
Per impostare -optioncompare (a livello di codice
Vedere istruzione Option Compare.

Esempio
Il codice seguente compila ProjFile.vb e usa i confronti di stringhe binarie.

vbc -optioncompare:binary projFile.vb

Vedi anche
Compilatore della riga di comando di Visual Basic
-optionexplicit
-optionstrict
-optioninfer
Esempi di righe di comando di compilazione
Istruzione Option Compare
Impostazioni predefinite di Visual Basic, Progetti, finestra di dialogo Opzioni
-optionexplicit
05/03/2021 • 2 minutes to read • Edit Online

Fa in modo che il compilatore segnali errori se le variabili non vengono dichiarate prima di essere utilizzate.

Sintassi
-optionexplicit[+ | -]

Argomenti
+ | -
facoltativo. Specificare -optionexplicit+ per richiedere la dichiarazione esplicita delle variabili. L'
-optionexplicit+ opzione è l'impostazione predefinita ed è uguale a -optionexplicit . L' -optionexplicit-
opzione consente la dichiarazione implicita delle variabili.

Commenti
Se il file di codice sorgente contiene un' istruzione Option Explicit, l'istruzione sostituisce l' -optionexplicit
impostazione del compilatore da riga di comando.
Per impostare -optionexplicit (nell'IDE di Visual Studio
1. Selezionare un progetto in Esplora soluzioni . Scegliere Proprietà dal menu Progetto .
2. Fare clic sulla scheda Compila .
3. Modificare il valore nella casella Option Explicit .

Esempio
Il codice seguente viene compilato quando -optionexplicit- si usa.

Module Module1
Sub Main()
i = 99
System.Console.WriteLine(i)
End Sub
End Module

Vedi anche
Compilatore della riga di comando di Visual Basic
-optioncompare
-optionstrict
-optioninfer
Esempi di righe di comando di compilazione
Istruzione Option Explicit
Impostazioni predefinite di Visual Basic, Progetti, finestra di dialogo Opzioni
-optioninfer
05/03/2021 • 2 minutes to read • Edit Online

Consente di usare l'inferenza del tipo di variabile locale nelle dichiarazioni di variabile.

Sintassi
-optioninfer[+ | -]

Argomenti
T ERM IN E DEF IN IZ IO N E

+ | - facoltativo. Specificare -optioninfer+ per abilitare


l'inferenza del tipo di variabile locale o -optioninfer- per
bloccarla. L'opzione -optioninfer , senza alcun valore
specificato, equivale a -optioninfer+ . Il valore predefinito,
quando l'opzione -optioninfer non è presente, è anche
-optioninfer+ . Il valore predefinito viene impostato nel
file di risposta Vbc.rsp.

NOTE
È possibile usare l'opzione -noconfig per mantenere le impostazioni predefinite interne del compilatore anziché quelle
specificate in vbc.rsp. Il valore predefinito del compilatore per questa opzione è -optioninfer- .

Commenti
Se il file di codice sorgente contiene un' istruzione Option deduce, l'istruzione sostituisce l' -optioninfer
impostazione del compilatore da riga di comando.
Per impostare -optioninfer (nell'IDE di Visual Studio
1. Selezionare un progetto in Esplora soluzioni . Scegliere Proprietà dal menu Progetto .
2. Nella scheda Compila , modificare il valore nella casella Option dedurre .

Esempio
Il codice seguente compila test.vb con l'inferenza del tipo locale abilitata.

vbc -optioninfer+ test.vb

Vedi anche
Compilatore della riga di comando di Visual Basic
-optioncompare
-optionexplicit
-optionstrict
Esempi di righe di comando di compilazione
Option Infer (istruzione)
Inferenza del tipo di variabile locale
Impostazioni predefinite di Visual Basic, Progetti, finestra di dialogo Opzioni
Compilazione (pagina), Creazione progetti (Visual Basic)
-noconfig
Compilazione dalla riga di comando
-optionstrict
05/03/2021 • 2 minutes to read • Edit Online

Applica una semantica dei tipi rigorosa per limitare le conversioni implicite dei tipi.

Sintassi
-optionstrict[+ | -]
-optionstrict[:custom]

Argomenti
+ | -
facoltativo. L' -optionstrict+ opzione limita la conversione implicita di tipi. Il valore predefinito per questa
opzione è -optionstrict- . L' -optionstrict+ opzione è uguale a -optionstrict . È possibile utilizzare
entrambi per la semantica di tipo permissivo.
custom
Obbligatorio. Avvisa quando la semantica del linguaggio strict non viene rispettata.

Commenti
Quando -optionstrict+ è attivo, è possibile effettuare in modo implicito solo le conversioni verso un tipo più
ampio. Le conversioni implicite di tipi più piccoli, ad esempio l'assegnazione Decimal di un oggetto tipo a un
oggetto di tipo Integer, vengono segnalate come errori.
Per generare avvisi per le conversioni implicite di tipi più restrittivi, usare -optionstrict:custom . Utilizzare
-nowarn:numberlist per ignorare determinati avvisi e -warnaserror:numberlist considerare determinati avvisi
come errori.
Per impostare -optionstrict (nell'IDE di Visual Studio
1. Selezionare un progetto in Esplora soluzioni . Scegliere Proprietà dal menu progetto .
2. Fare clic sulla scheda Compila .
3. Modificare il valore nella casella Option Strict .
Per impostare -optionstrict (a livello di codice
Vedere istruzione Option Strict.

Esempio
Il codice seguente viene compilato Test.vb usando la semantica di tipo strict.

vbc -optionstrict+ test.vb

Vedi anche
Compilatore della riga di comando di Visual Basic
-optioncompare
-optionexplicit
-optioninfer
-nowarn
-warnaserror (Visual Basic)
Esempi di righe di comando di compilazione
Option Strict Statement
Impostazioni predefinite di Visual Basic, Progetti, finestra di dialogo Opzioni
-out (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Specifica il nome del file di output.

Sintassi
-out:filename

Argomenti
T ERM IN E DEF IN IZ IO N E

filename Obbligatorio. Nome del file di output creato dal compilatore.


Se il nome del file contiene uno spazio, racchiudere il nome
tra virgolette ("").

Commenti
Specificare il nome completo e l'estensione del file da creare. In caso contrario, il file con estensione exe prende
il nome dal file del codice sorgente contenente la Sub Main stored procedure e il file con estensione dll prende il
nome dal primo file di codice sorgente.
Se si specifica un nome di file senza estensione exe o dll, il compilatore aggiunge automaticamente l'estensione,
a seconda del valore specificato per l' -target opzione del compilatore.

P ER IM P O STA RE IL IN T EGRAT ED DEVELO P M EN T EN VIRO N M EN T IN VISUA L ST UDIO

1. è stato selezionato un progetto in Esplora soluzioni. Scegliere Proprietà dal menu Progetto .
2. fare clic sulla scheda applicazione .
3. modificare il valore nella casella nome assembly .

Esempio
Il codice seguente compila T2.vb e crea il file di output T2.exe .

vbc t2.vb -out:t3.exe

Vedi anche
Compilatore della riga di comando di Visual Basic
-target (Visual Basic)
Esempi di righe di comando di compilazione
-Platform (Visual Basic)
05/03/2021 • 5 minutes to read • Edit Online

Consente di specificare la versione di Common Language Runtime (CLR) in grado di eseguire il file di output.

Sintassi
-platform:{ x86 | x64 | Itanium | arm | anycpu | anycpu32bitpreferred }

Argomenti
T ERM IN E DEF IN IZ IO N E

x86 Compila l'assembly in modo da essere eseguito da CLR a 32


bit, compatibile con x86.

x64 Compila l'assembly l'assemby in modo da essere eseguito da


CLR a 64 bit su un computer che supporta il set di istruzioni
AMD64 o EM64T.

Itanium Compila l'assembly in modo da essere eseguito da CLR a 64


bit su un computer dotato di processore Itanium.

arm Compila l'assembly in modo da essere eseguito su un


computer con processore ARM (Advanced RISC Machine).

anycpu Compila l'assembly in modo da essere eseguito su qualsiasi


piattaforma. L'applicazione verrà eseguita come applicazione
a 32 bit su versioni di Windows a 32 bit e come applicazione
a 64 bit su versioni di Windows a 64 bit. Questo flag è il
valore predefinito.

anycpu32bitpreferred Compila l'assembly in modo da essere eseguito su qualsiasi


piattaforma. L'applicazione verrà eseguita come applicazione
a 32 bit sia nelle versioni di Windows a 32 bit che in quelle a
64 bit. Questo flag è valido solo per i file eseguibili (. EXE) e
richiede .NET Framework 4,5.

Commenti
Per specificare il tipo di processore di destinazione del file di output, usare l'opzione -platform .
In genere, gli assembly .NET Framework scritti in Visual Basic vengono sempre eseguiti, indipendentemente
dalla piattaforma. L'elaborazione di alcuni elementi può tuttavia risultare influenzata dalla piattaforma in uso. I
casi più comuni sono:
Strutture contenenti membri che cambiano dimensione in base alla piattaforma, ad esempio tutti i tipi
puntatore.
Operazioni aritmetiche che includono dimensioni costanti.
Dichiarazioni pInvoke o COM non corrette che usano Integer anziché IntPtr per gli handle.
Casting di IntPtr su Integer .
Uso dell'interoperabilità pInvoke o COM con componenti non disponibili in tutte le piattaforme.
L'opzione -Platform consente di attenuare alcuni problemi se si è certi di aver fatto supposizioni
sull'architettura in cui viene eseguito il codice. In particolare:
Se si specifica l'opzione per una piattaforma a 64 bit e l'applicazione viene eseguita su un computer a 32
bit, il messaggio di errore verrà visualizzato con maggiore anticipo e sarà maggiormente descrittivo del
problema specifico rispetto all'errore che si verifica senza usare questa opzione.
Se si imposta il flag x86 e successivamente si usa un computer a 64 bit per l'elaborazione
dell'applicazione, questa verrà eseguita nel sottosistema WOW e non a livello nativo.
In un sistema operativo Windows a 64 bit:
Gli assembly compilati con l'opzione -platform:x86 potranno essere eseguiti da CLR a 32 bit in WOW64.
Gli eseguibili compilati con l'opzione -platform:anycpu potranno essere eseguiti da CLR a 64 bit.
Una DLL compilata con l'opzione -platform:anycpu potrà essere eseguita dallo stesso CLR del processo
in cui viene caricata.
Gli eseguibili compilati con l'opzione -platform:anycpu32bitpreferred potranno essere eseguiti da CLR a
32 bit.
Per ulteriori informazioni sullo sviluppo di un'applicazione per l'esecuzione in una versione a 64 bit di Windows,
vedere applicazioni a 64 bit.
Per impostare -Platform nell'IDE di Visual Studio
1. In Esplora soluzioni scegliere il progetto, aprire il menu progetto , quindi fare clic su proprietà .
2. Nella scheda Compila selezionare o deselezionare la casella di controllo preferisci 32 bit oppure
selezionare un valore nell'elenco CPU di destinazione .
Per ulteriori informazioni, vedere compilazione pagina, Progettazione progetti (Visual Basic).

Esempio
L'esempio seguente mostra come usare l'opzione del compilatore -platform .

vbc -platform:x86 myFile.vb

Vedi anche
-target (Visual Basic)
Compilatore della riga di comando di Visual Basic
Esempi di righe di comando di compilazione
-quiet
05/03/2021 • 2 minutes to read • Edit Online

Impedisce al compilatore di visualizzare codice per avvisi ed errori relativi alla sintassi.

Sintassi
-quiet

Osservazioni
Per impostazione predefinita, l'opzione -quiet non è attiva. Quando il compilatore segnala un errore o un
avviso correlato alla sintassi, restituisce anche la riga dal codice sorgente. Per le applicazioni che analizzano
l'output del compilatore, potrebbe essere più pratico per il compilatore restituire solo il testo della diagnostica.
Nell'esempio seguente viene Module1 restituito un errore che include il codice sorgente quando viene
compilato senza -quiet .

Module Module1
Sub Main()
x()
End Sub
End Module

Output:

C:\projects\vb2.vb(3) : error BC30451: 'x' is not declared. It may be inaccessible due to its protection
level.

x()
~

Compilato con -quiet , il compilatore restituisce solo quanto segue:

E:\test\t2.vb(3) : error BC30451: Name 'x' is not declared.

NOTE
L' -quiet opzione non è disponibile nell'ambiente di sviluppo di Visual Studio. è disponibile solo quando si esegue la
compilazione dalla riga di comando.

Esempio
Il codice seguente compila T2.vb e non Visualizza il codice per la diagnostica del compilatore correlato alla
sintassi:

vbc -quiet t2.vb


Vedi anche
Compilatore della riga di comando di Visual Basic
Esempi di righe di comando di compilazione
-recurse
05/03/2021 • 2 minutes to read • Edit Online

Compila i file del codice sorgente in tutte le directory figlio della directory specificata o della directory del
progetto.

Sintassi
-recurse:[dir\]file

Argomenti
dir
facoltativo. La directory in cui si vuole che abbia inizio la ricerca. Se non specificato, la ricerca inizia nella
directory del progetto.
file
Obbligatorio. I file da cercare. È consentito l'utilizzo di caratteri jolly.

Commenti
È possibile usare caratteri jolly in un nome file per compilare tutti i file corrispondenti nella directory del
progetto senza usare -recurse . Se non viene specificato alcun nome file di output, il compilatore basa il nome
del file di output sul primo file di input elaborato. Si tratta in genere del primo file nell'elenco di file compilato
quando viene visualizzato in ordine alfabetico. Per questo motivo, è preferibile specificare un file di output
usando l' -out opzione.

NOTE
L' -recurse opzione non è disponibile nell'ambiente di sviluppo di Visual Studio. è disponibile solo quando si esegue la
compilazione dalla riga di comando.

Esempio
Il comando seguente compila tutti i file di Visual Basic nella directory corrente.

vbc *.vb

Il comando seguente compila tutti i file di Visual Basic nella Test\ABC Directory e in tutte le directory
sottostanti, quindi genera Test.ABC.dll .

vbc -target:library -out:Test.ABC.dll -recurse:Test\ABC\*.vb

Vedi anche
Compilatore della riga di comando di Visual Basic
-out (Visual Basic)
Esempi di righe di comando di compilazione
-Reference (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Fa in modo che il compilatore renda le informazioni sul tipo negli assembly specificati disponibili per il progetto
attualmente in fase di compilazione.

Sintassi
-reference:fileList

oppure

-r:fileList

Argomenti
T ERM IN E DEF IN IZ IO N E

fileList Obbligatorio. Elenco di nomi di file di assembly delimitato da


virgole. Se il nome del file contiene uno spazio, racchiudere il
nome tra virgolette.

Commenti
I file importati devono contenere i metadati dell'assembly. Solo i tipi pubblici sono visibili all'esterno
dell'assembly. L'opzione -addmodule importa i metadati da un modulo.
Se si fa riferimento a un assembly (assembly A) che a sua volta fa riferimento a un altro assembly (assembly B),
è necessario fare riferimento all'assembly B se:
Un tipo dell'assembly A eredita da un tipo o implementa un'interfaccia dall'assembly B.
Viene richiamato un campo, una proprietà, un evento o un metodo che presenta un tipo restituito o un
tipo di parametro proveniente dall'assembly B.
Usare -LIBPATH per specificare la directory in cui si trova uno o più riferimenti ad assembly.
Affinché il compilatore riconosca un tipo in un assembly (non un modulo), è necessario forzare la risoluzione del
tipo. Un esempio di come è possibile eseguire questa operazione consiste nel definire un'istanza del tipo. Sono
disponibili altri modi per risolvere i nomi dei tipi in un assembly per il compilatore. Se, ad esempio, si eredita da
un tipo in un assembly, il nome del tipo diventa noto al compilatore.
Per impostazione predefinita, viene usato il file di risposta vbc. rsp, che fa riferimento a assembly .NET
Framework di uso comune. Usare -noconfig se non si vuole che il compilatore usi vbc. rsp.
La forma breve di -reference è -r .

Esempio
Il comando seguente compila il file di origine Input.vb e gli assembly di riferimento da Metad1.dll e
Metad2.dll per produrre Out.exe .

vbc -reference:metad1.dll,metad2.dll -out:out.exe input.vb

Vedi anche
Compilatore della riga di comando di Visual Basic
-noconfig
-target (Visual Basic)
Pubblica
Esempi di righe di comando di compilazione
-refonly (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

L'opzione -refonly indica che l'output primario della compilazione deve essere un assembly di riferimento
invece di un assembly di implementazione. Il parametro -refonly disabilita automaticamente l'output dei file
PDB poiché non è possibile eseguire gli assembly di riferimento.
Ogni opzione del compilatore è disponibile in due forme: -opzione e (opzione) . La documentazione mostra
solo la forma -opzione.

Sintassi
-refonly

Osservazioni
Visual Basic supporta l' -refonly opzione che inizia con la versione 15,3.
Gli assembly di riferimento sono un tipo speciale di assembly che contiene solo la quantità minima di metadati
necessaria per rappresentare la superficie dell'API pubblica della libreria. Sono incluse le dichiarazioni per tutti i
membri significativi quando si fa riferimento a un assembly negli strumenti di compilazione, ma si escludono
tutte le implementazioni e le dichiarazioni dei membri privati che non hanno alcun impatto osservabile sul
contratto API. Per ulteriori informazioni, vedere assembly di riferimento nella Guida di .NET.
Le -refonly Opzioni e si escludono a -refout vicenda.

Vedi anche
-refout
Compilatore della riga di comando di Visual Basic
Esempi di righe di comando di compilazione
-refout (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

L'opzione -refout specifica un percorso file in cui l'assembly di riferimento deve essere restituito come output.
Ogni opzione del compilatore è disponibile in due forme: -opzione e (opzione) . La documentazione mostra
solo la forma -opzione.

Sintassi
-refout:filepath

Argomenti
filepath
Percorso e nome del file dell'assembly di riferimento. In genere dovrebbe trovarsi in una sottocartella
dell'assembly primario. La convenzione consigliata (usata da MSBuild) consiste nell'inserire l'assembly di
riferimento in una sottocartella "ref /" relativa all'assembly primario. Tutte le cartelle in filepath devono
esistere; il compilatore non le crea.

Commenti
Visual Basic supporta l' -refout opzione che inizia con la versione 15,3.
Gli assembly di riferimento sono un tipo speciale di assembly che contiene solo la quantità minima di metadati
necessaria per rappresentare la superficie dell'API pubblica della libreria. Sono incluse le dichiarazioni per tutti i
membri significativi quando si fa riferimento a un assembly negli strumenti di compilazione, ma si escludono
tutte le implementazioni e le dichiarazioni dei membri privati che non hanno alcun impatto osservabile sul
contratto API. Per ulteriori informazioni, vedere assembly di riferimento nella Guida di .NET.
Le -refout Opzioni e si escludono a -refonly vicenda.

Vedi anche
-refonly
Compilatore della riga di comando di Visual Basic
Esempi di righe di comando di compilazione
-removeintchecks
05/03/2021 • 2 minutes to read • Edit Online

Attiva o disattiva il controllo degli errori di overflow per le operazioni integer.

Sintassi
-removeintchecks[+ | -]

Argomenti
T ERM IN E DEF IN IZ IO N E

+ | - facoltativo. L' -removeintchecks- opzione fa sì che il


compilatore verifichi tutti i calcoli Integer per gli errori di
overflow. Il valore predefinito è -removeintchecks- .

Specifica -removeintchecks o -removeintchecks+


impedisce il controllo degli errori ed è in grado di eseguire
calcoli Integer più velocemente. Tuttavia, senza il controllo
degli errori e in caso di overflow delle capacità del tipo di
dati, i risultati non corretti possono essere archiviati senza
generare un errore.

P ER IM P O STA RE- REM O VEIN TC H EC K S ( IN VISUA L ST UDIO IN T EGRAT ED DEVELO P M EN T EN VIRO N M EN T

1. è stato selezionato un progetto in Esplora soluzioni. Scegliere Proprietà dal menu Progetto .
2. fare clic sulla scheda Compila .
3. fare clic sul pulsante Avanzate .
4. modificare il valore della casella di controllo Rimuovi overflow di Integer .

Esempio
Il codice seguente compila Test.vb e disattiva il controllo degli errori di overflow di Integer.

vbc -removeintchecks+ test.vb

Vedi anche
Compilatore della riga di comando di Visual Basic
Esempi di righe di comando di compilazione
-Resource (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Incorpora una risorsa gestita in un assembly.

Sintassi
-resource:filename[,identifier[,public|private]]

oppure

-res:filename[,identifier[,public|private]]

Argomenti
T ERM IN E DEF IN IZ IO N E

filename Obbligatorio. Nome del file di risorse da incorporare nel file


di output. Per impostazione predefinita, filename è Public
nell'assembly. Racchiudere il nome file tra virgolette ("") se
contiene uno spazio.

identifier facoltativo. Nome logico della risorsa. nome usato per


caricarlo. L'impostazione predefinita corrisponde al nome del
file. Facoltativamente, è possibile specificare se la risorsa è
pubblica o privata nel manifesto dell'assembly, come nel
seguente esempio:
-res:filename.res, myname.res, public

Commenti
Usare -linkresource per collegare una risorsa a un assembly senza inserire il file di risorse nel file di output.
Se filename è un file di risorse .NET Framework creato, ad esempio dal Resgen.exe (Generatore di file di risorse)
o nell'ambiente di sviluppo, è possibile accedervi con membri nello System.Resources spazio dei nomi
ResourceManager . per ulteriori informazioni, vedere. Per accedere a tutte le altre risorse in fase di esecuzione,
usare uno dei metodi seguenti: GetManifestResourceInfo , GetManifestResourceNames o
GetManifestResourceStream .
La forma breve di -resource è -res .
Per informazioni su come impostare -resource nell'IDE di Visual Studio, vedere gestione delle risorse
dell'applicazione (.NET).

Esempio
Il codice seguente compila In.vb e connette il file di risorse Rf.resource .
vbc -res:rf.resource in.vb

Vedi anche
Compilatore della riga di comando di Visual Basic
-win32resource
-linkresource ((Visual Basic)
-target (Visual Basic)
Esempi di righe di comando di compilazione
-rootnamespace
05/03/2021 • 2 minutes to read • Edit Online

Specifica uno spazio dei nomi per tutte le dichiarazioni di tipo.

Sintassi
-rootnamespace:namespace

Argomenti
T ERM IN E DEF IN IZ IO N E

namespace Nome dello spazio dei nomi in cui racchiudere tutte le


dichiarazioni di tipo per il progetto corrente.

Commenti
Se si usa il file eseguibile di Visual Studio (Devenv.exe) per compilare un progetto creato nell'Integrated
Development Environment di Visual Studio, usare -rootnamespace per specificare il valore della RootNamespace
Proprietà. Per ulteriori informazioni, vedere Opzioni della riga di comando devenv .
Usare il disassembler MSIL di Common Language Runtime ( Ildasm.exe ) per visualizzare i nomi degli spazi dei
nomi nel file di output.

P ER IM P O STA RE- RO OT N A M ESPA C E IN VISUA L ST UDIO IN T EGRAT ED DEVELO P M EN T EN VIRO N M EN T

1. è stato selezionato un progetto in Esplora soluzioni. Scegliere Proprietà dal menu Progetto .
2. fare clic sulla scheda applicazione .
3. modificare il valore nella casella spazio dei nomi radice .

Esempio
Il codice seguente compila In.vb e racchiude tutte le dichiarazioni di tipo nello spazio dei nomi mynamespace .

vbc -rootnamespace:mynamespace in.vb

Vedi anche
Compilatore della riga di comando di Visual Basic
Ildasm.exe (disassembler IL)
Esempi di righe di comando di compilazione
-sdkpath
05/03/2021 • 2 minutes to read • Edit Online

Specifica il percorso di mscorlib.dll e Microsoft.VisualBasic.dll.

Sintassi
-sdkpath:path

Argomenti
path
Directory contenente le versioni di mscorlib.dll e Microsoft.VisualBasic.dll da utilizzare per la compilazione.
Questo percorso non viene verificato fino a quando non viene caricato. Racchiudere il nome della directory tra
virgolette ("") se contiene uno spazio.

Commenti
Questa opzione indica al compilatore Visual Basic di caricare i file di mscorlib.dll e Microsoft.VisualBasic.dll da un
percorso non predefinito. L' -sdkpath opzione è stata progettata per essere utilizzata con -netcf (. Il .NET
Compact Framework utilizza versioni diverse di queste librerie di supporto per evitare l'utilizzo di tipi e
funzionalità del linguaggio non disponibili nei dispositivi.

NOTE
L' -sdkpath opzione non è disponibile nell'ambiente di sviluppo di Visual Studio. è disponibile solo quando si esegue la
compilazione dalla riga di comando. L' -sdkpath opzione viene impostata quando viene caricato un progetto Visual
Basic dispositivo.

È possibile specificare che il compilatore deve eseguire la compilazione senza un riferimento alla libreria di
runtime Visual Basic usando l' -vbruntime opzione del compilatore. Per ulteriori informazioni, vedere -
vbruntime.

Esempio
Il codice seguente viene compilato Myfile.vb con il .NET Compact Framework, usando le versioni di
Mscorlib.dll e Microsoft.VisualBasic.dll disponibili nella directory di installazione predefinita del .NET Compact
Framework nell'unità C. In genere, si utilizzerà la versione più recente del .NET Compact Framework.

vbc -netcf -sdkpath:"c:\Program Files\Microsoft Visual Studio .NET


2003\CompactFrameworkSDK\v1.0.5000\Windows CE " myfile.vb

Vedi anche
Compilatore della riga di comando di Visual Basic
Esempi di righe di comando di compilazione
-netcf
-vbruntime
-target (Visual Basic)
05/03/2021 • 8 minutes to read • Edit Online

Specifica il formato dell'output del compilatore.

Sintassi
-target:{exe | library | module | winexe | appcontainerexe | winmdobj}

Osservazioni
Nella tabella seguente sono riepilogati gli effetti dell' -target opzione.

O P Z IO N E C O M P O RTA M EN TO

-target:exe Determina la creazione di un'applicazione console eseguibile


da parte del compilatore.

Questa è l'opzione predefinita se non -target è specificata


alcuna opzione. Il file eseguibile viene creato con estensione
exe.

Se non diversamente specificato con l' -out opzione, il


nome del file di output prende il nome del file di input che
contiene la Sub Main procedura.

Sub Main Nei file del codice sorgente compilati in un file con
estensione exe è necessaria una sola procedura. Utilizzare l'
-main opzione del compilatore per specificare la classe che
contiene la Sub Main routine.

-target:library Determina la creazione di una libreria di collegamento


dinamico (DLL) da parte del compilatore.

Il file della libreria a collegamento dinamico viene creato con


estensione dll.

Se non diversamente specificato con l' -out opzione, il


nome del file di output prende il nome del primo file di input.

Quando si compila una DLL, Sub Main non è necessaria


una stored procedure.
O P Z IO N E C O M P O RTA M EN TO

-target:module Fa in modo che il compilatore generi un modulo che può


essere aggiunto a un assembly.

Il file di output viene creato con estensione. netmodule.

Il Common Language Runtime .NET non è in grado di


caricare un file che non dispone di un assembly. Tuttavia, è
possibile incorporare tale file nel manifesto dell'assembly di
un assembly tramite -reference .

Quando il codice in un modulo fa riferimento a tipi interni in


un altro modulo, è necessario incorporare entrambi i moduli
in un manifesto dell'assembly usando -reference .

L'opzione -addmodule importa i metadati da un modulo.

-target:winexe Fa in modo che il compilatore crei un'applicazione eseguibile


basata su Windows.

Il file eseguibile viene creato con estensione exe.


Un'applicazione basata su Windows è una che fornisce
un'interfaccia utente dalla libreria di classi .NET Framework o
con le API di Windows.

Se non diversamente specificato con l' -out opzione, il


nome del file di output prende il nome del file di input che
contiene la Sub Main procedura.

Sub Main Nei file del codice sorgente compilati in un file con
estensione exe è necessaria una sola procedura. Nei casi in
cui il codice ha più di una classe che include una Sub Main
routine, usare l' -main opzione del compilatore per
specificare la classe che contiene la Sub Main routine.

-target:appcontainerexe Fa in modo che il compilatore crei un'applicazione basata su


Windows eseguibile che deve essere eseguita in un
contenitore di app. Questa impostazione è progettata per
essere utilizzata per le applicazioni Windows 8. x Store.

L'impostazione appcontainerexe imposta un bit nel campo


caratteristiche del file eseguibile portatile . Questo bit indica
che l'app deve essere eseguita in un contenitore di app.
Quando questo bit è impostato, si verifica un errore se il
CreateProcess metodo tenta di avviare l'applicazione
all'esterno di un contenitore di app. A parte questa
impostazione di bit, -target: appcontainerexe è
equivalente a -target: winexe .

Il file eseguibile viene creato con estensione exe.

A meno che non si specifichi diversamente utilizzando l'


-out opzione, il nome del file di output prende il nome del
file di input che contiene la Sub Main procedura.

Sub Main Nei file del codice sorgente compilati in un file con
estensione exe è necessaria una sola procedura. Se il codice
contiene più di una classe che include una Sub Main
routine, utilizzare l' -main opzione del compilatore per
specificare la classe che contiene la Sub Main routine.
O P Z IO N E C O M P O RTA M EN TO

-target:winmdobj Fa in modo che il compilatore crei un file intermedio che è


possibile convertire in un file binario Windows Runtime
(WinMD). Il file con estensione winmd può essere utilizzato
dai programmi JavaScript e C++, oltre ai programmi di
linguaggio gestito.

Il file intermedio viene creato con estensione winmdobj.

A meno che non si specifichi diversamente utilizzando l'


-out opzione, il nome del file di output assume il nome del
primo file di input. Una Sub Main routine non è
obbligatoria.

Il file con estensione winmdobj è progettato per essere


utilizzato come input per lo WinMDExp strumento di
esportazione per produrre un file di metadati di Windows
(WinMD). Il file WinMD ha un'estensione. winmd e contiene
sia il codice della libreria originale che le definizioni WinMD
usate da JavaScript, C++ e da Windows Runtime.

A meno che non si specifichi -target:module , -target comporta l'aggiunta di un manifesto dell'assembly .NET
Framework a un file di output.
Ogni istanza di Vbc.exe produce al massimo un file di output. Se si specifica un'opzione del compilatore, ad
esempio -out o -target più di una volta, viene applicata l'ultima elaborazione del compilatore. Le
informazioni su tutti i file in una compilazione vengono aggiunte al manifesto. Tutti i file di output, ad eccezione
di quelli creati con -target:module , contengono i metadati dell'assembly nel manifesto. Usare Ildasm.exe
(DISASSEMBLER il) per visualizzare i metadati in un file di output.
La forma breve di -target è -t .
Per impostare -target nell'IDE di Visual Studio
1. Selezionare un progetto in Esplora soluzioni . Scegliere Proprietà dal menu Progetto .
2. Fare clic sulla scheda Applicazione .
3. Modificare il valore nella casella tipo di applicazione .

Esempio
Il codice seguente compila in.vb , creando in.dll :

vbc -target:library in.vb

Vedi anche
Compilatore della riga di comando di Visual Basic
-principale
-out (Visual Basic)
-Reference (Visual Basic)
-addmodule
-moduleassemblyname
Assembly in .NET
Esempi di righe di comando di compilazione
-subsystemversion (Visual Basic)
18/03/2021 • 3 minutes to read • Edit Online

Specifica la versione minima del sottosistema in cui è possibile eseguire il file eseguibile generato,
determinando le versioni di Windows in cui è possibile eseguire il file eseguibile. In genere, questa opzione
assicura che il file eseguibile possa sfruttare le funzionalità di protezione che non sono disponibili con le versioni
precedenti di Windows.

NOTE
Per specificare il sottosistema stesso, usare l'opzione del compilatore -target.

Sintassi
-subsystemversion:major.minor

Parametri
major.minor

Versione minima richiesta per il sottosistema, espressa in una notazione del punto per le versioni principali e
secondarie. Ad esempio, è possibile specificare che un'applicazione non può essere eseguita su un sistema
operativo precedente a Windows 7 Se si imposta il valore di questa opzione su 6.01, come descritto nella tabella
più avanti in questo argomento. È necessario specificare i valori per major e minor come numeri interi.
Gli zeri iniziali della versione minor non modificano la versione, a differenza degli zeri finali. Ad esempio, 6.1 e
6.01 si fanno riferimento alla stessa versione, ma 6.10 fa riferimento a una versione diversa. È consigliabile
esprimere la versione secondaria con due cifre per evitare confusione.

Commenti
Nella tabella seguente sono elencate le versioni comuni del sottosistema di Windows.

VERSIO N E DI W IN DO W S VERSIO N E DEL SOT TO SIST EM A

Windows 2000 5,00

Windows XP 5,01

Windows Server 2003 5,02

Windows Vista 6,00

Windows 7 6.01

Windows Server 2008 6.01

Windows 8 6.02
Valori predefiniti
Il valore predefinito dell'opzione del compilatore -subsystemversion dipende dalle condizioni elencate di
seguito:
Il valore predefinito è 6.02 se è impostata un'opzione del compilatore nell'elenco seguente:
-target:appcontainerexe
-target:winmdobj
-platform:arm
Il valore predefinito è 6.00 se si usa MSBuild, se la destinazione è .NET Framework 4.5 e se non è stata
impostata una delle opzioni del compilatore specificate in precedenza in questo elenco.
Il valore predefinito è 4.00 se nessuna di queste condizioni è vera.

Impostazione di questa opzione


Per impostare l'opzione del compilatore -SubsystemVersion in Visual Studio, è necessario aprire il file con
estensione vbproj e specificare un valore per la SubsystemVersion proprietà nel codice XML di MSBuild. Non è
possibile impostare questa opzione nell'IDE di Visual Studio. Per altre informazioni, vedere "Valori predefiniti"
più indietro in questo argomento o Proprietà di progetto MSBuild comuni.

Vedi anche
Compilatore della riga di comando di Visual Basic
Proprietà di MSBuild
-utf8output (Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

Visualizza l'output del compilatore usando la codifica UTF-8.

Sintassi
-utf8output[+ | -]

Argomenti
+ | -
facoltativo. Il valore predefinito per questa opzione è -utf8output- , il che significa che l'output del compilatore
non usa la codifica UTF-8. Specificare -utf8output equivale a specificare -utf8output+ .

Commenti
In alcune configurazioni internazionali, l'output del compilatore non può essere visualizzato correttamente nella
console. In tali situazioni, utilizzare -utf8output e reindirizzare l'output del compilatore in un file.

NOTE
L' -utf8output opzione non è disponibile nell'ambiente di sviluppo di Visual Studio. è disponibile solo quando si esegue
la compilazione dalla riga di comando.

Esempio
Il codice seguente compila In.vb e indirizza il compilatore per visualizzare l'output usando la codifica UTF-8.

vbc -utf8output in.vb

Vedi anche
Compilatore della riga di comando di Visual Basic
Esempi di righe di comando di compilazione
-vbruntime
05/03/2021 • 5 minutes to read • Edit Online

Indica che il compilatore deve compilare senza un riferimento alla libreria di runtime di Visual Basic oppure con
un riferimento a una libreria di runtime specifica.

Sintassi
-vbruntime:{ - | + | * | path }

Argomenti
-
Eseguire la compilazione senza un riferimento alla libreria di runtime Visual Basic.
+
Compilare con un riferimento alla libreria di runtime Visual Basic predefinita.
*
Eseguire la compilazione senza un riferimento alla libreria di runtime Visual Basic e incorporare la funzionalità di
base dalla libreria di runtime Visual Basic nell'assembly.
path
Compilare con un riferimento alla libreria (DLL) specificata.

Commenti
L' -vbruntime opzione del compilatore consente di specificare che il compilatore deve compilare senza un
riferimento alla libreria di Runtime Visual Basic. Se si compila senza un riferimento alla libreria di runtime Visual
Basic, gli errori o gli avvisi vengono registrati nel codice o nei costrutti di linguaggio che generano una chiamata
a un helper del runtime di Visual Basic. Un helper Visual Basic Runtime è una funzione definita in
Microsoft.VisualBasic.dll chiamata in fase di esecuzione per l'esecuzione di una semantica di linguaggio
specifica.
L' -vbruntime+ opzione produce lo stesso comportamento che si verifica se non -vbruntime è specificata
alcuna opzione. È possibile usare l' -vbruntime+ opzione per eseguire l'override delle -vbruntime opzioni
precedenti.
La maggior parte degli oggetti del My tipo non sono disponibili quando si usano le -vbruntime-
-vbruntime:path Opzioni o.

Incorporamento della funzionalità di base di Visual Basic Runtime


L' -vbruntime* opzione consente di compilare senza un riferimento a una libreria di Runtime. Al contrario, la
funzionalità di base della libreria di runtime Visual Basic è incorporata nell'assembly utente. È possibile usare
questa opzione se l'applicazione viene eseguita su piattaforme che non contengono il runtime di Visual Basic.
Sono incorporati i membri runtime seguenti:
Classe Conversions
Metodo AscW(Char)
Metodo AscW(String)
Metodo ChrW(Int32)
vbBack costante
vbCr costante
vbCrLf costante
vbFormFeed costante
vbLf costante
vbNewLine costante
vbNullChar costante
vbNullString costante
vbTab costante
vbVerticalTab costante
Alcuni oggetti del My tipo
Se si esegue la compilazione con l' -vbruntime* opzione e il codice fa riferimento a un membro dalla libreria di
Runtime Visual Basic che non è incorporato con la funzionalità di base, il compilatore restituisce un errore che
indica che il membro non è disponibile.

Riferimento a una libreria specificata


È possibile usare l' path argomento per compilare con un riferimento a una libreria di runtime personalizzata
anziché la libreria di runtime Visual Basic predefinita.
Se il valore per l' path argomento è un percorso completo di una dll, il compilatore utilizzerà tale file come
libreria di Runtime. Se il valore dell' path argomento non è un percorso completo di una dll, il Visual Basic
compilatore cercherà prima la DLL identificata nella cartella corrente. Verrà quindi cercata nel percorso
specificato tramite l'opzione del compilatore -sdkpath ( . Se -sdkpath non si usa l'opzione del compilatore, il
compilatore cercherà la DLL identificata nella cartella .NET Framework (
%systemroot%\Microsoft.NET\Framework\versionNumber ).

Esempio
Nell'esempio seguente viene illustrato come utilizzare l' -vbruntime opzione per compilare con un riferimento a
una libreria personalizzata.

vbc -vbruntime:C:\VBLibraries\CustomVBLibrary.dll

Vedi anche
Visual Basic Core-nuova modalità di compilazione in Visual Studio 2010 SP1
Compilatore della riga di comando di Visual Basic
Esempi di righe di comando di compilazione
-sdkpath
-verbose
05/03/2021 • 2 minutes to read • Edit Online

Fa in modo che il compilatore generi messaggi di errore e di stato dettagliati.

Sintassi
-verbose[+ | -]

Argomenti
+ | -
facoltativo. Specificare -verbose equivale -verbose+ a specificare, che determina la generazione di messaggi
dettagliati da parte del compilatore. Il valore predefinito per questa opzione è -verbose- .

Commenti
L' -verbose opzione Visualizza informazioni sul numero totale di errori emessi dal compilatore, segnala gli
assembly caricati da un modulo e Visualizza i file attualmente in fase di compilazione.

NOTE
L' -verbose opzione non è disponibile nell'ambiente di sviluppo di Visual Studio. è disponibile solo quando si esegue la
compilazione dalla riga di comando.

Esempio
Il codice seguente compila In.vb e indirizza il compilatore per visualizzare informazioni dettagliate sullo stato.

vbc -verbose in.vb

Vedi anche
Compilatore della riga di comando di Visual Basic
Esempi di righe di comando di compilazione
-warnaserror (Visual Basic)
05/03/2021 • 3 minutes to read • Edit Online

Indica al compilatore di considerare la prima occorrenza di un avviso come errore.

Sintassi
-warnaserror[+ | -][:numberList]

Argomenti
T ERM IN E DEF IN IZ IO N E

+|- facoltativo. Per impostazione predefinita, l'opzione


-warnaserror- è attiva. Gli avvisi non impediscono al
compilatore di produrre un file di output. Con l'opzione
-warnaserror , equivalente a -warnaserror+ , gli avvisi
vengono considerati errori.

numberList facoltativo. Elenco delimitato da virgole di numeri di ID di


avviso a cui si applica l'opzione -warnaserror . Se non viene
specificato alcun ID di avviso, l'opzione -warnaserror si
applica a tutti gli avvisi.

Commenti
L'opzione -warnaserror considera tutti gli avvisi come errori. Qualsiasi messaggio segnalato di norma come
avviso viene invece segnalato come errore. Il compilatore segnala le occorrenze successive dello stesso avviso
come avvisi.
Per impostazione predefinita, l'opzione -warnaserror- è attiva, pertanto gli avvisi sono solo informativi. Con
l'opzione -warnaserror , equivalente a -warnaserror+ , gli avvisi vengono considerati errori.
Se si vuole che solo determinati avvisi vengano considerati errori, è possibile specificare un elenco delimitato da
virgole di numeri di avvisi da considerare errori.

NOTE
L'opzione -warnaserror non controlla la modalità di visualizzazione degli avvisi. Usare l'opzione -nowarn per disabilitare
gli avvisi.

P ER IM P O STA RE - WA RN A SERRO R IN M O DO DA C O N SIDERA RE T UT T I GL I AVVISI C O M E ERRO RI N EL L 'IDE DI VISUA L ST UDIO

1. è stato selezionato un progetto in Esplora soluzioni. Scegliere Proprietà dal menu Progetto .
2. fare clic sulla scheda Compila .
3. Assicurarsi che la casella di controllo Disabilita tutti gli avvisi sia deselezionata.
4. Selezionare la casella di controllo Considera tutti gli avvisi come errori .
P ER IM P O STA RE - WA RN A SERRO R IN M O DO DA C O N SIDERA RE AVVISI SP EC IF IC I C O M E ERRO RI N EL L 'IDE DI VISUA L ST UDIO

1. è stato selezionato un progetto in Esplora soluzioni. Scegliere Proprietà dal menu Progetto .
2. fare clic sulla scheda Compila .
3. Assicurarsi che la casella di controllo Disabilita tutti gli avvisi sia deselezionata.
4. Assicurarsi che la casella di controllo Considera tutti gli avvisi come errori sia deselezionata.
5. Selezionare errore nella colonna notifica accanto all'avviso che deve essere considerato come un errore.

Esempio
Il codice seguente compila In.vb e indica al compilatore di visualizzare un errore per la prima occorrenza di
ogni avviso rilevato.

vbc -warnaserror in.vb

Esempio
Il codice seguente compila T2.vb e considera come errore solo l'avviso per le variabili locali inutilizzate
(42024).

vbc -warnaserror:42024 t2.vb

Vedi anche
Compilatore della riga di comando di Visual Basic
Esempi di righe di comando di compilazione
Configuring Warnings in Visual Basic
-win32icon
05/03/2021 • 2 minutes to read • Edit Online

Inserisce un file con estensione ICO nel file di output. Il file ico rappresenta il file di output in Esplora file .

Sintassi
-win32icon:filename

Argomenti
T ERM IN E DEF IN IZ IO N E

filename File con estensione ico da aggiungere al file di output.


Racchiudere il nome file tra virgolette ("") se contiene uno
spazio.

Commenti
È possibile creare un file con estensione ico con il compilatore di risorse di Microsoft Windows (RC). Il
compilatore di risorse viene richiamato quando si compila un programma di Visual C++; un file con estensione
ICO viene creato dal file RC. Le opzioni -win32icon e -win32resource si escludono reciprocamente.
Vedere -linkresource ((Visual Basic) per fare riferimento a un file di risorse .NET Framework o -Resource (Visual
Basic) per alleghire un file di risorse .NET Framework. Vedere -win32resource ( per importare un file con
estensione res.

P ER IM P O STA RE- W IN 32IC O N N EL L 'IDE DI VISUA L ST UDIO

1. è stato selezionato un progetto in Esplora soluzioni. Scegliere Proprietà dal menu Progetto .
2. fare clic sulla scheda applicazione .
3. modificare il valore nella casella icona .

Esempio
Il codice seguente compila In.vb e connette un file con estensione ico Rf.ico .

vbc -win32icon:rf.ico in.vb

Vedi anche
Compilatore della riga di comando di Visual Basic
Esempi di righe di comando di compilazione
-win32manifest (Visual Basic)
05/03/2021 • 4 minutes to read • Edit Online

Identifica un file manifesto dell'applicazione Win32 definito dall'utente da incorporare nel file eseguibile di tipo
PE di un progetto.

Sintassi
-win32manifest: fileName

Argomenti
T ERM IN E DEF IN IZ IO N E

fileName Percorso del file manifesto personalizzato.

Commenti
Per impostazione predefinita, il compilatore Visual Basic incorpora un manifesto dell'applicazione che specifica
un livello di esecuzione richiesto di asInvoker. Crea il manifesto nella stessa cartella in cui viene compilato il file
eseguibile, in genere la cartella bin\Debug o bin\Release quando si usa Visual Studio. Se si desidera fornire un
manifesto personalizzato, ad esempio per specificare un livello di esecuzione richiesto di highestAvailable o
requireAdministrator, utilizzare questa opzione per specificare il nome del file.

NOTE
Questa opzione e l'opzione -win32resource ( si escludono a vicenda. Se si tenta di usare entrambe le opzioni nella stessa
riga di comando, si otterrà un errore di compilazione.

Un'applicazione senza un manifesto dell'applicazione che specifica un livello di esecuzione richiesto sarà
soggetta alla virtualizzazione dei file e del Registro di sistema con la funzionalità Controllo account utente in
Windows Vista. Per altre informazioni sulla virtualizzazione, vedere Distribuzione ClickOnce in Windows Vista.
L'applicazione sarà soggetta alla virtualizzazione se si verifica una delle condizioni seguenti:
1. Usare l' -nowin32manifest opzione e non si fornisce un manifesto in un'istruzione di compilazione
successiva o come parte di un file di risorse Windows (res) tramite l' -win32resource opzione.
2. Si indica un manifesto personalizzato che non specifica un livello di esecuzione richiesto.
Visual Studio crea un file manifesto predefinito e lo memorizza nelle directory di debug e versione insieme al
file eseguibile. Per visualizzare o modificare il file app. manifest predefinito, fare clic su Visualizza
impostazioni UAC nella scheda applicazione in Progettazione progetti. Per altre informazioni, vedere
Application Page, Project Designer (Visual Basic).
È possibile fornire il manifesto dell'applicazione come passaggio di post-compilazione personalizzato o come
parte di un file di risorse Win32 utilizzando l' -nowin32manifest opzione. Usare la stessa opzione se si vuole che
l'applicazione sia sottoposta alla virtualizzazione dei file o del Registro di sistema in Windows Vista. In questo
modo si impedisce al compilatore di creare e incorporare un manifesto predefinito nel file PE.
Esempio
Nell'esempio seguente viene illustrato il manifesto predefinito inserito dal compilatore Visual Basic in un file PE.

NOTE
Il compilatore inserisce nel file XML del manifesto un nome applicazione standard MyApplication. app. Si tratta di una
soluzione alternativa per consentire l'esecuzione delle applicazioni in Windows Server 2003 Service Pack 3.

<?xml version="1.0" encoding="utf-8" standalone="yes"?>


<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="asInvoker"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>

Vedi anche
Compilatore della riga di comando di Visual Basic
-nowin32manifest (Visual Basic)
-win32resource
05/03/2021 • 2 minutes to read • Edit Online

Inserisce un file di risorse Win32 nel file di output.

Sintassi
-win32resource:filename

Argomenti
filename
Nome del file di risorse da aggiungere al file di output. Racchiudere il nome file tra virgolette ("") se contiene
uno spazio.

Commenti
È possibile creare un file di risorse Win32 con il compilatore di risorse di Microsoft Windows (RC).
Una risorsa Win32 può contenere informazioni sulla versione o sulla bitmap (icona) che consentono di
identificare l'applicazione in Esplora file . Se non si specifica -win32resource , il compilatore genera le
informazioni sulla versione in base alla versione dell'assembly. Le opzioni -win32resource e -win32icon si
escludono reciprocamente.
Vedere -linkresource ((Visual Basic) per fare riferimento a un file di risorse .NET Framework o -Resource (Visual
Basic) per alleghire un file di risorse .NET Framework.

NOTE
L' -win32resource opzione non è disponibile nell'ambiente di sviluppo di Visual Studio. è disponibile solo quando si
esegue la compilazione dalla riga di comando.

Esempio
Il codice seguente compila In.vb e connette un file di risorse Win32 Rf.res :

vbc -win32resource:rf.res in.vb

Vedi anche
Compilatore della riga di comando di Visual Basic
Esempi di righe di comando di compilazione
Visual Basic opzioni del compilatore elencate per
categoria
18/03/2021 • 8 minutes to read • Edit Online

Il Visual Basic compilatore della riga di comando viene fornito come alternativa alla compilazione di programmi
dall'interno di Visual Studio Integrated Development Environment (IDE). Di seguito è riportato un elenco delle
opzioni del compilatore da riga di comando Visual Basic ordinate in base alla categoria funzionale.
Ogni opzione del compilatore è disponibile in due forme: -opzione e (opzione) . La documentazione mostra
solo la forma -opzione.

Output del compilatore


O P Z IO N E SC O P O

-nologo Elimina i messaggi informativi del compilatore.

-utf8output Visualizza l'output del compilatore usando la codifica UTF-8.

-Verbose Restituisce informazioni supplementari durante la


compilazione.

-modulename:<string> Specificare il nome del modulo di origine

-preferreduilang Specificare una lingua per l'output del compilatore.

Optimization
O P Z IO N E SC O P O

-filealign Specifica la posizione di allineamento per le sezioni del file di


output.

-Ottimizza Abilita/disabilita le ottimizzazioni.

File di output
O P Z IO N E SC O P O

-doc Elabora commenti per la documentazione in un file XML.

-deterministico Fa sì che l'output del compilatore sia un assembly il cui


contenuto binario è identico in tutte le compilazioni se gli
input sono identici.

-netcf Imposta il compilatore in modo che abbia come destinazione


la .NET Compact Framework.
O P Z IO N E SC O P O

-out Specifica un file di output.

-refonly Restituisce solo un assembly di riferimento.

-refout Specifica il percorso di output di un assembly di riferimento.

-destinazione Specifica il formato dell'output.

assembly .NET
O P Z IO N E SC O P O

-addmodule Fa sì che il compilatore renda disponibili per il progetto in


compilazione tutte le informazioni sui tipi presenti nei file
specificati.

-delaysign Specifica se l'assembly avrà firma completa o parziale.

-imports Importa uno spazio dei nomi dall'assembly specificato.

-keycontainer Specifica il nome di un contenitore di chiavi per una coppia di


chiavi allo scopo di assegnare a un assembly un nome sicuro.

-keyfile Specifica un file contenente una chiave o una coppia di chiavi


allo scopo di assegnare a un assembly un nome sicuro.

-LIBPATH Specifica il percorso degli assembly a cui fa riferimento


l'opzione -Reference .

-riferimento Importa metadati da un assembly.

-moduleassemblyname Specifica il nome dell'assembly che conterrà un modulo.

-analyzer Esegue gli analizzatori da questo assembly (forma breve: -a)

-additionalfile Assegna un nome ad altri file che non influiscono


direttamente sulla generazione del codice, ma possono
essere usati dagli analizzatori per produrre errori o avvisi.

Debug/controllo degli errori


O P Z IO N E SC O P O

-bugreport Crea un file contenente informazioni che rendono più


semplice segnalare un bug.

-debug Crea informazioni di debug.

-nowarn Inibisce la capacità del compilatore di generare avvisi.


O P Z IO N E SC O P O

-non interattiva Impedisce al compilatore di visualizzare codice per avvisi ed


errori relativi alla sintassi.

-removeintchecks Disabilita il controllo dell'overflow di Integer.

-warnaserror Alza il livello degli avvisi a errori.

-ruleset:<file> Specificare un file di set di regole che disabilita la diagnostica


specifica.

Guida
O P Z IO N E SC O P O

-? Visualizza le opzioni del compilatore. Questo comando ha la


stessa funzione dell'opzione -help . Non viene effettuata
alcuna compilazione.

-Guida Visualizza le opzioni del compilatore. Questo comando ha la


stessa funzione dell'opzione -? . Non viene effettuata
alcuna compilazione.

Linguaggio
O P Z IO N E SC O P O

-langversion Specificare la versione del linguaggio: 9|9,0|10|10,0|11|11,0.

-optionexplicit Richiede la dichiarazione esplicita delle variabili.

-optionstrict Attiva la semantica dei tipi rigorosa.

-optioncompare Specifica se il confronto si verifica tra stringhe di tipo binario


oppure se usare una semantica basata sul testo specifica
delle impostazioni locali definite.

-optioninfer Consente di usare l'inferenza del tipo di variabile locale nelle


dichiarazioni di variabile.

Preprocessore
O P Z IO N E SC O P O

-definizione Definisce simboli per la compilazione condizionale.

Risorse
O P Z IO N E SC O P O

-linkresource Crea un collegamento a una risorsa gestita.

-risorsa Incorpora una risorsa gestita in un assembly.

-win32icon Inserisce un file ico nel file di output.

-win32resource Inserisce una risorsa Win32 nel file di output.

Varie
O P Z IO N E SC O P O

@ (Specifica di un file di risposta) Specifica un file di risposta.

-baseaddress Specifica l'indirizzo di base di una DLL.

-codepage Specifica la tabella codici da usare per tutti i file del codice
sorgente nella compilazione.

-errorreport Specifica il modo in cui il compilatore di Visual Basic deve


segnalare gli errori interni del compilatore.

-highentropyva Indica al kernel di Windows se un particolare eseguibile


supporta ASLR (Address Space Layout Randomization) a
entropia elevata.

-principale Specifica la classe che contiene la Sub Main procedura da


utilizzare all'avvio.

-noconfig La compilazione non viene eseguita con Vbc.rsp

-nostdlib Indica al compilatore di non fare riferimento alle librerie


standard.

-nowin32manifest Indica al compilatore di non incorporare un manifesto


dell'applicazione nel file eseguibile.

-piattaforma Specifica la piattaforma del processore da impostare come


destinazione del file di output.

-recurse Cerca nelle sottodirectory i file di origine da compilare.

-rootnamespace Specifica uno spazio dei nomi per tutte le dichiarazioni di


tipo.

-sdkpath Specifica il percorso dei file Mscorlib.dll e


Microsoft.VisualBasic.dll.

-vbruntime Indica che il compilatore deve compilare senza un riferimento


alla libreria di runtime di Visual Basic oppure con un
riferimento a una libreria di runtime specifica.
O P Z IO N E SC O P O

-win32manifest Identifica un file manifesto dell'applicazione Win32 definito


dall'utente da incorporare nel file eseguibile di tipo PE di un
progetto.

-parallel[+&#124;-] Specifica se usare la compilazione simultanea (+).

-checksumalgorithm:<alg> Specificare l'algoritmo per il calcolo del checksum del file di


origine archiviato nel file PDB. I valori supportati sono: SHA1
(predefinito) o SHA256.
A causa di problemi di collisione con SHA1, Microsoft
consiglia di SHA256 o meglio.

Vedi anche
Opzioni del compilatore Visual Basic in ordine alfabetico
Gestire le proprietà di progetti e soluzioni
Informazioni di riferimento su .NET Framework
(Visual Basic)
05/03/2021 • 2 minutes to read • Edit Online

In questo argomento vengono forniti i collegamenti alle informazioni sull'utilizzo della libreria di classi .NET
Framework.

Sezioni correlate
Per iniziare
Offre una panoramica completa di .NET Framework, oltre ai collegamenti a risorse aggiuntive.
Panoramica della libreria di classi
Introduce le classi, le interfacce e i tipi di valore che consentono di velocizzare e ottimizzare il processo di
sviluppo e di fornire l'accesso alle funzionalità di sistema.
Guida allo sviluppo
Viene fornita una guida a tutte le aree e attività principali per lo sviluppo di applicazioni, tra cui la creazione, la
configurazione, il debug, la sicurezza e la distribuzione dell'applicazione. Questo argomento fornisce anche
informazioni su programmazione dinamica, interoperabilità, estendibilità, gestione della memoria e Threading.
Strumenti
Vengono descritti gli strumenti che è possibile utilizzare per sviluppare, configurare e distribuire applicazioni
utilizzando tecnologie .NET Framework.
Browser per le API .NET
Fornisce sintassi, esempi di codice e informazioni correlate per ogni classe negli spazi dei nomi .NET Framework.
Specifica del linguaggio Visual Basic
05/03/2021 • 2 minutes to read • Edit Online

La specifica del linguaggio Visual Basic è l'origine autorevole per rispondere a tutte le domande sulla
grammatica e sulla sintassi di Visual Basic. Contiene informazioni dettagliate sul linguaggio, inclusi molti punti
non trattati nella documentazione di riferimento Visual Basic.
La specifica è disponibile nell'Area download Microsoft.
Questo sito contiene la specifica Visual Basic 11. Viene creata dai file markdown contenuti nel repository GitHub
dotnet/vblang.
Le segnalazioni dei problemi relativi alla specifica devono essere create nell'archivio dotnet/vblang. In
alternativa, se si è interessati a correggere eventuali errori riscontrati, è possibile inviare una richiesta pull allo
stesso repository.

Vedi anche
Riferimenti al linguaggio Visual Basic

AVA N TI
Procedure dettagliate relative al linguaggio Visual
Basic
22/03/2020 • 5 minutes to read • Edit Online

Le procedure dettagliate forniscono istruzioni specifiche per scenari comuni, che li rende un ottimo strumento
per apprendere l'utilizzo del prodotto o di una determinata area funzionale.
Scrittura di un programma asincrono
Viene illustrato come creare una soluzione asincrona utilizzando Async e Await.
Dichiarazione e generazione di eventi
Illustra come dichiarare e generare eventi in Visual Basic.
Gestione degli eventiHandling Events
Spiega come gestire gli eventi usando la parola chiave standard WithEvents o le nuove parole chiave
AddHandler / RemoveHandler .

Creazione e implementazione di interfacce


Illustra come dichiarare e implementare le interfacce in Visual Basic.
Definizione delle classi
Descrive la procedura di dichiarazione di una classe e dei relativi campi, proprietà, metodi ed eventi.
Scrittura delle query in Visual Basic
Viene illustrato come utilizzare le funzionalità del linguaggio Visual Basic per scrivere espressioni di
query LINQ (Language-Integrated Query).
Implementazione di IEnumerable(Of T) in Visual Basic
Viene illustrato come creare una classe che implementa l'interfaccia IEnumerable(Of String) e una classe
che implementa l'interfaccia IEnumerator(Of String) per leggere un file di testo una riga alla volta.
Chiamata delle API di Windows
Spiega come usare le istruzioni Declare e chiamare le API di Windows. Include informazioni sull'uso
degli attributi per controllare il marshalling per la chiamata API e su come esporre una chiamata API
come metodo di una classe.
Creazione di oggetti COM con Visual Basic
Illustra come creare oggetti COM in Visual Basic, con e senza il modello di classe COM.
Implementazione dell'ereditarietà con gli oggetti COM
Spiega come usare Visual Basic 6.0 per creare un oggetto COM contenente una classe che verrà poi usata
come classe di base in Visual Basic.
Determinazione della posizione in cui My.Application.Log scrive informazioniDetermining Where
My.Application.Log Writes Information
Descrive le impostazioni predefinite di My.Application.Log e spiega come determinare le impostazioni
dell'applicazione.
Modifica della posizione in cui my.Application.Log scrive informazioni
Spiega come eseguire l'override delle impostazioni predefinite di My.Application.Log e My.Log per
registrare le informazioni sull'evento e fare in modo che l'oggetto Log scriva in altri listener di log.
Filtraggio dell'output di My.Application.LogFiltering My.Application.Log Output
Viene illustrato come modificare il filtro di log predefinito per l'oggetto My.Application.Log .
Creazione di listener di log personalizzatiCreating Custom Log Listeners
Spiega come creare un listener di log personalizzato e configurarlo in modo che resti in ascolto
dell'output dell'oggetto My.Application.Log .
Incorporamento dei tipi da assembly gestiti
Viene descritto come creare un assembly e un programma client che ne incorpori i tipi.
Verifica della complessità delle password (Visual Basic)
Spiega come verificare le caratteristiche delle password complesse e aggiornare un parametro di stringa
con le informazioni sui controlli che una password non ha superato.
Crittografia e decrittografia di stringhe in Visual Basic
Illustra come usare la classe DESCryptoServiceProvider per crittografare e decrittografare le stringhe.
Modifica di file e cartelle in Visual Basic
Illustra come usare le funzioni Visual Basic per determinare informazioni su un file, cercare una stringa in
un file e scrivere in un file.
Modifica di file mediante i metodi .NET Framework
Illustra come usare i metodi .NET Framework per determinare informazioni su un file, cercare una stringa
in un file e scrivere in un file.
Persistenza di un oggetto in Visual Basic
Viene illustrato come creare un oggetto semplice e rendere persistenti i relativi dati in un file.
Procedura dettagliata: supporto test preliminare con la funzionalità di generazione dall'uso
Spiega come eseguire uno sviluppo con test preliminare, in cui prima si scrivono gli unit test e
successivamente il codice sorgente in modo che il test abbia esito positivo.

Potrebbero piacerti anche