Sdílet prostřednictvím


Co je nového pro Visual Basic

Tento článek obsahuje seznam klíčových názvů funkcí pro každou verzi jazyka Visual Basic s podrobnými popisy nových a vylepšených funkcí v nejnovějších verzích jazyka.

Aktuální verze

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

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

Předchozí verze

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 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 a je první verzí jazyka Visual Basic zaměřené na .NET Core. V .NET Core 3.0 byly přidány části modulu Visual Basic Runtime, které závisí na winForms.

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

V jazyce Visual Basic 15.5 a starších verzích jsou komentáře povoleny pouze na prázdných řádcích, 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 jazykem Visual Basic 16.0 jsou komentáře také povoleny po explicitních pokračováních řádků a v příkazu na řádku začínajícím mezerou následovanou 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í desetinou čárkou na celá čísla, když předáte hodnotu vrácenou některou z následujících metod jedné z vnitřních celočíselných funkcí jazyka Visual Basic ( CByte, CShort, CInt, CLng, CSByte, CUShort, CUInt, CULng) nebo když hodnota vrácená některou z následujících metod je implicitně přetypována na celočíselný typ, když option Strict je nastavena na Off:

Tato optimalizace umožňuje, aby kód běžel rychleji – 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é jsou ovlivněny touto optimalizací:

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

Všimněte si, že se tím zkrátí místo zaokrouhlení hodnot s plovoucí desetinou čárkou.

Visual Basic 15.5

Neukončující pojmenované argumenty

V jazyce Visual Basic 15.3 a starších verzích byla při volání metody zahrnuté argumenty jak podle pozice, tak podle názvu, poziční argumenty musely předcházet pojmenovaným argumentům. Počínaje jazykem Visual Basic 15.5 se poziční a pojmenované argumenty můžou zobrazovat v libovolném pořadí, pokud jsou všechny argumenty až do posledního pozičního argumentu ve správné pozici. To je zvlášť užitečné, když se pojmenované argumenty používají k tomu, aby byl kód čitelnější.

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, který je přístupný všemi členy v jeho obsahující třídě i typy odvozenými z obsahující třídy, ale pouze pokud jsou nalezeny také v obsahujícím sestavení. Vzhledem k tomu, že struktury nelze dědit, Private Protected lze je použít pouze na č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; není nutné explicitně pojmenovat element řazené kolekce členů. Následující příklad používá odvození k vytvoření řazené kolekce členů se třemi pojmenovanými prvky, state, stateNamea 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

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í. -refout definuje výstupní adresář referenčního sestavení a -refonly určuje, že pouze referenční sestavení má být výstupem kompilací.

Visual Basic 15

Záznamů

Řazené kolekce členů jsou jednoduchá datová struktura, která se nejčastěji používá 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 těchto věcí:

  • Definujte vlastní typ ( Class a nebo Structure). Jedná se o 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 volat metodu a zpracovat vrácenou řazenou kolekci členů pomocí kódu, jako je následující.

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 odkazu, ale umožňuje využívat a upravovat návratové hodnoty odkazu.

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 slovo nalezené ve větě upravit pomocí kódu, jako je následující. Všimněte si, že k metodě nepřiřazujete hodnotu, ale k výrazu, který metoda vrátí, což je návratová hodnota odkazu.

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 příklad nezkoumá hodnotu argumentu Boolean , aby určil, zda je nalezena shoda, upraví první slovo, pokud neexistuje žádná shoda. Následující příklad to 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. To umožňuje, aby váš kód zůstal 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ů můžete použít 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 starou práci s používáním <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 tomu, že Threading.Thread.Sleep(1000)jazyk Visual Basic vyhledá obor názvů "Threading", zjistil, že byl nejednoznačný mezi System.Threading a System.Windows.Threading a pak nahlásit 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 nezastaví implementaci třídy, aby byla vlastnost nastavena.

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 (obecné typy, operátory atd.), 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ů

Kompilátor použitý k zadání chyby, že CObj(...) nebyl konstantou při použití v konstruktech atributů.

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

Dříve následující kód přinesl chyby, které vám bránily v deklarování IMock nebo volání GetDetails (pokud byly 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žije normální pravidla překladu přetížení k výběru nejvhodnější GetDetails pro volání a můžete deklarovat relace rozhraní v jazyce Visual Basic, jako jsou ty, které jsou uvedeny v ukázce.

Viz také