Neues in Visual BasicWhat's new for 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.This topic lists key feature names for each version of Visual Basic, with detailed descriptions of the new and enhanced features in the lastest version of the language.

Aktuelle VersionCurrent Version

Visual Basic/Visual Studio .NET 2017Visual Basic / Visual Studio .NET 2017
Informationen zu neuen Funktionen finden Sie unter Visual Basic 2017For new features, see Visual Basic 2017

Frühere VersionenPrevious versions

Visual Basic / Visual Studio .NET 2015Visual Basic / Visual Studio .NET 2015
Informationen zu neuen Funktionen finden Sie unter Visual Basic 14For new features, see Visual Basic 14

Visual Basic / Visual Studio .NET 2013Visual Basic / Visual Studio .NET 2013
Technologievorschau von .NET Compiler Platform („Roslyn“)Technology previews of the .NET Compiler Platform (“Roslyn”)

Visual Basic / Visual Studio .NET 2012Visual Basic / Visual Studio .NET 2012
Die Schlüsselwörter Async und await, Iteratoren, AufruferinformationsattributeAsync and await keywords, iterators, caller info attributes

Visual Basic, Visual Studio .NET 2010Visual Basic, Visual Studio .NET 2010
Automatisch implementierte Eigenschaften, Auflistungsinitialisierer, implizite Zeilenfortsetzung, dynamische, generische Ko-/Kontravarianz, Zugriff auf globalen NamespaceAuto-implemented properties, collection initializers, implicit line continuation, dynamic, generic co/contra variance, global namespace access

Visual Basic / Visual Studio .NET 2008Visual 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 WerttypenLanguage Integrated Query (LINQ), XML literals, local type inference, object initializers, anonymous types, extension methods, local var type inference, lambda expressions, if operator, partial methods, nullable value types

Visual Basic / Visual Studio .NET 2005Visual Basic / Visual Studio .NET 2005
Der My-Typ und Hilfstypen (Zugriff auf App, Computer, Dateisystem, Netzwerk)The My type and helper types (access to app, computer, files system, network)

Visual Basic / Visual Studio .NET 2003Visual Basic / Visual Studio .NET 2003
Bitschiebeoperatoren, Deklaration von SchleifenvariablenBit-shift operators, loop variable declaration

Visual Basic / Visual Studio .NET 2002Visual Basic / Visual Studio .NET 2002
Die erste Version von Visual Basic .NETThe first release of Visual Basic .NET

Visual Basic 2017Visual Basic 2017

TupelTuples

Tupel sind einfache Datenstrukturen, die am häufigsten für die Rückgabe von mehreren Werten aus einem einzelnen Methodenaufruf verwendet werden.Tuples are a lightweight data structure that most commonly is used to return multiple values from a single method call. Für gewöhnlich müssen Sie eine der folgenden Aktionen durchführen, um mehrere Werte aus einer Methode zurückzugeben:Ordinarily, to return multiple values from a method, you have to do one of the following:

  • die Definition eines benutzerdefinierten Typs (eine Class oder eine Structure).Define a custom type (a Class or a Structure). Dabei handelt es sich um eine schwierige Lösung.This is a heavyweight solution.

  • die Definition von mindestens einem ByRef-Parameter zusätzlich zur Rückgabe eines Werts aus der MethodeDefine one or more ByRef parameters, in addition to returning a value from the method.

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.Visual Basic's support for tuples lets you quickly define a tuple, optionally assign semantic names to its values, and quickly retrieve its values. In folgendem Beispiel wird ein Aufruf der TryParse-Methode umschlossen und ein Tupel zurückgegeben.The following example wraps a call to the TryParse method and returns a tuple.

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.You can then call the method and handle the returned tuple with code like the following.

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 ZahlentrennzeichenBinary literals and digit separators

Sie können ein binäres Literal definieren, indem Sie die Präfixe &B oder &b verwenden.You can define a binary literal by using the prefix &B or &b. Zusätzlich können Sie einen Unterstrich (_) als Zahlentrennzeichen verwenden, um die Lesbarkeit zu verbessern.In addition, you can use the underscore character, _, as a digit separator to enhance readability. In folgendem Beispiel werden Funktionen sowohl verwendet, um einen Byte-Wert zuzuweisen, als auch um ihn als Dezimal-, Hexadezimal- und binäre Zahl anzuzeigen.The following example uses both features to assign a Byte value and to display it as a decimal, hexadecimal, and binary number.

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.For more information, see the "Literal assignments" section of the Byte, Integer, Long, Short, SByte, UInteger, ULong, and UShort data types.

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

