Sdílet prostřednictvím


Co je nového pro Visual Basic

Tento článek uvádí názvy klíčových funkcí pro každou verzi jazyka Visual Basic. Podrobné popisy nových a vylepšených funkcí v nejnovějších verzích jazyka najdete v propojených částech.

Aktuální verze

Visual Basic 17.13 / Visual Studio 2026
Nové funkce najdete v sadě Visual Basic 17.13.

Nejnovější sadu .NET SDK si můžete stáhnout ze stránky pro stahování .NET.

Předchozí verze

Visual Basic 17.0 / Visual Studio 2022
Nové funkce najdete v jazyce Visual Basic 17.0.

Visual Basic 16.9 / Visual Studio 2019 verze 16.9
Nové funkce najdete v sadě Visual Basic 16.9.

Visual Basic 16.0 / Visual Studio 2019 verze 16.0
Nové funkce najdete v jazyce Visual Basic 16.0.

Visual Basic 15.5 / Visual Studio 2017 verze 15.5
Nové funkce najdete v jazyce Visual Basic 15.5.

Visual Basic 15.3 / Visual Studio 2017 verze 15.3
Nové funkce najdete v sadě Visual Basic 15.3.

Visual Basic 15 / Visual Studio 2017
Nové funkce najdete v sadě Visual Basic 2017.

Visual Basic / Visual Studio 2015
Nové funkce najdete v jazyce Visual Basic 14.

Visual Basic / Visual Studio 2013
Verze Preview technologií platformy kompilátoru .NET (Roslyn)

Visual Basic / Visual Studio 2012
Async a await klíčová slova, iterátory, atributy informací o volajícím

Visual Basic, Visual Studio 2010
Automaticky implementované vlastnosti, inicializátory kolekcí, implicitní pokračování řádku, dynamická, obecná odchylka spolu/contra, globální přístup k oboru názvů

Visual Basic / Visual Studio 2008
Jazykově integrovaný dotaz (LINQ), literály XML, odvození místního typu, inicializátory objektů, anonymní typy, rozšiřující metody, odvození místního var typu, výrazy lambda, if operátor, částečné metody, typy hodnot s možnou hodnotou null

Visual Basic / Visual Studio 2005
Typ My a pomocné typy (přístup k aplikaci, počítači, systému souborů, síti)

Visual Basic / Visual Studio .NET 2003
Operátory bitového posunu, deklarace proměnné smyčky

Visual Basic / Visual Studio .NET 2002
První verze jazyka Visual Basic .NET

Visual Basic 17.13

Visual Basic 17.13 rozpozná unmanaged obecné omezení. Visual Basic 17.13 rozpozná System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute pro rozlišení metody.

Visual Basic 17.0

Visual Basic 17.0 umožňuje System.Runtime.CompilerServices.CallerArgumentExpressionAttribute.

Visual Basic 16.9

Visual Basic 16.9 umožňuje spotřebu inicializačních vlastností.

Visual Basic 16.0

Visual Basic 16.0 se zaměřuje na poskytování dalších funkcí modulu Visual Basic Runtime (microsoft.visualbasic.dll) do .NET Core. Je to první verze jazyka Visual Basic zaměřená na .NET Core. .NET Core 3.0 přidává části modulu Visual Basic Runtime, které závisí na modelu Windows Forms.

Komentáře povolené na více místech v rámci příkazů

V jazyce Visual Basic 15.5 a starších verzích můžete přidávat komentáře pouze na prázdné řádky, na konci příkazu nebo na konkrétních místech v rámci příkazu, kde je povoleno implicitní pokračování řádku. Počínaje verzí Visual Basic 16.0 můžete také přidat komentáře po explicitním pokračování řádky a v příkazu na řádku, který začíná mezerou a podtržítkem.

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

Optimalizovaný převod s plovoucí desetinou čárkou na celé číslo

V předchozích verzích jazyka Visual Basic nabízel převod hodnot Double a Single na celá čísla relativně nízký výkon. Visual Basic 16.0 výrazně zvyšuje výkon převodů s plovoucí desetinnou čárkou na celá čísla, když předáte hodnotu vrácenou některou z následujících metod do některé z celočíselných převodních funkcí jazyka Visual Basic (CByte, CShort, CInt, CLng, CSByte, CUShort, CUInt a CULng) nebo když hodnota vrácená některou z následujících metod je implicitně přetypována na celočíselný typ a Option Strict je nastaven na Off:

Tato optimalizace umožňuje rychlejší spouštění kódu – až dvakrát rychleji pro kód, který provede velký počet převodů na celočíselné typy. Následující příklad ukazuje několik jednoduchých volání metod, které optimalizace ovlivňuje:

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

Tato optimalizace zkracuje místo zaokrouhlování hodnoty v plovoucí řádové čárce.

Visual Basic 15.5

Neukončující pojmenované argumenty

