A Visual Basic újdonságai

Ez a témakör felsorolja a Visual Basic egyes verzióinak legfontosabb szolgáltatásneveit, valamint a nyelv legújabb verzióiban elérhető új és továbbfejlesztett funkciók részletes leírását.

Aktuális verzió

Visual Basic 16.9 /Visual Studio 2019 16.9-es verzió
Az új funkciókért lásd Visual Basic 16.9-et.

A legújabb .NET SDK-t a .NET letöltési oldaláról töltheti le.

Korábbi verziók

Visual Basic 16.0 /Visual Studio 2019 16.0-s verzió
Az új funkciókért lásd Visual Basic 16.0-s verziót.

Visual Basic 15.5 / Visual Studio 2017 15.5-ös verzió
Az új funkciókért lásd Visual Basic 15.5-ös verziót.

Visual Basic 15.3 / Visual Studio 2017 15.3-os verzió
Az új funkciókért lásd Visual Basic 15.3-at.

Visual Basic 2017. Visual Studio. 15.
Az új funkciókért lásd: Visual Basic 2017.

Visual Basic / Visual Studio 2015
Az új funkciókért lásd: Visual Basic 14.

Visual Basic / Visual Studio 2013
A .NET Fordítóplatform (Roslyn) technológiai előzetes verziója

Visual Basic / Visual Studio 2012
Async és await kulcsszavak, iterátorok, hívóinformációs attribútumok

Visual Basic, 2010 Visual Studio
Automatikusan implementált tulajdonságok, gyűjtemény inicializálói, implicit sorfolytatás, dinamikus, általános ko/kontra variancia, globális névtér-hozzáférés

Visual Basic / Visual Studio 2008
Language Integrated Query (LINQ), XML-literálok, helyi típusú következtetés, objektum-inicializálók, névtelen típusok, bővítménymetódusok, helyi var típusú következtetés, lambda kifejezések, if operátor, részleges metódusok, nullértékű értéktípusok

Visual Basic / Visual Studio 2005
A My típus- és segédtípusok (hozzáférés az alkalmazáshoz, számítógéphez, fájlrendszerhez, hálózathoz)

Visual Basic / Visual Studio .NET 2003
Bittolódási operátorok, hurokváltozó-deklaráció

Visual Basic / Visual Studio .NET 2002
A Visual Basic .NET első kiadása

Visual Basic 16.9

Visual Basic 16.9 lehetővé teszi a csak inicializálási tulajdonságok használatát.

Visual Basic 16.0

Visual Basic 16.0 a Visual Basic Futtatókörnyezet (microsoft.visualbasic.dll) további funkcióinak a .NET Core-ba való biztosítására összpontosít, és a .NET Core-ra összpontosító Visual Basic első verziója. A Visual Basic Futtatókörnyezet számos része a WinFormstól függ, és ezek a Visual Basic egy későbbi verziójában lesznek hozzáadva.

A megjegyzések több helyen is engedélyezve vannak az utasításokban

A Visual Basic 15.8-as és korábbi verzióiban a megjegyzések csak üres sorokban, egy utasítás végén, vagy egy utasítás azon bizonyos helyeiben engedélyezettek, ahol implicit sorfolytatás engedélyezett. A Visual Basic 16.0-tól kezdődően a megjegyzések explicit sorfolytatások után is engedélyezettek, és egy sorra vonatkozó utasításon belül, szóközzel és aláhúzásjellel kezdődően.

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

Lebegőpontos és egész számra optimalizált átalakítás

A Visual Basic korábbi verzióiban a dupla és az egyszeres értékek egész számokra konvertálása viszonylag gyenge teljesítményt nyújtott. Visual Basic 15,8 jelentősen növeli a lebegőpontos konverziók teljesítményét egész számokra, amikor a következő módszerek bármelyike által visszaadott értéket átadja az egyik belső Visual Basic egész szám konverziós függvénynek (CByte, CShort, CInt, CLng, CSByte, CUShort, CUInt, CULng), vagy ha az alábbi metódusok bármelyike által visszaadott érték implicit módon egy egész típusba kerül, ha A Szigorú beállítás a következőre Offvan állítva:

Ez az optimalizálás lehetővé teszi, hogy a kód gyorsabban fusson – akár kétszer olyan gyorsan, mint az olyan kódok esetében, amelyek nagy számú konverziót végeznek egész számtípusokra. Az alábbi példa néhány egyszerű metódushívást mutat be, amelyekre hatással van ez az optimalizálás:

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

Vegye figyelembe, hogy a lebegőpontos értékek kerekítése helyett ez csonkul.

Visual Basic 15,5

Nem záró elnevezett argumentumok

A Visual Basic 15.3-ban és a korábbi verziókban, amikor egy metódushívás pozíció és név szerint is tartalmazott argumentumokat, a pozícióargumentumoknak elnevezett argumentumokat kellett megelőznie. A Visual Basic 15,5-től kezdődően a pozíció- és a névvel ellátott argumentumok tetszőleges sorrendben megjelenhetnek, amennyiben az utolsó pozícióargumentumig minden argumentum a megfelelő pozícióban van. Ez különösen akkor hasznos, ha elnevezett argumentumokkal olvashatóbbá teszi a kódot.

