Freigeben über


Neuerungen für Visual Basic

In diesem Artikel werden wichtige Featurenamen für jede Version von Visual Basic mit detaillierten Beschreibungen der neuen und erweiterten Features in den neuesten Versionen der Sprache aufgeführt.

Aktuelle Version

Visual Basic 16.9 / Visual Studio 2019, Version 16.9
Neue Features finden Sie unter Visual Basic 16.9.

Sie können das neueste .NET SDK von der .NET-Downloadseite herunterladen.

Vorherige Versionen

Visual Basic 16.0 / Visual Studio 2019, Version 16.0
Neue Features finden Sie unter Visual Basic 16.0.

Visual Basic 15.5 / Visual Studio 2017, Version 15.5
Neue Features finden Sie unter Visual Basic 15.5.

Visual Basic 15.3 / Visual Studio 2017, Version 15.3
Neue Features finden Sie unter Visual Basic 15.3.

Visual Basic 15 / Visual Studio 2017
Neue Features finden Sie unter Visual Basic 2017.

Visual Basic / Visual Studio 2015
Neue Features finden Sie unter Visual Basic 14.

Visual Basic / Visual Studio 2013
Technologievorschauen der .NET-Compilerplattform ("Roslyn")

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

Visual Basic, Visual Studio 2010
Automatisch implementierte Eigenschaften, Sammlungsinitialisierer, implizite Zeilenfortsetzung, dynamisch, generische Co/Contra-Varianz, globaler Namespacezugriff

Visual Basic / Visual Studio 2008
Language Integrated Query (LINQ), XML-Literale, lokale Typinference, Objektinitialisierer, anonyme Typen, Erweiterungsmethoden, lokale var Typinference, Lambda-Ausdrücke, if Operator, Partielle Methoden, Nullwertetypen

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

Visual Basic / Visual Studio .NET 2003
Bitverschiebungsoperatoren, 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 den Verbrauch von init-only-Eigenschaften.

Visual Basic 16.0

Visual Basic 16.0 konzentriert sich auf die Bereitstellung weiterer Features der Visual Basic-Runtime (microsoft.visualbasic.dll) für .NET Core und ist die erste Version von Visual Basic, die sich auf .NET Core konzentriert. Die Teile der Visual Basic-Runtime, die von WinForms abhängen, wurden in .NET Core 3.0 hinzugefügt.

Kommentare, die an weiteren Stellen innerhalb von Anweisungen zulässig sind

In Visual Basic 15.5 und früheren Versionen sind Kommentare nur für leere Zeilen, am Ende einer Anweisung oder an bestimmten Stellen innerhalb einer Anweisung zulässig, an denen eine implizite Zeilenfortsetzung zulässig ist. Ab Visual Basic 16.0 sind Kommentare auch nach expliziten Zeilenfortsetzungen und innerhalb einer Anweisung in einer Zeile zulässig, die mit einem Leerzeichen beginnt, gefolgt von einem Unterstrich.

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 Gleitkommakonvertierung in ganze Zahl

In früheren Versionen von Visual Basic bot die Konvertierung von Double - und Single-Werten in ganze Zahlen relativ schlechte Leistung. Visual Basic 16.0 verbessert die Leistung von Gleitkommakonvertierungen erheblich, wenn Sie den von einer der folgenden Methoden zurückgegebenen Wert an eine der systeminternen Visual Basic-Ganzzahlkonvertierungsfunktionen übergeben (CByte, CShort, CInt, CLng, CSByte, CUShort, CUInt, CULng) oder wenn der von einer der folgenden Methoden zurückgegebene Wert implizit in einen integralen Typ umgewandelt wird, wenn Option Strict auf Off:

Mit dieser Optimierung kann Code schneller ausgeführt werden – bis zu doppelt so schnell für Code, der eine große Anzahl von Konvertierungen in ganzzahlige Typen ausführt. Im folgenden Beispiel werden einige einfache Methodenaufrufe veranschaulicht, 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 Gleitkommawerte abgeschnitten und nicht gerundet werden.

Visual Basic 15.5

Nicht nachgestellte benannte Argumente

In Visual Basic 15.3 und früheren Versionen mussten Positionsargumente vor benannten Argumenten stehen, wenn ein Methodenaufruf Argumente sowohl nach Position als auch nach Name enthielt. Beginnend mit Visual Basic 15.5 können positionsale und benannte Argumente in beliebiger Reihenfolge angezeigt werden, solange sich alle Argumente bis zum letzten Positionsargument an der richtigen Position befinden. Dies ist besonders nützlich, wenn benannte Argumente verwendet werden, um Code besser lesbar zu machen.

Der folgende Methodenaufruf weist beispielsweise zwei Positionsargumente zwischen einem benannten Argument auf. Das benannte Argument macht deutlich, dass der Wert 19 ein Alter darstellt.

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

Private Protected Memberzugriffsmodifizierer

