Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo elenca i nomi principali delle funzionalità per ogni versione di Visual Basic, con descrizioni dettagliate delle funzionalità nuove e avanzate nelle versioni più recenti 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 di 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 della piattaforma del compilatore .NET ("Roslyn")
Visual Basic/Visual Studio 2012
Async parole chiave e await , iteratori, attributi di informazioni sul chiamante
Visual Basic, Visual Studio 2010
Proprietà implementate automaticamente, inizializzatori di raccolta, continuazione di riga implicita, dinamica, varianza co/contro generica, accesso dello spazio dei nomi globale
Visual Basic/Visual Studio 2008
Language Integrated Query (LINQ), valori letterali XML, inferenza dei tipi locali, inizializzatori di oggetti, tipi anonimi, metodi di estensione, inferenza del tipo locale var , espressioni lambda, if operatore, metodi parziali, tipi valore nullable
Visual Basic/Visual Studio 2005
Tipi My di tipo e helper (accesso a app, computer, file system, rete)
Visual Basic/Visual Studio .NET 2003
Operatori di spostamento bit, dichiarazione di variabile di ciclo
Visual Basic/ Visual Studio .NET 2002
La prima versione di Visual Basic .NET
Visual Basic 16.9
Visual Basic 16.9 consente l'utilizzo di proprietà solo init.
Visual Basic 16.0
Visual Basic 16.0 è incentrato sulla fornitura di altre funzionalità di Visual Basic Runtime (microsoft.visualbasic.dll) a .NET Core ed è la prima versione di Visual Basic incentrata su .NET Core. Le parti del runtime di Visual Basic che dipendono da WinForms sono state aggiunte in .NET Core 3.0.
Commenti consentiti in più posizioni all'interno di istruzioni
In Visual Basic 15.5 e versioni precedenti, i commenti sono consentiti solo su righe vuote, alla fine di un'istruzione o in posizioni specifiche 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
Conversione da virgola mobile a integer ottimizzata
Nelle versioni precedenti di Visual Basic, la conversione di valori Double e Single in numeri interi offre prestazioni relativamente scarse. Visual Basic 16.0 migliora significativamente le prestazioni delle conversioni a virgola mobile in interi quando si passa il valore restituito da uno dei metodi seguenti a una delle funzioni di conversione intere intrinseche di Visual Basic (CByte, CShort, CInt, CLng, CSByte, CUShort, CUInt, CULng) o quando il valore restituito da uno dei metodi seguenti viene eseguito in modo implicito a un tipo integrale quando Option Strict è impostato su 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 l'esecuzione del codice più veloce, fino al doppio del doppio per il codice che esegue un numero elevato di conversioni in tipi integer. L'esempio seguente illustra alcune semplici chiamate di metodo interessate 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 questo tronca anziché arrotonda i valori a virgola mobile.
Visual Basic 15.5
Argomenti denominati non finali
In Visual Basic 15.3 e versioni precedenti, quando una chiamata al metodo includeva argomenti sia per posizione che per nome, gli argomenti posizionali dovevano precedere gli argomenti denominati. A partire da Visual Basic 15.5, gli argomenti posizionali e denominati possono essere visualizzati in qualsiasi ordine, purché tutti gli argomenti fino all'ultimo argomento posizionale si trovino nella posizione corretta. Ciò è particolarmente utile quando vengono usati argomenti denominati per rendere il codice più leggibile.
Ad esempio, la chiamata al metodo seguente include due argomenti posizionali tra un argomento denominato. L'argomento denominato rende chiaro 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 della classe contenitore, nonché dai tipi derivati dalla classe contenitore, ma solo se vengono trovati anche nell'assembly contenitore. Poiché le strutture non possono essere ereditate, Private Protected possono essere applicate solo ai membri di una classe.
Separatore esadecimale/binario/ottale iniziale
Visual Basic 2017 ha aggiunto il supporto per il 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 le cifre esadecimali, binarie o ottali. L'esempio seguente usa un separatore di cifre iniziale 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 Visual Basic (*.vbproj):
<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>
Visual Basic 15.3
Inferenza della tupla denominata
Quando si assegna il valore degli elementi della tupla dalle variabili, Visual Basic deduce il nome degli elementi della tupla dai nomi delle variabili corrispondenti; non è necessario denominare in modo esplicito un elemento di tupla. Nell'esempio seguente viene usata l'inferenza per creare una tupla con tre elementi denominati, state, stateNamee 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
Opzioni aggiuntive del compilatore
Il compilatore della riga di comando di Visual Basic supporta ora le opzioni del compilatore -refout e -refonly per controllare l'output degli assembly di riferimento. -refout definisce la directory di output dell'assembly di riferimento e -refonly specifica che solo un assembly di riferimento deve essere restituito dalla compilazione.
Visual Basic 15
Le tuple sono una struttura di dati leggera usata più comunemente 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 (o
Class).StructureQuesta è una soluzione pesante.Definire uno o più
ByRefparametri, oltre a restituire un valore dal metodo .
Il supporto di Visual Basic per le tuple consente di definire rapidamente una tupla, assegnare facoltativamente nomi semantici ai relativi valori e recuperarne rapidamente i valori. Nell'esempio seguente viene eseguito il wrapping di una chiamata al TryParse metodo e viene restituita una tupla.
Imports System.Globalization
Public Module NumericLibrary
Public Function ParseInteger(value As String) As (Success As Boolean, Number As Integer)
Dim number As Integer
Return (Integer.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, number), number)
End Function
End Module
È quindi 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. Inoltre, è possibile usare il carattere di sottolineatura, , _come separatore di cifre per migliorare la leggibilità. Nell'esempio seguente vengono usate entrambe le funzionalità per assegnare un Byte valore e per visualizzarlo come 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 "Assegnazioni letterali" dei tipi di dati Byte, Integer, Long, Short, SByte, UInteger, ULong e UShort .
Supporto per i valori restituiti di riferimento per C#
C# supporta i valori restituiti dei riferimenti. Ovvero, quando il metodo chiamante riceve un valore restituito dal riferimento, può modificare il valore del riferimento. Visual Basic non consente di creare metodi con valori restituiti di riferimento, ma consente di utilizzare e modificare i valori restituiti del riferimento.
Ad esempio, la classe seguente Sentence scritta in C# include un FindNext metodo che trova la parola successiva in una frase che inizia con una sottostringa specificata. La stringa viene restituita come valore restituito di riferimento e una Boolean variabile passata per 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();
}
}
Nella forma più semplice, è possibile modificare la parola trovata nella frase usando codice simile al seguente. Si noti che non si assegna un valore al metodo, ma piuttosto all'espressione restituita dal metodo, ovvero il valore restituito dal riferimento.
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.
Un problema con questo codice, tuttavia, è che se non viene trovata una corrispondenza, il metodo restituisce la prima parola. Poiché l'esempio non esamina il valore dell'argomento Boolean per determinare se viene trovata una corrispondenza, modifica la prima parola se non esiste alcuna corrispondenza. Nell'esempio seguente viene corretto il problema sostituendo la prima parola con se stessa se non esiste alcuna 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 a cui viene passato il valore restituito di riferimento per riferimento. Il metodo helper può quindi modificare l'argomento passato per riferimento. L'esempio seguente esegue 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
È possibile ottenere il nome di stringa non qualificato di un tipo o di un membro da usare in un messaggio di errore senza impostare come hardcoded una stringa. Ciò consente al codice di rimanere corretto durante il refactoring. Questa funzionalità è utile anche per associare collegamenti MVC model-view-controller e generare eventi di modifica delle proprietà.
È possibile usare espressioni di interpolazione di stringhe per costruire stringhe. Un'espressione stringa interpolata è simile a una stringa di modello che contiene espressioni. Una stringa interpolata è più semplice da comprendere rispetto agli argomenti rispetto alla formattazione composita.
Accesso e indicizzazione dei membri condizionali Null
È possibile testare i valori Null in modo sintattico molto chiaro prima di eseguire un'operazione di accesso ai membri (?.) o indice (?[]). Questi operatori consentono di scrivere meno codice per gestire i controlli Null, in particolare per la decrescente nelle strutture di dati. Se l'operando sinistro o il riferimento all'oggetto è Null, le operazioni restituiscono null.
Valori letterali stringa a più righe
I valori letterali stringa possono contenere sequenze di nuova riga. Non è più necessario usare il vecchio lavoro <xml><![CDATA[...text with newlines...]]></xml>.Value
Comments
È possibile inserire commenti dopo le continuazioni di riga implicite, all'interno di espressioni di inizializzatore e tra i termini dell'espressione LINQ.
Risoluzione dei nomi completa più intelligente
Dato codice come Threading.Thread.Sleep(1000), Visual Basic usato per cercare lo spazio dei nomi "Threading", individuare che era ambiguo tra System.Threading e System.Windows.Threading e quindi segnalare un errore. Visual Basic ora considera entrambi gli spazi dei nomi possibili insieme. Se viene visualizzato l'elenco di completamento, l'editor di Visual Studio elenca i membri di entrambi i tipi nell'elenco di completamento.
Valori letterali data anno
È possibile avere valori letterali data in formato aaaa-mm-dd, #2015-03-17 16:10 PM#.
Proprietà dell'interfaccia readonly
È possibile implementare le proprietà dell'interfaccia readonly usando una proprietà readwrite. L'interfaccia garantisce la funzionalità minima e non impedisce a una classe di implementazione di consentire l'impostazione della proprietà.
Per una maggiore leggibilità del codice, è ora possibile usare TypeOf con IsNot.
ID> avviso <#Disable e ID avviso <#Enable>
È possibile disabilitare e abilitare avvisi specifici per le aree all'interno di un file di origine.
Miglioramenti ai commenti della documentazione XML
Quando si scrivono commenti del documento, si ottiene un editor intelligente e si compila il supporto per la convalida dei nomi dei parametri, la corretta gestione di crefs (generics, operatori e così via), la colorazione e il refactoring.
Definizioni di interfaccia e modulo parziale
Oltre alle classi e agli struct, è possibile dichiarare moduli e interfacce parziali.
direttive #Region all'interno dei corpi dei metodi
È possibile inserire #Region...#End delimitatori di area in qualsiasi punto di un file, all'interno di funzioni e persino estendersi tra i corpi delle funzioni.
Le definizioni delle sostituzioni sono overload impliciti
Se si aggiunge il Overrides modificatore a una definizione, il compilatore aggiunge Overloads in modo implicito in modo che sia possibile digitare meno codice nei casi comuni.
CObj consentito negli argomenti degli attributi
Il compilatore utilizzato per restituire un errore che CObj(...) non era una costante quando viene usata nelle costruzioni degli attributi.
Dichiarazione e utilizzo di metodi ambigui da interfacce diverse
In precedenza il codice seguente generava errori che impedivano di dichiarare IMock o 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 la più appropriata GetDetails per chiamare ed è possibile dichiarare relazioni di interfaccia in Visual Basic come quelle illustrate nell'esempio.