Delen via


Wat is er nieuw voor Visual Basic?

In dit artikel vindt u de namen van belangrijke functies voor elke versie van Visual Basic. Zie de gekoppelde secties voor gedetailleerde beschrijvingen van de nieuwe en verbeterde functies in de nieuwste versies van de taal.

Huidige versie

Visual Basic 17.13 / Visual Studio 2026
Zie Visual Basic 17.13 voor nieuwe functies.

U kunt de nieuwste .NET SDK downloaden via de .NET-downloadpagina.

Vorige versies

Visual Basic 17.0 / Visual Studio 2022
Zie Visual Basic 17.0 voor nieuwe functies.

Visual Basic 16.9 / Visual Studio 2019 versie 16.9
Zie Visual Basic 16.9 voor nieuwe functies.

Visual Basic 16.0 / Visual Studio 2019 versie 16.0
Zie Visual Basic 16.0 voor nieuwe functies.

Visual Basic 15.5 / Visual Studio 2017 versie 15.5
Zie Visual Basic 15.5 voor nieuwe functies.

Visual Basic 15.3 / Visual Studio 2017 versie 15.3
Zie Visual Basic 15.3 voor nieuwe functies.

Visual Basic 15 /Visual Studio 2017
Zie Visual Basic 2017 voor nieuwe functies.

Visual Basic /Visual Studio 2015
Zie Visual Basic 14 voor nieuwe functies.

Visual Basic /Visual Studio 2013
Technologievoorbeelden van het .NET Compiler Platform ('Roslyn')

Visual Basic/Visual Studio 2012
Async en await trefwoorden, iterators, kenmerken van aanroepergegevens

Visual Basic, Visual Studio 2010
Automatisch geïmplementeerde eigenschappen, initialisatiefuncties voor verzamelingen, impliciete regelvervolging, dynamische, algemene co/contra-variantie, toegang tot globale naamruimten

Visual Basic /Visual Studio 2008
Language Integrated Query (LINQ), LETTERLIJKE XML-waarden, deductie van het lokale type, object initializers, anonieme typen, extensiemethoden, deductie van het lokale var type, lambda-expressies, if operator, gedeeltelijke methoden, typen null-waarden

Visual Basic /Visual Studio 2005
Het My type en helpertypen (toegang tot app, computer, bestandssysteem, netwerk)

Visual Basic /Visual Studio .NET 2003
Bit-shift-operators, lusvariabeledeclaratie

Visual Basic/Visual Studio .NET 2002
De eerste release van Visual Basic .NET

Visual Basic 17.13

Visual Basic 17.13 herkent de unmanaged algemene beperking. Visual Basic 17.13 herkent de System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute voor methoderesolutie.

Visual Basic 17.0

Visual Basic 17.0 maakt de System.Runtime.CompilerServices.CallerArgumentExpressionAttribute mogelijk.

Visual Basic 16.9

Visual Basic 16.9 maakt het gebruik van alleen-init-eigenschappen mogelijk.

Visual Basic 16.0

Visual Basic 16.0 is gericht op het leveren van meer functies van Visual Basic Runtime (microsoft.visualbasic.dll) aan .NET Core. Het is de eerste versie van Visual Basic die is gericht op .NET Core. .NET Core 3.0 voegt de onderdelen van de Visual Basic Runtime toe die afhankelijk zijn van Windows Forms.

Opmerkingen die zijn toegestaan op meer plaatsen binnen instructies

In Visual Basic 15.5 en eerdere versies kunt u alleen opmerkingen toevoegen op lege regels, aan het einde van een instructie of op specifieke plaatsen binnen een instructie waarin een impliciete regelvervolging is toegestaan. Vanaf Visual Basic 16.0 kunt u ook opmerkingen toevoegen na expliciete regelvervolgingen en binnen een instructie op een regel die begint met een spatie gevolgd door een onderstrepingsteken.

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

Geoptimaliseerde conversie van drijvende komma naar geheel getal

