Neues in Visual Basic

In diesem Thema sind die Namen der wichtigsten Funktionen für jede Version von Visual Basic mit ausführlichen Beschreibungen der neuen und verbesserten Funktionen in der aktuellen Version der Sprache aufgelistet.

Aktuelle Version

Visual Basic 16.9/Visual Studio 2019 Version 16.9
Informationen zu neuen Features finden Sie unter Visual Basic 16.9.

Sie können das neueste .NET SDK über die .NET-Downloadseite herunterladen.

Frühere Versionen

Visual Basic 16.0/Visual Studio 2019 Version 16.0
Weitere Informationen zu neuen Features finden Sie unter Visual Basic 16.0.

Visual Basic 15.5/Visual Studio 2017 Version 15.5
Informationen zu neuen Features finden Sie unter Visual Basic 15.5.

Visual Basic 15.3/Visual Studio 2017 Version 15.3
Informationen zu neuen Features finden Sie unter Visual Basic 15.3.

Visual Basic 15/Visual Studio 2017
Informationen zu neuen Features finden Sie unter Visual Basic 2017.

Visual Basic/Visual Studio 2015
Informationen zu neuen Features finden Sie unter Visual Basic 14.

Visual Basic/Visual Studio 2013
Technologievorschau der .NET Compiler Platform (Roslyn)

Visual Basic/Visual Studio 2012
Die Schlüsselwörter Async und await, Iteratoren, Aufruferinformationsattribute

Visual Basic, Visual Studio 2010
Automatisch implementierte Eigenschaften, Auflistungsinitialisierer, implizite Zeilenfortsetzung, dynamische, generische Ko-/Kontravarianz, Zugriff auf globalen Namespace

Visual Basic/Visual Studio 2008
Language Integrated Query (LINQ), XML-Literale, lokaler Typrückschluss, Objektinitialisierer, anonyme Typen, Erweiterungsmethoden, lokaler var-Typrückschluss, Lambda-Ausdrücke, if-Operator, partielle Methoden, auf NULL festlegbare Werttypen

Visual Basic/Visual Studio 2005
Der My-Typ und Hilfstypen (Zugriff auf App, Computer, Dateisystem, Netzwerk)

Visual Basic / Visual Studio .NET 2003
Bitschiebeoperatoren, Deklaration von Schleifenvariablen

Visual Basic / Visual Studio .NET 2002
Die erste Version von Visual Basic .NET

Visual Basic 16.9

Visual Basic 16.9 ermöglicht die Verwendung von Init-Only-Eigenschaften.

Visual Basic 16.0

Bei Visual Basic 16.0 liegt der Fokus darauf, weitere Features der Visual Basic-Laufzeit (microsoft.visualbasic.dll) für .NET Core bereitzustellen, und ist die erste Version von Visual Basic, die auf .NET Core ausgelegt ist. Viele Teile der Visual Basic-Laufzeit sind von WinForms abhängig und werden in einer späteren Version von Visual Basic hinzugefügt.

Kommentare sind an weiteren Stellen innerhalb von Anweisungen zulässig

In Visual Basic 15.8 und früheren Versionen sind Kommentare nur in leeren Zeilen, am Ende von Anweisungen oder an bestimmten Stellen in einer Anweisung zulässig, an denen implizite Zeilenfortsetzungen erlaubt sind. Ab Visual Basic 16.0 sind Kommentare auch nach expliziten Zeilenfortsetzungen und innerhalb von Anweisungen in Zeilen zulässig, die mit einem Leerzeichen gefolgt von einem Unterstrich beginnen.

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

Optimierte Konvertierung von Gleitkommazahlen in ganze Zahlen

Frühere Visual Basic-Versionen erzielten beim Konvertieren von doppelten und einzelnen Werten in ganze Zahlen eine relativ schlechte Leistung. Visual Basic 15.8 weist eine deutlich verbesserte Leistung beim Konvertieren von Gleitkomma- in ganze Zahlen auf, wenn Sie den Wert, der durch eine der folgenden Methoden zurückgegeben wird, an eine intrinsische Visual Basic-Konvertierungsfunktion für ganze Zahlen (CByte, CShort, CInt, CLng, CSByte, CUShort, CUInt, CULng) übergeben, oder wenn der durch eine der folgenden Methoden zurückgegebene Wert implizit in einen integralen Typ umgewandelt wird, wenn Option Strict auf Off festgelegt ist:

