Wat is er nieuw voor Visual Basic

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.

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

Vorige versies

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 bellergegevens

Visual Basic, Visual Studio 2010
Automatisch geïmplementeerde eigenschappen, verzamelings initializers, impliciete lijnvervolging, dynamische, algemene co/contra variantie, globale naamruimtetoegang

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.

Visual Basic 15,5

Niet-gevolgde benoemde argumenten

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.

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

Private Protected wijziging van lidtoegang

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:

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

Visual Basic 15.3

Benoemde tupledeductie

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.

Visual Basic 15

Tupels

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)      

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

Ondersteuning voor C#-verwijzingswaarden

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.

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

Tekenreeksinterpolatie

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.

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 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 met meerdere regels

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.

TypeOf <expr> IsNot-type <>

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

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

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.

Gedeeltelijke module- en interfacedefinities

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

#Region richtlijnen binnen methode-instanties

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

Onderdrukkingendefinities zijn impliciet overbelast

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.

Zie ook