In eerdere versies van Visual Basic bieden conversie van dubbele en enkele waarden naar gehele getallen relatief slechte prestaties. Visual Basic 16.0 verbetert de prestaties van drijvende-kommaconversies naar gehele getallen wanneer u de waarde die wordt geretourneerd door een van de volgende methoden doorgeeft aan een van de intrinsieke visual Basic-conversiefuncties voor gehele getallen (CByte, CShort, CInt, CLng, CSByte, CUShort, CUInt en CULng), of wanneer de waarde die wordt geretourneerd door een van de volgende methoden impliciet wordt omgezet in een integraal type en Optie strikt is ingesteld op Off:

Met deze optimalisatie kan code sneller worden uitgevoerd, tot twee keer zo snel voor code die een groot aantal conversies naar gehele getallen uitvoert. In het volgende voorbeeld ziet u enkele eenvoudige methode-aanroepen die van invloed zijn op de optimalisatie:

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

Deze optimalisatie kapt af in plaats van kommagetallen af te ronden.

Visual Basic 15.5

Niet-gevolgde benoemde argumenten

In Visual Basic 15.3 en eerdere versies moest u, wanneer een methodeaanroep argumenten op positie en op naam bevatte, positionele argumenten vóór benoemde argumenten plaatsen. Vanaf Visual Basic 15.5 kunt u positionele en benoemde argumenten combineren in elke volgorde, zolang alle argumenten tot het laatste positieargument zich op de juiste positie bevinden. Deze flexibiliteit is met name handig wanneer benoemde argumenten uw code beter leesbaar maken.

De volgende methodeaanroep heeft bijvoorbeeld twee positionele argumenten tussen een benoemd argument. Het benoemde argument maakt duidelijk dat de waarde 19 een leeftijd vertegenwoordigt.

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

Private Protected Wijzigingsfunctie voor lidtoegang

Deze nieuwe trefwoordcombinatie definieert een lid waartoe alle leden in de bijbehorende klasse toegang hebben, evenals typen die zijn afgeleid van de betreffende klasse, maar alleen als ze ook in de bijbehorende assembly worden gevonden. Omdat structuren niet kunnen worden overgenomen, kunt u Private Protected alleen toepassen op de leden van een klasse.

Voorloop hex/binair/octaal scheidingsteken

Visual Basic 2017 heeft ondersteuning toegevoegd voor het onderstrepingsteken (_) als scheidingsteken voor cijfers. Vanaf Visual Basic 15.5 kunt u het onderstrepingsteken gebruiken als voorloopscheidingsteken tussen het voorvoegsel en hexadecimale, binaire of octale cijfers. In het volgende voorbeeld wordt een scheidingsteken voor voorloopcijfer gebruikt om 3.271.948.384 te definiëren als een hexadecimaal getal:

Dim number As Integer = &H_C305_F860

Als u het onderstrepingsteken wilt gebruiken als scheidingsteken voor voorloop, moet u het volgende element toevoegen aan het Visual Basic-project (*.vbproj)-bestand:

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

Visual Basic 15.3

Benoemde tupledeductie

Wanneer u de waarde van tuple-elementen uit variabelen toewijst, wordt in Visual Basic de naam van tuple-elementen afgeleid van de bijbehorende variabelenamen. U hoeft geen tuple-element expliciet een naam te geven. In het volgende voorbeeld wordt deductie gebruikt om een tuple te maken met twee benoemde elementen: state en stateName.

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

Aanvullende compilerswitches

De Visual Basic-opdrachtregelcompilator ondersteunt nu de opties -refout en -refonly compiler om de uitvoer van referentieassembly's te beheren. Gebruik -refout om de uitvoermap van de referentieassembly te definiëren. Gebruik -refonly om op te geven dat de compilatie alleen een referentieassembly uitvoert.

Visual Basic 15

Tupels

