Condividi tramite


Novità di Visual Basic

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:

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

Tuple

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 ).Structure Questa è una soluzione pesante.

  • Definire uno o più ByRef parametri, 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

NameOf

È 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à.

Interpolazione di stringhe

È 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à.

Tipo TypeOf <expr> IsNot <>

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.

Vedere anche