Diese neue Schlüsselwortkombination definiert ein Element, auf das alle Member in der enthaltenden Klasse zugreifen können, sowie durch Typen, die von der enthaltenden Klasse abgeleitet werden, aber nur, wenn sie auch in der enthaltenden Assembly gefunden werden. Da Strukturen nicht geerbt werden können, Private Protected können sie nur auf die Member einer Klasse angewendet werden.

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

Visual Basic 2017 hat Unterstützung für das Unterstrichzeichen (_) als Zifferntrennzeichen hinzugefügt. Ab Visual Basic 15.5 können Sie das Unterstrichzeichen als führendes Trennzeichen zwischen präfix- und hexadezimalen, binären oder oktalen Ziffern verwenden. Im folgenden Beispiel wird ein führendes Zifferntrennzeichen verwendet, um 3.271.948.384 als Hexadezimalzahl zu definieren:

Dim number As Integer = &H_C305_F860

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

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

Visual Basic 15.3

Benannte Tupel-Ableitung

Wenn Sie den Wert von Tupelelementen aus Variablen zuweisen, leitet Visual Basic den Namen der Tupelelemente aus den entsprechenden Variablennamen ab; Sie müssen kein Tupelelement explizit benennen. Im folgenden Beispiel wird eine Ableitung verwendet, um ein Tupel mit drei benannten Elementen, state, stateNameund capital.

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 Befehlszeilencompiler von Visual Basic unterstützt jetzt die Compileroptionen "-refout " und "-refonly ", um die Ausgabe von Referenzassemblys zu steuern. -refout definiert das Ausgabeverzeichnis der Referenzassembly, und -refonly gibt an, dass nur eine Referenzassembly per Kompilierung ausgegeben werden soll.

Visual Basic 15

Tupel

Tupel sind eine einfache Datenstruktur, die am häufigsten verwendet wird, um mehrere Werte aus einem einzelnen Methodenaufruf zurückzugeben. Um mehrere Werte aus einer Methode zurückzugeben, müssen Sie eine der folgenden Aktionen ausführen:

  • Definieren eines benutzerdefinierten Typs (a Class oder a Structure). Dies ist eine Schwergewichtslösung.

  • Definieren Sie zusätzlich zum Zurückgeben eines Werts aus der Methode einen oder ByRef mehrere Parameter.

Mit der Unterstützung von Tupeln von Visual Basic können Sie schnell ein Tupel definieren, optional den Werten semantische Namen zuweisen und seine Werte schnell abrufen. Im folgenden Beispiel wird ein Aufruf der TryParse Methode umbrochen 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 der 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 Zifferntrennzeichen

Sie können ein binäres Literal definieren, indem Sie das Präfix oder das Präfix &B verwenden &b. Darüber hinaus können Sie das Unterstrichzeichen als Zifferntrennzeichen verwenden, _um die Lesbarkeit zu verbessern. Im folgenden Beispiel werden beide Features verwendet, um einen Byte Wert zuzuweisen und als dezimale, hexadezimale 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 "Literale Zuordnungen" des Datentyps "Byte", "Integer", "Long", "Short", "SByte", "UInteger", "ULong" und "UShort ".

Unterstützung für Rückgabewerte für C#-Verweise

C# unterstützt Referenzrücklaufwerte. Das heißt, wenn die aufrufende Methode einen wert empfängt, der durch Verweis zurückgegeben wird, kann er den Wert des Verweises ändern. Visual Basic ermöglicht es Ihnen nicht, Methoden mit Verweisrücklaufwerten zu erstellen, aber sie ermöglicht es Ihnen, die Referenzrücklaufwerte zu verwenden und zu ändern.

Die in C# geschriebene folgende Sentence Klasse enthält z. B. eine FindNext Methode, die das nächste Wort in einem Satz findet, der mit einer angegebenen Teilzeichenfolge beginnt. Die Zeichenfolge wird als Verweisrückwert zurückgegeben, und eine Boolean Variable, die durch Verweis auf die Methode übergeben wird, gibt an, ob die Suche erfolgreich war. Dies bedeutet, dass der Aufrufer zusätzlich zum Lesen des zurückgegebenen Werts auch sie ändern kann und diese Änderung in der Sentence Klasse widergespiegelt wird.

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 seiner einfachsten Form können Sie das Wort im Satz ändern, indem Sie Code wie folgt verwenden. Beachten Sie, dass Sie der Methode keinen Wert zuweisen, sondern dem Ausdruck, den die Methode zurückgibt, bei dem es sich um den Verweisrückwert handelt.

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.

Ein Problem mit diesem Code besteht jedoch darin, dass die Methode das erste Wort zurückgibt, wenn keine Übereinstimmung gefunden wird. Da im Beispiel der Wert des Boolean Arguments nicht untersucht wird, um festzustellen, ob eine Übereinstimmung gefunden wird, ändert es das erste Wort, wenn keine Übereinstimmung vorhanden ist. Im folgenden Beispiel wird dies korrigiert, indem das erste Wort durch sich selbst ersetzt wird, wenn keine Übereinstimmung vorhanden ist.

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 bessere Lösung besteht darin, eine Hilfsmethode zu verwenden, an die der Verweisrückwert per Verweis übergeben wird. Die Hilfsmethode kann dann das an sie übergebene Argument anhand eines Verweises ändern. Im folgenden Beispiel wird dies ausgeführt.

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 Referenzrückgabewerte.