Tuples zijn een lichtgewicht gegevensstructuur die u het meest gebruikt om meerdere waarden te retourneren uit één methode-aanroep. Normaal gesproken moet u een van de volgende opties uitvoeren om meerdere waarden uit een methode te retourneren:

  • Een aangepast type definiëren (a Class of a Structure). Deze optie is een zwaargewicht oplossing.

  • Definieer een of meer ByRef parameters, naast het retourneren van een waarde uit de methode.

Met de ondersteuning van Visual Basic voor tuples kunt u snel een tuple definiëren, desgewenst semantische namen toewijzen aan de waarden en snel de waarden ophalen. In het volgende voorbeeld wordt een aanroep naar de TryParse methode verpakt en wordt een tuple geretourneerd.

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

Vervolgens kunt u de methode aanroepen en de geretourneerde tuple afhandelen met code zoals in het volgende voorbeeld.

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

Scheidingstekens voor binaire letterlijke gegevens en cijfers

U kunt een binaire letterlijke waarde definiëren met behulp van het voorvoegsel &B of &b. Daarnaast kunt u het onderstrepingsteken _gebruiken als scheidingsteken voor cijfers om de leesbaarheid te verbeteren. In het volgende voorbeeld worden beide functies gebruikt om een Byte waarde toe te wijzen en deze weer te geven als een decimaal, hexadecimaal en binair getal.

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)      

Zie de sectie Letterlijke toewijzingen van de gegevenstypen Byte, Integer, Long, Short, SByte, UInteger, ULong en UShort voor meer informatie.

Ondersteuning voor C#-referentie retourwaarden

C# ondersteunt retourwaarden voor verwijzingen. Dat wil gezegd dat wanneer de aanroepmethode een waarde ontvangt die wordt geretourneerd door verwijzing, de waarde van de verwijzing kan worden gewijzigd. Visual Basic staat u niet toe methoden te ontwerpen met retourwaarden voor verwijzingen, maar hiermee kunt u de retourwaarden voor verwijzingen gebruiken en wijzigen.

De volgende Sentence klasse die is geschreven in C# bevat bijvoorbeeld een FindNext methode waarmee het volgende woord wordt gevonden in een zin die begint met een opgegeven subtekenreeks. De tekenreeks wordt geretourneerd als een retourwaarde voor verwijzingen en een Boolean variabele die wordt doorgegeven aan de methode, geeft aan of de zoekopdracht is geslaagd. Dit betekent dat naast het lezen van de geretourneerde waarde, de aanroeper deze ook kan wijzigen en die wijziging wordt weerspiegeld in de Sentence klasse.

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 de eenvoudigste vorm kunt u het woord in de zin wijzigen met behulp van code zoals in het volgende voorbeeld. Houd er rekening mee dat u geen waarde toewijst aan de methode, maar aan de expressie die door de methode wordt geretourneerd. Dit is de retourwaarde van de verwijzing.

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.

Een probleem met deze code is echter dat als er geen overeenkomst wordt gevonden, de methode het eerste woord retourneert. Omdat in het voorbeeld de waarde van het Boolean argument niet wordt onderzocht om te bepalen of een overeenkomst wordt gevonden, wordt het eerste woord gewijzigd als er geen overeenkomst is. In het volgende voorbeeld wordt dit probleem opgelost door het eerste woord te vervangen door zichzelf als er geen overeenkomst is.

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.

Een betere oplossing is het gebruik van een helpermethode waarmee de retourwaarde van de verwijzing wordt doorgegeven door verwijzing. De helpermethode kan vervolgens het argument wijzigen dat aan de methode wordt doorgegeven. In het volgende voorbeeld doet u dat.

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.

Zie Referentie-retourwaarden voor meer informatie.

Visual Basic 14

NameOf

U kunt de niet-gekwalificeerde tekenreeksnaam van een type of lid ophalen voor gebruik in een foutbericht zonder dat u een tekenreeks hard hoeft te coderen. Met deze methode blijft uw code correct bij het herstructureren. Deze functie is ook handig voor het koppelen van MVC-koppelingen van modelweergavecontrollers en het activeren van gewijzigde gebeurtenissen van eigenschappen.