Dank dieser Optimierung kann Code schneller ausgeführt werden. Code, der viele Ganzzahltypen konvertiert, wird bis zu doppelt so schnell ausgeführt. Das folgende Beispiel veranschaulicht einige einfache Methodenaufrufe, die von dieser Optimierung betroffen sind:

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

Beachten Sie, dass diese Option die Gleitkommawerte kürzt und nicht rundet.

Visual Basic 15.5

Nicht schließende benannte Argumente

In Visual Basic 15.3 und früheren Versionen mussten positionelle vor benannten Argumenten stehen, wenn ein Methodenaufruf sowohl Argumente nach Position als auch nach Namen beinhaltete. Ab Visual Basic 15.5 können positionelle und benannte Argumente in beliebiger Reihenfolge angeordnet werden, solange sich alle Argumente bis zum letzten positionellen Argument an der korrekten Position befinden. Dies ist besonders dann nützlich, wenn benannte Argumente verwendet werden, um Code lesbarer zu machen.

Der folgende Methodenaufruf hat beispielsweise zwei positionelle Argumente zwischen einem benannten Argument. Das benannte Argument gibt an, dass der Wert 19 für ein Alter steht.

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

Zugriffsmodifizierer Private Protected für Member

Diese neue Schlüsselwortkombination definiert einen Member, auf den alle Member seiner enthaltenden Klasse sowie Typen, die von der enthaltenden Klasse abgeleitet sind, zugreifen können, wenn sie sich auch in der enthaltenden Assembly befinden. Da Strukturen nicht geerbt werden können, kann Private Protected nur auf die Member einer Klasse angewendet werden.

Führendes Hexadezimal-/Binär-/Oktaltrennzeichen

Mit Visual Basic 2017 wurde Unterstützung für das Unterstrichzeichen (_) als Zifferntrennzeichen hinzugefügt. Sie können ab Visual Basic 15.5 den Unterstrich als vorangestelltes Trennzeichen zwischen dem Präfix und Hexadezimal-, Binär- oder Oktalziffern verwenden. Im folgenden Beispiel wird ein Trennzeichen für vorangestellte Ziffern verwendet, um 3.271.948.384 als hexadezimale Zahl zu definieren:

Dim number As Integer = &H_C305_F860

Um den Unterstrich als führendes Trennzeichen zu verwenden, müssen Sie der Visual Basic Projektdatei (*.vbproj) das folgende Element hinzufügen:

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

Visual Basic 15.3

Rückschluss auf benannte Tupel

Wenn Sie den Wert von Tupelelementen von Variablen zuweisen, leitet Visual Basic den Namen der Typelelemente von den entsprechenden Variablennamen ab. Sie müssen ein Tupelelement nicht explizit benennen. In folgendem Beispiel werden Rückschlüsse verwendet, um ein Tupel mit drei benannten Elementen, state, stateName und capital, zu erstellen.

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

Zusätzliche Compileroptionen

Der Visual Basic-Befehlszeilencompiler unterstützt nun die zusätzlichen Compileroptionen-refout und -refonly zur Steuerung der Ausgabe von Verweisassemblys. -refout definiert das Ausgabeverzeichnis der Referenzassembly, und -refonly legt fest, dass nur eine Referenzassembly bei der Kompilierung ausgegeben wird.

Visual Basic 15

Tupel

Tupel sind einfache Datenstrukturen, die am häufigsten für die Rückgabe von mehreren Werten aus einem einzelnen Methodenaufruf verwendet werden. Für gewöhnlich müssen Sie eine der folgenden Aktionen durchführen, um mehrere Werte aus einer Methode zurückzugeben:

  • die Definition eines benutzerdefinierten Typs (eine Class oder eine Structure). Dabei handelt es sich um eine schwierige Lösung.

  • die Definition von mindestens einem ByRef-Parameter zusätzlich zur Rückgabe eines Werts aus der Methode

Die Unterstützung für Tupel von Visual Basic erlaubt Ihnen die schnelle Definition von Tupeln, die optionale Zuweisung von semantischen Namen an deren Werte und das schnelle Abrufen dieser Werte. In folgendem Beispiel wird ein Aufruf der TryParse-Methode umschlossen und ein Tupel zurückgegeben.

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