Ab C# 7 unterstützt C# Verweisrückgabewerte.Starting with C# 7, C# supports reference return values. Das heißt, wenn die aufrufende Methode einen von einem Verweis zurückgegebenen Wert erhält, kann sie den Wert des Verweises ändern.That is, when the calling method receives a value returned by reference, it can change the value of the reference. In Visual Basic können Sie keine Methoden mit Verweisrückgabewerten erstellen. Allerdings können Sie Verweisrückgabewerte verarbeiten und modifizieren.Visual Basic does not allow you to author methods with reference return values, but it does allow you to consume and modify the reference return values.

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.For example, the following Sentence class written in C# includes a FindNext method that finds the next word in a sentence that begins with a specified substring. 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.The string is returned as a reference return value, and a Boolean variable passed by reference to the method indicates whether the search was successful. Das bedeutet, dass der Aufrufer nicht nur den Rückgabewert lesen sondern auch modifizieren kann. Diese Modifizierung wird in der Sentence-Klasse widergespiegelt.This means that the caller can not only read the returned value; he or she can also modify it, and that modification is reflected in the Sentence class.

 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.In its simplest form, you can modify the word found in the sentence by using code like the following. 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.Note that you are not assigning a value to the method, but rather to the expression that the method returns, which is the reference return value.

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.A problem with this code, though, is that if a match is not found, the method returns the first word. 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.Since the example does not examine the value of the Boolean argument to determine whether a match is found, it modifies the first word if there is no match. In folgendem Beispiel wird dies korrigiert, indem das erste Wort durch sich selbst ersetzt wird, wenn es keine Übereinstimmung gibt.The following example corrects this by replacing the first word with itself if there is no match.

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.A better solution is to use a helper method to which the reference return value is passed by reference. Die Hilfsmethode kann dann das an sie vom Verweis übergebene Argument modifizieren.The helper method can then modify the argument passed to it by reference. In folgendem Beispiel wird dies getan.The following example does that.

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.For more information, see Reference Return Values.

Visual Basic 14Visual Basic 14

nameofNameof
Sie können den nicht qualifizierten Zeichenfolgennamen eines Typs oder Members zur Verwendung in einer Fehlermeldung ohne Hartcodierung einer Zeichenfolge abrufen.You can get the unqualified string name of a type or member for use in an error message without hard coding a string. Dadurch bleibt der Code bei der Umgestaltung korrekt.This allows your code to remain correct when refactoring. Diese Funktion eignet sich auch zum Einbinden von MVC-Links (Model-View-Controller) und das Auslösen von Ereignissen durch geänderte Eigenschaften.This feature is also useful for hooking up model-view-controller MVC links and firing property changed events.

ZeichenfolgeninterpolationString Interpolation
Sie können Ausdrücke für die Zeichenfolgeninterpolierung zum Erstellen von Zeichenfolgen verwenden.You can use string interpolation expressions to construct strings. Ein Ausdruck für eine interpolierte Zeichenfolge sieht wie eine Vorlagenzeichenfolge aus, die Ausdrücke enthält.An interpolated string expression looks like a template string that contains expressions. Eine interpolierte Zeichenfolge ist in Bezug auf die Argumente leichter zu verstehen als eine Zusammengesetzte Formatierung.An interpolated string is easier to understand with respect to arguments than Composite Formatting.

Memberzugriff und Indizierung mit NULL-BedingungNull-conditional Member Access and Indexing
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.You can test for null in a very light syntactic way before performing a member access (?.) or index (?[]) operation. Mithilfe dieser Operatoren müssen Sie für die Prüfung auf null weniger Code schreiben, insbesondere beim tieferen Eindringen in Datenstrukturen.These operators help you write less code to handle null checks, especially for descending into data structures. Wenn der linke Operand oder Objektverweis NULL ist, geben die Operationen NULL zurück.If the left operand or object reference is null, the operations returns null.

Multi-line String Literals (Mehrzeilige Zeichenfolgenliterale)Multi-line String Literals
Zeichenfolgenliterale können Zeilenumbruchsequenzen enthalten.String literals can contain newline sequences. Sie müssen nicht mehr die alte Problemumgehung mit <xml><![CDATA[...text with newlines...]]></xml>.Value verwenden.You no longer need the old work around of using <xml><![CDATA[...text with newlines...]]></xml>.Value

