In dit onderwerp vindt u de belangrijkste functienamen voor elke versie van Visual Basic, met gedetailleerde beschrijvingen van de nieuwe en verbeterde functies in de nieuwste versies van de taal.
Huidige versie
Visual Basic 16.9 / Visual Studio 2019 versie 16.9
Zie Visual Basic 16.9 voor nieuwe functies.
Visual Basic/Visual Studio 2008
Language Integrated Query (LINQ), XML-letterlijke waarden, deductie van het lokale type, object initialisatiefuncties, anonieme typen, extensiemethoden, deductie van het lokale var type, lambda-expressies, if operator, gedeeltelijke methoden, null-waardetypen
Visual Basic/Visual Studio 2005
Het My type en helpertypen (toegang tot app, computer, bestandssysteem, netwerk)
Visual Basic/Visual Studio .NET 2003
Operatoren voor bit-shift, declaratie van lusvariabelen
Visual Basic /Visual Studio .NET 2002
De eerste release van Visual Basic .NET
Visual Basic 16.9
Visual Basic 16.9 maakt het verbruik van alleen-init-eigenschappen mogelijk.
Visual Basic 16.0
Visual Basic 16.0 richt zich op het leveren van meer functies van de Visual Basic Runtime (microsoft.visualbasic.dll) aan .NET Core en is de eerste versie van Visual Basic gericht op .NET Core. Veel gedeelten van de Visual Basic Runtime zijn afhankelijk van WinForms en deze worden toegevoegd in een latere versie van Visual Basic.
Opmerkingen die zijn toegestaan op meer plaatsen binnen instructies
In Visual Basic 15.8 en eerdere versies zijn opmerkingen alleen toegestaan 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 zijn opmerkingen ook toegestaan 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 biedt de conversie van dubbele en enkele waarden naar gehele getallen relatief slechte prestaties. Visual Basic 15.8 verbetert de prestaties van drijvendekommaconversies naar gehele getallen aanzienlijk wanneer u de waarde die door een van de volgende methoden wordt geretourneerd doorgeeft aan een van de intrinsieke Visual Basic conversiefuncties voor gehele getallen (CByte, CShort, CInt, CLng, CSByte, CUShort, CUInt, CULng) of wanneer de waarde die door een van de volgende methoden wordt geretourneerd, impliciet wordt gecast naar een integraal type wanneer Optie Strikt is ingesteld opOff:
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 worden beïnvloed door deze 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
Houd er rekening mee dat deze afkappen in plaats van drijvendekommawaarden af te ronden.
In Visual Basic 15.3 en eerdere versies, moesten bij een methode-aanroep argumenten zowel op positie als op naam worden voorafgegaan door benoemde argumenten. Vanaf Visual Basic 15,5 kunnen positionele en benoemde argumenten in elke volgorde worden weergegeven zolang alle argumenten tot aan het laatste positieargument op de juiste positie staan. Dit is met name handig wanneer benoemde argumenten worden gebruikt om code beter leesbaar te maken.
De volgende methode-aanroep heeft bijvoorbeeld twee positieargumenten tussen een benoemd argument. Het benoemde argument maakt duidelijk dat de waarde 19 een leeftijd vertegenwoordigt.
Met deze nieuwe combinatie van trefwoorden wordt een lid gedefinieerd dat toegankelijk is voor alle leden in de bijbehorende klasse en door typen die zijn afgeleid van de inhoudsklasse, maar alleen als ze ook worden gevonden in de bijbehorende assembly. Omdat structuren niet kunnen worden overgenomen, Private Protected kunnen alleen worden toegepast op de leden van een klasse.
Voorloop-hex/binair/octaal scheidingsteken
Visual Basic 2017 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 als voorloopscheidingsteken wilt gebruiken, moet u het volgende element toevoegen aan uw Visual Basic project (*.vbproj)-bestand:
Wanneer u de waarde van tuple-elementen uit variabelen toewijst, wordt Visual Basic de naam van tuple-elementen afgeleid van de bijbehorende namen van variabelen. U hoeft geen tuple-element expliciet een naam te geven. In het volgende voorbeeld wordt deductie gebruikt om een tuple te maken met drie benoemde elementen, stateen stateNamecapital.
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
Extra compilerswitches
De Visual Basic opdrachtregelcomppilatie ondersteunt nu de opties -refout en -refonly compiler om de uitvoer van referentieassembly's te beheren. -refout definieert de uitvoermap van de referentieassembly en -refonly geeft aan dat alleen een verwijzingsassembly moet worden uitgevoerd door compilatie.
Tuples zijn een lichtgewicht gegevensstructuur die meestal wordt gebruikt om meerdere waarden te retourneren uit één methode-aanroep. Normaal gesproken moet u een van de volgende handelingen uitvoeren om meerdere waarden van een methode te retourneren:
Een aangepast type definiëren (a Class of a Structure). Dit is een zwaargewicht oplossing.
Definieer een of meer ByRef parameters, naast het retourneren van een waarde uit de methode.
met Visual Basic ondersteuning voor tuples kunt u snel een tuple definiëren, desgewenst semantische namen toewijzen aan de waarden en snel de waarden ervan 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 hieronder.
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 getal 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)
Vanaf C# 7.0 ondersteunt C# retourwaarden voor verwijzingen. Dat wil gezegd hebben dat wanneer de aanroepmethode een waarde ontvangt die wordt geretourneerd door verwijzing, de waarde van de verwijzing kan worden gewijzigd. Visual Basic kunt u geen methoden maken met waarden voor verwijzingsresources, maar hiermee kunt u de retourwaarden van de verwijzing gebruiken en wijzigen.
De volgende Sentence klasse die in C# is geschreven, 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 verwijzing 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 doorgevoerd 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 hieronder. 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 gecorrigeerd 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 het argument wordt doorgegeven door verwijzing. 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.
U kunt de niet-gekwalificeerde tekenreeksnaam van een type of lid ophalen voor gebruik in een foutbericht zonder dat u een tekenreeks hoeft te coderen. Hierdoor kan uw code correct blijven bij het herstructureren. Deze functie is ook handig voor het koppelen van MVC-koppelingen van modelweergavecontrollers en het activeren van gewijzigde gebeurtenissen van eigenschappen.
U kunt tekenreeksinterpolatie-expressies gebruiken om tekenreeksen te maken. 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.
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 voor het afhandelen van null-controles, met name voor aflopend in gegevensstructuren. Als de linkeroperand of objectverwijzing null is, retourneert de bewerkingen null.
Letterlijke tekenreeksen kunnen newlinereeksen bevatten. U hebt het oude werk om te gebruiken niet meer nodig <xml><![CDATA[...text with newlines...]]></xml>.Value
Opmerkingen
U kunt opmerkingen plaatsen na impliciete regelvervolgingen, in initialisatie-expressies en tussen LINQ-expressietermen.
Slimmere volledig gekwalificeerde naamomzetting
Gezien code zoals Threading.Thread.Sleep(1000), Visual Basic gebruikt om de naamruimte Threading op te zoeken, detecteert u dat het dubbelzinnig was tussen System.Threading en System.Windows. Threading en vervolgens een fout melden. 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 hebben in de notatie jjjj-mm-dd, #2015-03-17 16:10 PM#.
Eigenschappen van leesinterface
U kunt leesinterface-eigenschappen implementeren met behulp van een eigenschap readwrite. De interface garandeert minimale functionaliteit en stopt niet dat een implementatieklasse de eigenschap kan instellen.
U kunt specifieke waarschuwingen voor regio's in een bronbestand uitschakelen en inschakelen.
Verbeteringen aan opmerkingen in XML-documenten
Bij het schrijven van documentopmerkingen krijgt u slimme editor en bouwt u ondersteuning voor het valideren van parameternamen, de juiste verwerking van crefs (generics, operators, enzovoort), het kleuren en herstructureren.
Als u de Overrides wijzigingsfunctie aan een definitie toevoegt, voegt de compiler impliciet toe Overloads , zodat u in veelvoorkomende gevallen minder code kunt typen.
CObj toegestaan in kenmerkargumenten
De compiler gebruikte om een fout te geven dat CObj(...) geen constante was bij gebruik in kenmerkconstructies.
Dubbelzinnige methoden van verschillende interfaces declareren en gebruiken
Voorheen heeft de volgende code fouten opgeleverd waardoor u geen declaraties IMock of aanroepen GetDetails hebt gedaan (als deze 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
Nu gebruikt de compiler normale regels voor overbelastingsresolutie om de meest geschikte GetDetails aanroep te kiezen en kunt u interfacerelaties declareren in Visual Basic zoals in het voorbeeld.
Gebruik de functionaliteit uit de .NET-klassebibliotheek door methoden aan te roepen waarmee waarden worden geretourneerd, invoerparameters worden geaccepteerd en meer.