Anschließend können Sie die Methode aufrufen und das zurückgegebene Tupel mit Code wie dem folgenden behandeln.

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

Binäre Literale und Zahlentrennzeichen

Sie können ein binäres Literal definieren, indem Sie die Präfixe &B oder &b verwenden. Zusätzlich können Sie einen Unterstrich (_) als Zahlentrennzeichen verwenden, um die Lesbarkeit zu verbessern. In folgendem Beispiel werden Funktionen sowohl verwendet, um einen Byte-Wert zuzuweisen, als auch um ihn als Dezimal-, Hexadezimal- und binäre Zahl anzuzeigen.

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)      

Weitere Informationen finden Sie im Abschnitt „Zuweisung von Literalen“ der Datentypen Byte, Integer, Long, Short, SByte, UInteger, ULong und UShort.

Support for C# reference return values (Unterstützung für Verweisrückgabewerte von C#)

Ab C# 7.0 unterstützt C# Verweisrückgabewerte. Das heißt, wenn die aufrufende Methode einen von einem Verweis zurückgegebenen Wert erhält, kann sie den Wert des Verweises ändern. In Visual Basic können Sie keine Methoden mit Verweisrückgabewerten erstellen. Allerdings können Sie Verweisrückgabewerte verarbeiten und modifizieren.

Die folgende in C# geschriebene Sentence-Klasse enthält z.B eine FindNext-Methode, die nach dem nächsten Wort in einer Sequenz sucht, die mit einer angegebenen Teilzeichenfolge beginnt. Die Zeichenfolge wird als Verweisrückgabewert zurückgegeben, und eine vom Verweis an die Methode übergebene Boolean-Variable gibt an, ob die Suche Erfolg hatte. Das bedeutet, dass der Rückgabewert nicht nur vom Aufrufer gelesen sondern auch geändert werden kann. Diese Änderung wird in der Sentence-Klasse widergespiegelt.

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();
    }
}

Sie können das in der Sequenz gefundene Wort in seiner einfachsten Form mit Code wie dem folgenden modifizieren. Beachten Sie, dass Sie nicht der Methode sondern dem Ausdruck, den die Methode zurückgibt, einen Wert zuweisen. Dabei handelt es sich um den Verweisrückgabewert.

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.

Bei diesem Code besteht jedoch das Problem, dass die Methode das erste Wort zurückgibt, wenn keine Übereinstimmung gefunden wurde. Da in dem Beispiel nicht der Wert des Boolean-Arguments untersucht wird, um festzustellen, ob eine Übereinstimmung gefunden wurde, wird das erste Wort modifiziert, wenn es keine Übereinstimmung gibt. In folgendem Beispiel wird dies korrigiert, indem das erste Wort durch sich selbst ersetzt wird, wenn es keine Übereinstimmung gibt.

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.

Eine sinnvollere Lösung ist das Verwenden einer Hilfsmethode, an die der Verweisrückgabewert vom Verweis übergeben wird. Die Hilfsmethode kann dann das an sie vom Verweis übergebene Argument modifizieren. In folgendem Beispiel wird dies getan.

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.

Weitere Informationen finden Sie unter Verweisrückgabewerte.

Visual Basic 14

NameOf

Sie können den nicht qualifizierten Zeichenfolgennamen eines Typs oder Members zur Verwendung in einer Fehlermeldung ohne Hartcodierung einer Zeichenfolge abrufen. Dadurch bleibt der Code bei der Umgestaltung korrekt. Diese Funktion eignet sich auch zum Einbinden von MVC-Links (Model-View-Controller) und das Auslösen von Ereignissen durch geänderte Eigenschaften.

Zeichenfolgeninterpolation

Sie können Ausdrücke für die Zeichenfolgeninterpolierung zum Erstellen von Zeichenfolgen verwenden. Ein Ausdruck für eine interpolierte Zeichenfolge sieht wie eine Vorlagenzeichenfolge aus, die Ausdrücke enthält. Eine interpolierte Zeichenfolge ist in Bezug auf die Argumente leichter zu verstehen als eine Zusammengesetzte Formatierung.

Memberzugriff und Indizierung mit NULL-Bedingung