A következő metódushívás például két pozícióargumentumot foglal el egy megnevezett argumentum között. A megnevezett argumentum egyértelművé teszi, hogy a 19 érték egy kort jelöl.

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

Private Protected taghozzáférés-módosító

Ez az új kulcsszókombináció egy olyan tagot határoz meg, amely a benne lévő osztály összes tagja számára elérhető, valamint az azt tartalmazó osztályból származtatott típusok szerint, de csak akkor, ha azokat a tartalmazó szerelvényben is megtalálja. Mivel a struktúrák nem öröklődhetnek, Private Protected csak az osztály tagjaira alkalmazhatók.

Vezető hexa/bináris/oktális elválasztó

Visual Basic 2017 hozzáadta az aláhúzásjel (_) támogatását számjegyelválasztóként. A Visual Basic 15.5-től kezdve az aláhúzásjelet használhatja vezető elválasztóként az előtag és a hexadecimális, bináris vagy oktális számjegyek között. Az alábbi példa egy kezdő számjegyelválasztót használ a 3 271 948 384 hexadecimális számként való definiálásához:

Dim number As Integer = &H_C305_F860

Ha bevezető elválasztóként szeretné használni az aláhúzásjelet, a következő elemet kell hozzáadnia a Visual Basic projektfájlhoz (*.vbproj):

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

Visual Basic 15.3

Névvel ellátott rekordkövetkeztetés

Amikor változókból rendeli hozzá a rekordelemek értékét, Visual Basic a rekordelemek nevét a megfelelő változónevekből következteti; nem kell explicit módon elneveznie a rekordelemeket. Az alábbi példa következtetéssel hoz létre egy rekordot három elnevezett elemet statestateNametartalmazó , és 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

További fordítókapcsolók

A Visual Basic parancssori fordító mostantól támogatja a -refout és -refonly fordítóbeállításokat a referenciaszerelvények kimenetének szabályozásához. A -refout a referenciaszerelvény kimeneti könyvtárát határozza meg, a -refonly pedig azt határozza meg, hogy csak egy referenciaszerelvény legyen fordítással kimenet.

Visual Basic 15

Rekordok

A Tuples egy egyszerű adatstruktúra, amelyet leggyakrabban egyetlen metódushívás több értékének visszaadására használnak. Ha egy metódusból általában több értéket szeretne visszaadni, az alábbiak egyikét kell elvégeznie:

  • Egyéni típus definiálása (a Class vagy ).Structure Ez egy nehézsúlyú megoldás.

  • Adjon meg egy vagy több ByRef paramétert, valamint adjon vissza egy értéket a metódusból.

Visual Basic rekordok támogatása lehetővé teszi, hogy gyorsan meghatározzon egy rekordot, igény szerint szemantikai neveket rendeljen az értékeihez, és gyorsan lekérje az értékeit. Az alábbi példa becsomagolja a TryParse metódus hívását, és rekordot ad vissza.

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

Ezután meghívhatja a metódust, és az alábbihoz hasonló kóddal kezelheti a visszaadott rekordot.

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áris literálok és számjegyelválasztók

Bináris literál definiálásához használja az előtagot &B vagy &ba . Emellett az aláhúzásjel karaktert _is használhatja számjegyelválasztóként az olvashatóság növelése érdekében. Az alábbi példa mindkét funkcióval hozzárendel egy Byte értéket, és decimális, hexadecimális és bináris számként jeleníti meg.

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)      

További információt a Byte, Integer, Long, Short, SByte, UInteger, ULong és UShort adattípusok "Konstans hozzárendelések" szakaszában talál.

A C#-referencia visszatérési értékeinek támogatása

A C# 7.0-tól kezdve a C# támogatja a hivatkozási visszatérési értékeket. Vagyis amikor a hívó metódus hivatkozás által visszaadott értéket kap, módosíthatja a hivatkozás értékét. Visual Basic nem teszi lehetővé a hivatkozási visszatérési értékekkel rendelkező metódusok elkészítését, de lehetővé teszi a hivatkozási visszatérési értékek használatát és módosítását.

A C# nyelven írt alábbi Sentence osztály például tartalmaz egy metódust FindNext , amely egy adott részsztringgel kezdődő mondatban megkeresi a következő szót. A sztring hivatkozási visszatérési értékként lesz visszaadva, és a Boolean metódusra való hivatkozással átadott változó jelzi, hogy a keresés sikeres volt-e. Ez azt jelenti, hogy a visszaadott érték olvasása mellett a hívó is módosíthatja azt, és ez a módosítás az Sentence osztályban is tükröződik.

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

Legegyszerűbb formájában az alábbihoz hasonló kóddal módosíthatja a mondatban található szót. Vegye figyelembe, hogy nem a metódushoz rendel értéket, hanem a metódus által visszaadott kifejezéshez, amely a hivatkozás visszatérési értéke.

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.