KommentareComments
Sie können Kommentare nach impliziten Zeilenfortsetzungen, innerhalb von Initialisierungsausdrücken und zwischen LINQ-Ausdrücken einfügen.You can put comments after implicit line continuations, inside initializer expressions, and amongst LINQ expression terms.

Intelligentere Auflösung vollqualifizierter NamenSmarter Fully-qualified Name Resolution
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.Given code such as Threading.Thread.Sleep(1000), Visual Basic used to look up the namespace "Threading", discover it was ambiguous between System.Threading and System.Windows.Threading, and then report an error. Nun berücksichtigt Visual Basic die beiden möglichen Namespaces gemeinsam.Visual Basic now considers both possible namespaces together. Wenn Sie die Vervollständigungsliste anzeigen, listet der Visual Studio-Editor Member beider Typen in der Vervollständigungsliste auf.If you show the completion list, the Visual Studio editor lists members from both types in the completion list.

Datumsliterale mit Jahresangabe am AnfangYear-first Date Literals
Datumsliterale im Format jjjj-mm-tt sind möglich, z. B. #2015-03-17 16:10 PM#.You can have date literals in yyyy-mm-dd format, #2015-03-17 16:10 PM#.

Schreibgeschützte SchnittstelleneigenschaftenReadonly Interface Properties
Sie können mithilfe einer Readwrite-Eigenschaft schreibgeschützte Schnittstelleneigenschaften implementieren.You can implement readonly interface properties using a readwrite property. Die Schnittstelle garantiert Mindestfunktionalität und hindert eine Implementierungsklasse nicht daran, die Festlegung der Eigenschaft zuzulassen.The interface guarantees minimum functionality, and it does not stop an implementing class from allowing the property to be set.

TypeOf <expr> IsNot <type>TypeOf <expr> IsNot <type>
Zur besseren Lesbarkeit des Codes können Sie nun TypeOf mit IsNot verwenden.For more readability of your code, you can now use TypeOf with IsNot.

#Disable Warning< und #Enable Warning <#Disable Warning <ID> and #Enable Warning <ID>
Sie können bestimmte Warnungen für Bereiche innerhalb einer Quelldatei deaktivieren und aktivieren.You can disable and enable specific warnings for regions within a source file.

Verbesserungen bei XML-DokumentationskommentarenXML Doc-comment Improvements
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.When writing doc comments, you get smart editor and build support for validating parameter names, proper handling of crefs (generics, operators, etc.), colorizing, and refactoring.

Partial Module and Interface Definitions (Partielle Modul- und Schnittstellendefinitionen)Partial Module and Interface Definitions
Zusätzlich zu Klassen und Strukturen können Sie partielle Module und Schnittstellen deklarieren.In addition to classes and structs, you can declare partial modules and interfaces.

Partial Module and Interface Definitions (#Region-Direktiven in Methodentexten)#Region Directives inside Method Bodies
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.You can put #Region…#End Region delimiters anywhere in a file, inside functions, and even spanning across function bodies.

Overrides Definitions are Implicitly Overloads (Überschreibungsdefinitionen sind implizite Überladungen)Overrides Definitions are Implicitly Overloads
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.If you add the Overrides modifier to a definition, the compiler implicitly adds Overloads so that you can type less code in common cases.

CObj in Attributargumenten zulässigCObj Allowed in Attributes Arguments
Der Compiler gab gewöhnlich eine Fehlermeldung aus, dass CObj(...) bei Verwendung in Attributkonstruktionen keine Konstante war.The compiler used to give an error that CObj(…) was not a constant when used in attribute constructions.

Deklarieren und Verwenden mehrdeutiger Methoden von unterschiedlichen SchnittstellenDeclaring and Consuming Ambiguous Methods from Different Interfaces
Zuvor führte der folgende Code zu Fehlern, die Sie daran hinderten, IMock zu deklarieren oder GetDetails aufzurufen (wenn diese in C# deklariert waren):Previously the following code yielded errors that prevented you from declaring IMock or from calling GetDetails (if these had been declared 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  

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.Now the compiler will use normal overload resolution rules to choose the most appropriate GetDetails to call, and you can declare interface relationships in Visual Basic like those shown in the sample.

Siehe auchSee also

Neues in Visual Studio 2017What's New in Visual Studio 2017