V jazyce Visual Basic 15.3 a starších verzích, když volání metody zahrnovalo argumenty jak pořadím, tak názvem, jste museli poziční argumenty uvést před pojmenovanými argumenty. Počínaje jazykem Visual Basic 15.5 můžete kombinovat poziční a pojmenované argumenty v libovolném pořadí, pokud jsou všechny argumenty až do posledního pozičního argumentu ve správné pozici. Tato flexibilita je obzvláště užitečná, když pojmenované argumenty usnadňují čtení kódu.

Například následující volání metody má dva poziční argumenty mezi pojmenovaným argumentem. Pojmenovaný argument jasně ukazuje, že hodnota 19 představuje věk.

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

Private Protected Modifikátor přístupu člena

Tato nová kombinace klíčových slov definuje člen, ke kterému mají přístup všichni členové v jeho obsahující třídě, a také typy odvozené z obsahující třídy, ale pouze pokud jsou nalezeny také v obsahujícím sestavení. Vzhledem k tomu, že struktury nelze dědit, můžete použít Private Protected pouze pro členy třídy.

Počáteční šestnáctkový/binární/osmičkový oddělovač

Visual Basic 2017 přidal podporu znaku podtržítka (_) jako oddělovače číslic. Počínaje jazykem Visual Basic 15.5 můžete znak podtržítka použít jako počáteční oddělovač mezi předponou a šestnáctkovými, binárními nebo osmičkovými číslicemi. Následující příklad používá počáteční oddělovač číslic k definování 3 271 948 384 jako šestnáctkové číslo:

Dim number As Integer = &H_C305_F860

Chcete-li použít znak podtržítka jako počáteční oddělovač, musíte do souboru projektu jazyka Visual Basic (*.vbproj) přidat následující prvek:

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

Visual Basic 15.3

Odvození pojmenované řazené kolekce členů

Když přiřadíte hodnotu elementů řazené kolekce členů z proměnných, Visual Basic odvodí název elementů řazené kolekce členů z odpovídajících názvů proměnných. Prvek n-tice nemusíte explicitně pojmenovat. Následující příklad používá inferenci k vytvoření n-tice se dvěma pojmenovanými prvky: state a stateName.

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

Další přepínače kompilátoru

Kompilátor příkazového řádku jazyka Visual Basic teď podporuje možnosti kompilátoru -refout a -refonly pro řízení výstupu referenčních sestavení. Pomocí příkazu -refout definujte výstupní adresář referenčního sestavení. Pomocí parametru -refonly určete, že kompilace vypíše pouze referenční sestavení.

Visual Basic 15

Záznamů

N-tice jsou lehká datová struktura, kterou nejčastěji používáte k vrácení více hodnot z jednoho volání metody. Obvykle platí, že pokud chcete z metody vrátit více hodnot, musíte udělat jednu z následujících možností:

  • Definujte vlastní typ ( Class a nebo Structure). Tato možnost je těžké řešení.

  • Kromě vrácení hodnoty z metody definujte jeden nebo více ByRef parametrů.

Podpora řazených kolekcí členů jazyka Visual Basic umožňuje rychle definovat řazenou kolekci členů, volitelně přiřadit ke svým hodnotám sémantické názvy a rychle načíst jejich hodnoty. Následující příklad zabalí volání TryParse metody a vrátí řazenou kolekci členů.

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

Pak můžete zavolat metodu a zpracovat vrácenou n-tici kódem jako v následujícím příkladu.

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ární literály a oddělovače číslic

Binární literál můžete definovat pomocí předpony &B nebo &b. Kromě toho můžete jako oddělovač číslic použít podtržítko, _abyste zlepšili čitelnost. Následující příklad používá obě funkce k přiřazení Byte hodnoty a k jeho zobrazení jako desítkové, šestnáctkové a binární číslo.

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)      

Další informace najdete v části "Literální přiřazení" datových typů Byte, Integer, Long, Short, SByte, UInteger, ULong a UShort.

Podpora návratových hodnot odkazů jazyka C#

Jazyk C# podporuje návratové hodnoty odkazů. To znamená, že když volající metoda obdrží hodnotu vrácenou odkazem, může změnit hodnotu odkazu. Visual Basic neumožňuje vytvářet metody s návratovými hodnotami typu reference, ale umožňuje využívat a upravovat návratové hodnoty typu reference.

Například následující Sentence třída napsaná v jazyce C# obsahuje metodu FindNext , která najde další slovo ve větě, která začíná zadaným podřetětím. Řetězec se vrátí jako návratová hodnota odkazu a Boolean proměnná předaná odkazem na metodu označuje, zda bylo hledání úspěšné. To znamená, že kromě čtení vrácené hodnoty může volající také upravit a tato změna se projeví ve Sentence třídě.

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

