Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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:
- 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)
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
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
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
Classof aStructure). Deze optie is een zwaargewicht oplossing.Definieer een of meer
ByRefparameters, 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
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.
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.
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.