Tekenreeksinterpolatie

Gebruik tekenreeksinterpolatie-expressies om tekenreeksen samen te stellen. Een geïnterpoleerde tekenreeksexpressie ziet eruit als een sjabloontekenreeks die expressies bevat. Een geïnterpoleerde tekenreeks is gemakkelijker te begrijpen met betrekking tot argumenten dan samengestelde opmaak.

Toegang tot en indexering van null-voorwaardelijk lid

U kunt op een zeer lichte syntactische manier testen op null voordat u een lidtoegang (?.) of indexbewerking (?[]) uitvoert. Deze operators helpen u minder code te schrijven om null-controles af te handelen, met name voor aflopend in gegevensstructuren. Als de linkeroperand of objectverwijzing null is, retourneert de bewerkingen null.

Letterlijke tekenreeksen met meerdere regels

Letterlijke tekenreeksen kunnen newlinereeksen bevatten. U hebt de oude tijdelijke oplossing voor het gebruik <xml><![CDATA[...text with newlines...]]></xml>.Valueniet meer nodig.

Comments

U kunt opmerkingen plaatsen na impliciete regelvervolgingen, in initialisatie-expressies en tussen LINQ-expressietermen.

Slimmere volledig gekwalificeerde naamomzetting

Op basis van code zoals Threading.Thread.Sleep(1000) keek Visual Basic naar de naamruimte "Threading", ontdekte dat deze dubbelzinnig was tussen System.Threading en System.Windows.Threading, en rapporteerde vervolgens een fout. Visual Basic beschouwt nu beide mogelijke naamruimten samen. Als u de voltooiingslijst weergeeft, bevat de Visual Studio-editor leden uit beide typen in de voltooiingslijst.

Letterlijke datum voor het eerste jaar

U kunt letterlijke datums in jjjj-mm-dd-indeling hebben. #2015-03-17 16:10 PM#

Eigenschappen van leesinterface

U kunt leesinterface-eigenschappen implementeren met behulp van een readwrite-eigenschap. De interface garandeert minimale functionaliteit en stopt niet dat een implementatieklasse toestaat dat de eigenschap kan worden ingesteld.

TypeOf <expr> IsNot-type <>

Voor meer leesbaarheid van uw code kunt u nu gebruiken TypeOf met IsNot.

waarschuwings-id en #Enable waarschuwings-id <><#Disable>

U kunt specifieke waarschuwingen voor regio's in een bronbestand uitschakelen en inschakelen.

Verbeteringen aan xml-documentencommentaar

Bij het schrijven van documentopmerkingen krijgt u een slimme editor en build-ondersteuning voor het valideren van parameternamen, de correcte verwerking van crefs (bijvoorbeeld generics en operators), kleurtoewijzing en refactoren.

Gedeeltelijke module- en interfacedefinities

Naast klassen en structs kunt u gedeeltelijke modules en interfaces declareren.

#Region instructies in methodeteksten

U kunt #Region...#End regioscheidingstekens overal in een bestand, binnen functies plaatsen en zelfs over functies heen.

Definities van onderdrukkingen zijn impliciet overbelast

Als u de Overrides wijzigingsfunctie toevoegt aan een definitie, voegt de compiler impliciet toe Overloads , zodat u in veelvoorkomende gevallen minder code kunt typen.

CObj toegestaan in kenmerkenargumenten

U kunt nu in kenmerkargumenten gebruiken CObj(...) . Voorheen gaf de compiler een foutmelding met de mededeling dat het geen constante was.

Dubbelzinnige methoden van verschillende interfaces declareren en gebruiken

Eerder heeft de volgende code fouten geretourneerd waardoor u geen declaraties IMock of aanroepen GetDetails hebt gedaan (als deze methoden zijn gedeclareerd 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

De compiler maakt nu gebruik van normale regels voor overbelastingsresolutie om de meest geschikte GetDetails methode te kiezen om aan te roepen. U kunt interfacerelaties declareren in Visual Basic, zoals in het voorbeeld.

Zie ook