V nejjednodušší podobě můžete upravit slovo nalezené ve větě pomocí kódu jako v následujícím příkladu. Všimněte si, že nepřiřazujete hodnotu metodě, ale výrazu vrácenému metodou, což je návratová hodnota reference.

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.

Problém s tímto kódem je ale ten, že pokud se nenajde shoda, vrátí metoda první slovo. Vzhledem k tomu, že v příkladu se nezkoumá hodnota argumentu Boolean pro zjištění, zda byla nalezena shoda, upraví se první slovo, pokud shoda nalezena není. Následující příklad tento problém opraví nahrazením prvního slova samotným, pokud neexistuje shoda.

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.

Lepším řešením je použít pomocnou metodu, do které je vrácená referenční hodnota předána pomocí odkazu. Pomocná metoda pak může upravit argument předaný odkazem. Následující příklad to dělá.

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.

Další informace naleznete v tématu Referenční vrácené hodnoty.

Visual Basic 14

NameOf

Můžete získat nekvalifikovaný název řetězce typu nebo člena pro použití v chybové zprávě bez pevného kódování řetězce. Tento přístup udržuje kód při refaktoringu správný. Tato funkce je užitečná také pro připojení propojení propojení MVC s modelem view-controller a aktivaci událostí změněných vlastností.

Interpolace řetězců

K vytvoření řetězců použijte interpolační výrazy řetězců. Interpolovaný řetězcový výraz vypadá jako řetězec šablony, který obsahuje výrazy. Interpolovaný řetězec je srozumitelnější s ohledem na argumenty než složené formátování.

Přístup a indexování podmíněného člena s hodnotou Null

Před provedením operace přístupu k členu (?.) nebo indexu?[] () můžete otestovat hodnotu null velmi lehkým syntaktickým způsobem. Tyto operátory pomáhají psát méně kódu pro zpracování kontrol null, zejména pro sestupné do datových struktur. Pokud je levý operand nebo odkaz na objekt null, vrátí operace hodnotu null.

Víceřádkové řetězcové literály

Řetězcové literály můžou obsahovat sekvence newline. Už nepotřebujete původní alternativní řešení použití <xml><![CDATA[...text with newlines...]]></xml>.Value.

Komentáře

Komentáře můžete vložit za implicitní pokračování řádku, uvnitř výrazů inicializátoru a mezi výrazy LINQ.

Inteligentnější plně kvalifikovaný překlad názvů

Vzhledem k takovému kódu, jako je Threading.Thread.Sleep(1000), jazyk Visual Basic použil obor názvů "Threading", zjistil, že je nejednoznačný mezi System.Threading a System.Windows.Threading, a pak nahlásil chybu. Visual Basic teď považuje oba možné obory názvů dohromady. Pokud seznam dokončení zobrazíte, editor sady Visual Studio vypíše členy z obou typů v seznamu dokončení.

Literály data prvního roku

Literály kalendářních dat můžete mít ve formátu yyyy-mm-dd. #2015-03-17 16:10 PM#

Vlastnosti rozhraní jen pro čtení

Vlastnosti rozhraní jen pro čtení můžete implementovat pomocí vlastnosti readwrite. Rozhraní zaručuje minimální funkčnost a nebrání implementační třídě nastavit vlastnost.

TypeOf <expr> IsNot <– typ>

Pro lepší čitelnost kódu teď můžete použít TypeOfIsNot.

ID< upozornění >#Disable a ID upozornění <#Enable>

Můžete zakázat a povolit konkrétní upozornění pro oblasti ve zdrojovém souboru.

Vylepšení komentářů dokumentu XML

Při psaní komentářů k dokumentu získáte inteligentní editor a podporu sestavení pro ověřování názvů parametrů, správné zpracování crefs (například obecných typů a operátorů), obarvení a refaktoring.

Částečné definice modulů a rozhraní

Kromě tříd a struktur můžete deklarovat částečné moduly a rozhraní.

direktivy #Region uvnitř těl metod

Oddělovače oblastí můžete umístit #Region...#End oblasti kdekoli v souboru, uvnitř funkcí a dokonce i přes celé tělo funkce.

Definice přepsání jsou implicitně přetížené.

Pokud do definice přidáte Overrides modifikátor, kompilátor implicitně přidá Overloads , abyste mohli v běžných případech zadat méně kódu.

CObj povoleno v argumentech atributů

Teď můžete použít CObj(...) v argumentech atributů. Dříve kompilátor vrátil chybu s informací, že se nejedná o konstantu.

Deklarování a využívání nejednoznačných metod z různých rozhraní

Dříve následující kód vrátil chyby, které vám bránily v deklarování IMock nebo volání GetDetails (pokud byly tyto metody deklarovány v jazyce 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

Kompilátor teď používá normální pravidla pro rozlišení přetížení, aby vybral nejvhodnější metodu GetDetails ke volání. Relace rozhraní můžete deklarovat v jazyce Visual Basic, jako jsou ty, které jsou znázorněny v ukázce.

Viz také