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 neuesten Version der Sprache aufgelistet.

Aktuelle Version

Visual Basic/Visual Studio .NET 2017
Informationen zu neuen Funktionen finden Sie unter Visual Basic 2017

Frühere Versionen

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

Visual Basic / Visual Studio .NET 2013
Technologievorschau von .NET Compiler Platform („Roslyn“)

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

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

Visual Basic / Visual Studio .NET 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 .NET 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 2017

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 <xref:System.Int32.TryParse%2A>-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 Int32)
        Dim number As Integer
        Return (Int32.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($"{IIf(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.

Unterstützung für Verweisrückgabewerte von C#

Ab C# 7 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 Aufrufer nicht nur den Rückgabewert lesen sondern auch modifizieren kann. Diese Modifizierung 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 Warning< und #Enable Warning <
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 (Generika, 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.

Partial Module and Interface Definitions (#Region-Direktiven 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

Neues in Visual Studio 2017