Ezzel a kóddal azonban az a probléma, hogy ha nem talál egyezést, a metódus az első szót adja vissza. Mivel a példa nem vizsgálja az Boolean argumentum értékét annak megállapításához, hogy talál-e egyezést, módosítja az első szót, ha nincs egyezés. Az alábbi példa ezt úgy javítja ki, hogy az első szót önmagára cseréli, ha nincs egyezés.

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.

Jobb megoldás egy segédmetódus használata, amelynek a referencia visszatérési értékét hivatkozással adja át. A segédmetódus ezután hivatkozással módosíthatja a neki átadott argumentumot. Az alábbi példa ezt teszi.

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.

További információ: Referencia visszatérési értékek.

Visual Basic 14

NameOf

Egy típus vagy tag nem minősített sztringnevét lekérheti egy hibaüzenetben sztring kemény kódolása nélkül. Ez lehetővé teszi, hogy a kód helyes maradjon az újrabontáskor. Ez a funkció a modellnézet-vezérlő MVC-hivatkozásainak csatlakoztatásához és a tulajdonságváltozások aktiválásakor is hasznos.

Sztringinterpoláció

Sztringinterpolációs kifejezésekkel sztringeket hozhat létre. Az interpolált sztringkifejezések kifejezéseket tartalmazó sablonsztringnek tűnnek. Az interpolált sztringeket az argumentumok szempontjából könnyebb megérteni, mint az összetett formázást.

Null feltételes taghozzáférés és indexelés

A null értéket nagyon könnyű szintaktikai módon tesztelheti, mielőtt taghozzáférési () vagy indexelési (?.?[]) műveletet hajt végre. Ezek az operátorok segítenek kevesebb kódot írni a null ellenőrzések kezeléséhez, különösen az adatstruktúrákba való csökkenő értékekhez. Ha a bal oldali operandus vagy objektumhivatkozás null, a műveletek null értéket adnak vissza.

Többsoros sztringkonstansok

A sztringkonstansok tartalmazhatnak újsoros sorozatokat. Már nincs szüksége a régi munka körül a használat <xml><![CDATA[...text with newlines...]]></xml>.Value

Megjegyzések

Megjegyzéseket implicit sorfolytatások után, inicializáló kifejezéseken belül és LINQ-kifejezések között is elhelyezhet.

Intelligensebb, teljes névfeloldás

Adott kód, például Threading.Thread.Sleep(1000)a , Visual Basic a "Threading" névtér keresésére szolgál, derítse fel, hogy nem egyértelmű a System.Threading és a System.Windows között. Szálkezelés, majd hiba jelentése. Visual Basic most már mindkét lehetséges névteret együtt tekinti. Ha a befejezési listát jeleníti meg, a Visual Studio szerkesztő a befejezési listában mindkét típusból listázza a tagokat.

Év első dátumkonstansai

Dátumkonstansok yyyy-mm-dd formátumban #2015-03-17 16:10 PM#, .

A könnyen olvasható felület tulajdonságai

Az írásvédett felületi tulajdonságokat írásvédett tulajdonsággal implementálhatja. Az interfész garantálja a minimális funkcionalitást, és nem akadályozza meg, hogy egy implementáló osztály engedélyezze a tulajdonság beállítását.

TypeOf <expr> IsNot <type>

A kód olvashatósága érdekében most már használhatja TypeOf a következővel IsNot: .

#Disable figyelmeztető <azonosító> és #Enable figyelmeztető <azonosító>

A forrásfájlon belüli régiókra vonatkozó figyelmeztetések letilthatók és engedélyezhetők.

XML-dokumentum megjegyzéseinek fejlesztései

A dokumentum megjegyzéseinek írásakor intelligens szerkesztőt kap, és támogatást nyújt a paraméterek nevének ellenőrzéséhez, a megfelelő kezeléshez crefs (általánosak, operátorok stb.), a színezéshez és az újrabontáshoz.

Részleges modul- és felületdefiníciók

Az osztályok és a szerkezetek mellett részleges modulokat és interfészeket is deklarálhat.

#Region irányelvek a metódustesteken belül

A #Region...#End régióelválasztókat bárhol elhelyezheti egy fájlban, függvényeken belül, sőt akár függvénytestekre is kiterjedhet.

A felülbírálások definíciói implicit módon túlterhelések

Ha hozzáadja a Overrides módosítót egy definícióhoz, a fordító implicit módon hozzáadja Overloads , hogy a gyakori esetekben kevesebb kódot írjon be.

Attribútumargumentumokban engedélyezett CObj

A fordító azt a hibát eredményezte, hogy a CObj(...) nem állandó az attribútumszerkezetekben való használat során.

Nem egyértelmű metódusok deklarálása és felhasználása különböző felületekről

Korábban az alábbi kód olyan hibákat eredményezett, amelyek megakadályozták a deklarálást IMock vagy a hívásokat GetDetails (ha ezek C#-ban lettek deklarálva):

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

Most a fordító normál túlterhelésfeloldási szabályokat fog használni a GetDetails legmegfelelőbb hívás kiválasztásához, és Visual Basic deklarálhatja az interfészkapcsolatokat, mint a mintában látható.

Lásd még