Sdílet prostřednictvím


Co je nového pro Visual Basic

Toto téma obsahuje seznam klíčových názvů funkcí pro každou verzi 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 tématu 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 tématu Visual Basic 16.0.

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

Visual Basic 15.3 / Visual Studio 2017 verze 15.3
Nové funkce najdete v tématu Visual Basic 15.3.

Visual Basic 15 / Visual Studio 2017
Informace o nových funkcích najdete v tématu Visual Basic 2017.

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

Visual Basic / Visual Studio 2013
Ukázky technologií .NET Compiler Platform ("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 co/contra, globální přístup k oboru názvů

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

Visual Basic / Visual Studio 2005
Typy My typů a pomocných rutin (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 Visual Basic .NET

Visual Basic 16,9

Visual Basic 16,9 umožňuje spotřebu vlastností pouze pro inicializaci.

Visual Basic 16.0

Visual Basic 16.0 se zaměřuje na poskytování dalších funkcí modulu Visual Basic Runtime (microsoft.visualbasic.dll) pro .NET Core a je první verzí Visual Basic zaměřenou na .NET Core. Mnoho částí modulu Visual Basic Runtime závisí na WinForms a tyto části budou přidány v novější verzi Visual Basic.

Komentáře povolené na více místech v příkazech

V Visual Basic 15.8 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 příkazu, kde je povoleno implicitní pokračování řádku. Počínaje 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řevody s plovoucí deseti čárkou na celé číslo

V předchozích verzích Visual Basic nabídl převod hodnot Double a Single na celá čísla relativně nízký výkon. Visual Basic 15,8 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 jedné z následujících metod jedné z vnitřních Visual Basic celočíselné převodní funkce (CByte, CShort, CInt, CLng, CSByte, CUShort, CUInt), nebo pokud je hodnota vrácená některou z následujících metod implicitně přetypována na celočíselný typ, když Možnost Strict je nastavena 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á jsou ovlivněna 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 zkracuje místo zaokrouhlení hodnot s plovoucí desetinnou čárkou.

Visual Basic 15,5

Nekoncové pojmenované argumenty

V Visual Basic 15.3 a starších verzích, kdy volání metody obsahovalo argumenty podle pozice i názvu, musely argumenty pozice před pojmenovanými argumenty. Počínaje Visual Basic 15,5 se mohou poziční a pojmenované argumenty 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 užitečné zejména v případě, že 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 znamená, ž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ě a také typy odvozené z obsahující třídy, ale pouze pokud jsou nalezeny také v obsahující 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ý/osmičkový oddělovač

Visual Basic 2017 jsme přidali podporu znaku podtržítka (_) jako oddělovače číslic. Počínaje Visual Basic 15,5 můžete znak podtržítka použít jako počáteční oddělovač mezi předponou a šestnáctkovou, binární nebo osmičkovou číslicí. 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

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

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

Visual Basic 15,3

Odvození pojmenované 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; nemusíte explicitně pojmenovat element řazené kolekce členů. Následující příklad používá odvozovat 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 Visual Basic nyní 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

N-tice

Ř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 vrátit více hodnot z metody, musíte udělat jednu z těchto věcí:

  • Definujte vlastní typ ( Class nebo Structure). Jedná se o těžké řešení.

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

Visual Basic podpora řazených kolekcí členů umožňuje rychle definovat řazenou kolekci členů, volitelně přiřadit sémantické názvy k hodnotám a rychle načíst jeho 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 metodu volat a zpracovat vrácenou řazenou kolekci členů s kódem následujícím způsobem.

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 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 "Přiřazení literálů" datových typů Byte, Integer, Long, Short, SByte, UInteger, ULong a UShort.

Podpora návratovýchhodnotch

Počínaje jazykem C# 7.0 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 úprava 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, které najdete ve větě, pomocí kódu, jako je následující. Všimněte si, že k metodě nepřiřazujete hodnotu, ale spíše 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, že pokud shoda nebyla nalezena, metoda vrátí první slovo. Vzhledem k tomu, že příklad nezkoumá hodnotu argumentu Boolean a určí, zda je nalezena shoda, upraví první slovo, pokud neexistuje 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 odkazem. 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í návratové 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 kód zůstal při refaktoringu správný. Tato funkce je také užitečná pro připojení odkazů MVC pro model-view-controller a aktivaci událostí změněných vlastností.

Interpolace řetězců

K vytvoření řetězců můžete použít výrazy interpolace ř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í členů s podmínkou null

Před provedením operace přístupu k členům () 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, operace vrátí hodnotu null.

Řetězcové literály s více řádky

Ř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 umístit 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 kód, například Threading.Thread.Sleep(1000), Visual Basic použitý k vyhledání oboru názvů Threading, zjistil, že mezi System.Threading a System.Windows bylo nejednoznačné. Vlákno a pak nahlásit chybu. Visual Basic nyní považuje oba možné obory názvů dohromady. Pokud zobrazíte seznam dokončení, editor Visual Studio vypíše členy z obou typů v seznamu dokončení.

Literály kalendářního data prvního roku

Můžete mít literály kalendářních dat ve formátu rrrr-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 TypeOf s IsNot.

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ř orgánů metod

Oddělovače oblastí #Region...#End oblasti můžete umístit kamkoli do souboru, uvnitř funkcí a dokonce i přes oblasti napříč tělemi funkcí.

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 povolené v argumentech atributů

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

Deklarace 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 zabrá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

Teď kompilátor použije normální pravidla překladu přetížení k výběru nejvhodnějšího GetDetails pro volání a můžete deklarovat relace rozhraní v Visual Basic jako ty, které jsou znázorněny v ukázce.

Viz také