Visual Basic 14

NameOf

Sie können den nicht qualifizierten Zeichenfolgennamen eines Typs oder Elements für die Verwendung in einer Fehlermeldung abrufen, ohne eine Zeichenfolge hart zu codieren. Auf diese Weise kann Ihr Code beim Umgestalten korrekt bleiben. Dieses Feature eignet sich auch zum Verbinden von MVC-Verknüpfungen mit Modellansichtscontrollern und auslösen von Ereignisänderungsereignissen von Eigenschaften.

Zeichenfolgeninterpolation

Sie können Zeichenfolgeninterpolationsausdrücke verwenden, um Zeichenfolgen zu erstellen. Ein interpolierter Zeichenfolgenausdruck sieht wie eine Vorlagenzeichenfolge aus, die Ausdrücke enthält. Eine interpolierte Zeichenfolge ist einfacher zu verstehen in Bezug auf Argumente als zusammengesetzte Formatierung.

Zugriff auf Null-bedingte Member und Indizierung

Sie können null auf eine sehr leichte syntaktische Weise testen, bevor Sie einen Memberzugriff (?.) oder einen Indexvorgang (?[]) ausführen. Mit diesen Operatoren können Sie weniger Code schreiben, um NULL-Prüfungen zu behandeln, insbesondere für absteigende Datenstrukturen. Wenn der linke Operand oder objektverweis null ist, gibt die Operation NULL zurück.

Mehrzeilige Zeichenfolgenliterale

Zeichenfolgenliterale können Newlinesequenzen enthalten. Sie benötigen nicht mehr die alte Arbeit bei der Verwendung <xml><![CDATA[...text with newlines...]]></xml>.Value

Kommentare

Sie können Kommentare nach impliziten Zeilenfortsetzungen, in Initialisierungsausdrücken und unter LINQ-Ausdrucksausdrücken einfügen.

Intelligentere vollqualifizierte Namensauflösung

Im angegebenen Code wie Threading.Thread.Sleep(1000)visual Basic, der zum Nachschlagen des Namespaces "Threading" verwendet wurde, ermitteln Sie, dass es zwischen System.Threading und System.Windows.Threading mehrdeutig war, und melden Sie dann einen Fehler. Visual Basic berücksichtigt jetzt beide möglichen Namespaces zusammen. Wenn Sie die Vervollständigungsliste anzeigen, listet der Visual Studio-Editor Mitglieder aus beiden Typen in der Vervollständigungsliste auf.

Jahr-erste Datumsliterale

Sie können Datumsliterale im Format yyyy-mm-dd haben. #2015-03-17 16:10 PM#

Readonly-Schnittstelleneigenschaften

Sie können Readonly-Schnittstelleneigenschaften mithilfe einer Readwrite-Eigenschaft implementieren. Die Schnittstelle garantiert minimale Funktionalität, und sie verhindert nicht, dass eine implementierende Klasse die Festlegung der Eigenschaft zulässt.

TypeOf <Expr> IsNot <type>

Um den Code besser lesbar zu gestalten, können Sie es jetzt verwenden TypeOfIsNot.

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

Sie können bestimmte Warnungen für Regionen in einer Quelldatei deaktivieren und aktivieren.

Verbesserungen beim XML-Dokumentkommentar

Beim Schreiben von Dokumentkommentaren erhalten Sie intelligente Editor- und Buildunterstützung für die Überprüfung von Parameternamen, die ordnungsgemäße Behandlung von crefs (Generika, Operatoren usw.), die Farbanpassung und die Umgestaltung.

Partielle Modul- und Schnittstellendefinitionen

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

#Region Direktiven innerhalb von Methodengremien

Sie können #Region...#End Bereichstrennzeichen an einer beliebigen Stelle in einer Datei, innerhalb von Funktionen und sogar über Funktionskörper hinweg platzieren.

Überschreibungsdefinitionen sind implizit Überladungen

Wenn Sie den Overrides Modifizierer zu einer Definition hinzufügen, wird der Compiler implizit hinzugefügt Overloads , sodass Sie in häufigen Fällen weniger Code eingeben können.

In Attributargumenten zulässiges CObj

Der Compiler, der verwendet wurde, um einen Fehler zu geben, dass CObj(...) bei Verwendung in Attributkonstruktionen keine Konstante war.

Deklarieren und Verwenden von mehrdeutigen Methoden aus verschiedenen Schnittstellen

Zuvor hat der folgende Code Fehler zurückgegeben, die Sie daran gehindert haben, sie zu deklarieren IMock oder aufzurufen GetDetails (wenn diese in C# deklariert wurden):

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

Jetzt verwendet der Compiler normale Überladungsauflösungsregeln, um die für den Aufruf am besten geeignete GetDetails Methode auszuwählen, und Sie können Schnittstellenbeziehungen in Visual Basic wie die im Beispiel gezeigten deklarieren.

Siehe auch