Sie können eine Prüfung auf null auf sehr einfache syntaktische Weise vornehmen, bevor Sie eine Operation für den Memberzugriff (?.) oder die Indizierung (?[]) ausführen. Mithilfe dieser Operatoren müssen Sie für die Prüfung auf null weniger Code schreiben, insbesondere beim tieferen Eindringen in Datenstrukturen. Wenn der linke Operand oder Objektverweis NULL ist, geben die Operationen NULL zurück.

Multi-line string literals (Mehrzeilige Zeichenfolgenliterale)

Zeichenfolgenliterale können Zeilenumbruchsequenzen enthalten. Sie müssen nicht mehr die alte Problemumgehung mit <xml><![CDATA[...text with newlines...]]></xml>.Value verwenden.

Kommentare

Sie können Kommentare nach impliziten Zeilenfortsetzungen, innerhalb von Initialisierungsausdrücken und zwischen LINQ-Ausdrücken einfügen.

Intelligentere Auflösung vollqualifizierter Namen

Bei Code wie Threading.Thread.Sleep(1000) suchte Visual Basic bisher den Namespace "Threading", stellte fest, dass dieser mit "System.Threading" und "System.Windows.Threading" mehrdeutig war und meldete dann einen Fehler. Nun berücksichtigt Visual Basic die beiden möglichen Namespaces gemeinsam. Wenn Sie die Vervollständigungsliste anzeigen, listet der Visual Studio-Editor Member beider Typen in der Vervollständigungsliste auf.

Datumsliterale mit Jahresangabe am Anfang

Datumsliterale im Format jjjj-mm-tt sind möglich, z. B. #2015-03-17 16:10 PM#.

Schreibgeschützte Schnittstelleneigenschaften

Sie können mithilfe einer Readwrite-Eigenschaft schreibgeschützte Schnittstelleneigenschaften implementieren. Die Schnittstelle garantiert Mindestfunktionalität und hindert eine Implementierungsklasse nicht daran, die Festlegung der Eigenschaft zuzulassen.

TypeOf <expr> IsNot <type>

Zur besseren Lesbarkeit des Codes können Sie nun TypeOf mit IsNot verwenden.

#Disable Warnungs-ID <> und #Enable Warnungs-ID <>

Sie können bestimmte Warnungen für Bereiche innerhalb einer Quelldatei deaktivieren und aktivieren.

Verbesserungen bei XML-Dokumentationskommentaren

Beim Schreiben von Dokumentationskommentaren steht intelligente Editor- und Buildunterstützung zum Überprüfen von Parameternamen, ordnungsgemäßer Handhabung von crefs (Generics, Operatoren usw.), Farben und Umgestaltung bereit.

Partial Module and Interface Definitions (Partielle Modul- und Schnittstellendefinitionen)

Zusätzlich zu Klassen und Strukturen können Sie partielle Module und Schnittstellen deklarieren.

#Region directives inside method bodies (#Region-Anweisungen in Methodentexten)

Sie können die Begrenzer #Region...#End Region an einer beliebigen Stelle in einer Datei, innerhalb von Funktionen und sogar Funktionsrümpfe übergreifend einfügen.

Overrides definitions are implicitly overloads (Überschreibungsdefinitionen sind implizite Überladungen)

Wenn Sie den Overrides-Modifizierer zu einer Definition hinzufügen, fügt der Compiler implizit Overloads hinzu, sodass Sie in allgemeinen Fällen weniger Code eingeben können.

CObj in Attributargumenten zulässig

Der Compiler gab gewöhnlich eine Fehlermeldung aus, dass CObj(...) bei Verwendung in Attributkonstruktionen keine Konstante war.

Deklarieren und Verwenden mehrdeutiger Methoden von unterschiedlichen Schnittstellen

Zuvor führte der folgende Code zu Fehlern, die Sie daran hinderten, IMock zu deklarieren oder GetDetails aufzurufen (wenn diese in C# deklariert waren):

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

Nun verwendet der Compiler normale Regeln zur Überladungsauflösung, um die am besten geeignete GetDetails-Methode zum Aufrufen auszuwählen, und Sie können Schnittstellenbeziehungen in Visual Basic deklarieren, wie sie im Beispiel gezeigt sind.

Siehe auch