Udostępnij przez


Co nowego w visual basic

W tym artykule wymieniono kluczowe nazwy funkcji dla każdej wersji języka Visual Basic. Aby uzyskać szczegółowe opisy nowych i rozszerzonych funkcji w najnowszych wersjach języka, zobacz połączone sekcje.

Bieżąca wersja

Visual Basic 17.13 / Visual Studio 2026
Aby uzyskać informacje o nowych funkcjach, zobacz Visual Basic 17.13.

Najnowszy zestaw .NET SDK można pobrać ze strony pobierania platformy .NET.

Poprzednie wersje

Visual Basic 17.0 / Visual Studio 2022
Aby uzyskać informacje o nowych funkcjach, zobacz Visual Basic 17.0.

Visual Basic 16.9 / Visual Studio 2019 w wersji 16.9
Aby uzyskać informacje o nowych funkcjach, zobacz Visual Basic 16.9.

Visual Basic 16.0 / Visual Studio 2019 w wersji 16.0
Aby uzyskać informacje o nowych funkcjach, zobacz Visual Basic 16.0.

Visual Basic 15.5 / Visual Studio 2017 w wersji 15.5
Aby uzyskać informacje o nowych funkcjach, zobacz Visual Basic 15.5.

Visual Basic 15.3 / Visual Studio 2017 w wersji 15.3
Aby uzyskać informacje o nowych funkcjach, zobacz Visual Basic 15.3.

Visual Basic 15 / Visual Studio 2017
Aby uzyskać informacje o nowych funkcjach, zobacz Visual Basic 2017.

Visual Basic/ Visual Studio 2015
Aby uzyskać informacje o nowych funkcjach, zobacz Visual Basic 14.

Visual Basic/ Visual Studio 2013
Wersje zapoznawcze technologii platformy kompilatora .NET ("Roslyn")

Visual Basic/ Visual Studio 2012
Async i await słowa kluczowe, iteratory, atrybuty informacji o obiekcie wywołującym

Visual Basic, Visual Studio 2010
Automatycznie zaimplementowane właściwości, inicjatory kolekcji, niejawna kontynuacja wiersza, dynamiczny, ogólny co/contra variance, globalny dostęp do przestrzeni nazw

Visual Basic/ Visual Studio 2008
Zapytanie zintegrowane z językiem (LINQ), literały XML, wnioskowanie typu lokalnego, inicjatory obiektów, typy anonimowe, metody rozszerzeń, wnioskowanie typu lokalnego var , wyrażenia lambda, if operator, metody częściowe, typy wartości dopuszczanych do wartości null

Visual Basic/ Visual Studio 2005
My Typy typów i pomocnika (dostęp do aplikacji, komputera, systemu plików, sieci)

Visual Basic/Visual Studio .NET 2003
Operatory przesunięcia bitowego, deklaracja zmiennej pętli

Visual Basic/Visual Studio .NET 2002
Pierwsza wersja programu Visual Basic .NET

Visual Basic 17.13

Program Visual Basic 17.13 rozpoznaje unmanaged ograniczenie ogólne. Program Visual Basic 17.13 rozpoznaje System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute dla rozwiązywania metod.

Visual Basic 17.0

Program Visual Basic 17.0 włącza element System.Runtime.CompilerServices.CallerArgumentExpressionAttribute.

Visual Basic 16.9

Program Visual Basic 16.9 umożliwia użycie właściwości tylko do inicjowania.

Visual Basic 16.0

Visual Basic 16.0 koncentruje się na dostarczaniu większej liczby funkcji środowiska Visual Basic Runtime (microsoft.visualbasic.dll) do platformy .NET Core. Jest to pierwsza wersja języka Visual Basic skoncentrowana na platformie .NET Core. Platforma .NET Core 3.0 dodaje części środowiska uruchomieniowego Visual Basic, które są zależne od formularzy systemu Windows.

Komentarze dozwolone w większej ilości miejsc w instrukcjach

W języku Visual Basic 15.5 i starszych wersjach można dodawać komentarze tylko na pustych wierszach, na końcu instrukcji lub w określonych miejscach w instrukcji, w których dozwolona jest niejawna kontynuacja wiersza. Począwszy od języka Visual Basic 16.0, można również dodawać komentarze po jawnych kontynuacjach wiersza i w instrukcji w wierszu rozpoczynającym się od spacji, po której następuje podkreślenie.

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

Zoptymalizowana konwersja zmiennoprzecinkowa na liczbę całkowitą

W poprzednich wersjach języka Visual Basic konwersja wartości Double i Single na liczby całkowite oferowała stosunkowo niską wydajność. Visual Basic 16.0 znacznie zwiększa wydajność konwersji liczb zmiennoprzecinkowych na całkowite po przekazaniu wartości zwracanej przez dowolną z poniższych metod do jednej z funkcji konwersji liczb całkowitych w Visual Basic (CByte, CShort, CInt, CLng, CSByte, CUShort, CUInt i CULng) lub gdy wartość zwracana przez dowolną z poniższych metod jest niejawnie rzutowana na typ całkowity, a Option Strict jest ustawiona na Off:

Ta optymalizacja umożliwia szybsze uruchamianie kodu — nawet dwa razy szybciej w przypadku kodu, który wykonuje dużą liczbę konwersji na typy całkowite. Poniższy przykład ilustruje kilka prostych wywołań metod, które ma wpływ na optymalizację:

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

Ta optymalizacja obcina zamiast zaokrągla wartości zmiennoprzecinkowe.

Visual Basic 15.5

Argumenty nazwane inne niż końcowe

W języku Visual Basic 15.3 i starszych wersjach, gdy wywołanie metody obejmowało argumenty zarówno według pozycji, jak i nazwy, trzeba było umieścić argumenty pozycyjne przed nazwami argumentów. Począwszy od języka Visual Basic 15.5, można mieszać argumenty pozycyjne i nazwane w dowolnej kolejności, o ile wszystkie argumenty do ostatniego argumentu pozycyjnego znajdują się w prawidłowej pozycji. Ta elastyczność jest szczególnie przydatna, gdy argumenty nazwane sprawiają, że kod jest bardziej czytelny.

Na przykład następujące wywołanie metody ma dwa argumenty pozycyjne między nazwanym argumentem. Nazwany argument wyjaśnia, że wartość 19 reprezentuje wiek.

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

Private Protected modyfikator dostępu do składowych

Ta nowa kombinacja słowa kluczowego definiuje składową, do której mogą uzyskiwać dostęp wszystkie elementy członkowskie w swojej klasie zawierającej, a także typy pochodzące z zawierającej klasy, ale tylko wtedy, gdy znajdują się one również w zestawie zawierającym. Ponieważ struktury nie mogą być dziedziczone, można stosować Private Protected tylko do składowych klasy.

Wiodący separator szesnastkowy/binarny/ósemkowy

Program Visual Basic 2017 dodał obsługę znaku podkreślenia (_) jako separatora cyfr. Począwszy od języka Visual Basic 15.5, można użyć znaku podkreślenia jako separatora wiodącego między prefiksem a cyframi szesnastkowymi, binarnymi lub ósemkowymi. W poniższym przykładzie użyto separatora cyfr wiodących do zdefiniowania 3 271 948 384 jako liczby szesnastkowej:

Dim number As Integer = &H_C305_F860

Aby użyć znaku podkreślenia jako separatora wiodącego, należy dodać następujący element do pliku projektu Visual Basic (*.vbproj):

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

Visual Basic 15.3

Wnioskowanie o nazwanych krotkach

Po przypisaniu wartości elementów krotki ze zmiennych program Visual Basic wywnioskuje nazwę elementów krotki z odpowiednich nazw zmiennych. Nie musisz określać nazwy elementu krotki jednoznacznie. W poniższym przykładzie użyto wnioskowania, aby utworzyć krotkę z dwoma nazwanymi elementami: state i 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

Dodatkowe przełączniki kompilatora

Kompilator wiersza polecenia języka Visual Basic obsługuje teraz opcje kompilatora -refout i -refonly w celu kontrolowania danych wyjściowych zestawów odwołań. Użyj -refout , aby zdefiniować katalog wyjściowy zestawu referencyjnego. Użyj -refonly , aby określić, że kompilacja wyprowadza tylko zestaw referencyjny.

Visual Basic 15

Krotek

Krotki to uproszczona struktura danych, której najczęściej używasz do zwracania wielu wartości z jednego wywołania metody. Zwykle, aby zwrócić więcej wartości z jednej metody, należy wykonać jeden z następujących sposobów:

  • Definiowanie typu niestandardowego (a Class lub ).Structure Ta opcja jest rozwiązaniem wagi ciężkiej.

  • Zdefiniuj co najmniej jeden ByRef parametr, oprócz zwracania wartości z metody .

Obsługa krotek w języku Visual Basic umożliwia szybkie definiowanie krotki, opcjonalnie przypisywanie nazw semantycznych do jej wartości i szybkie pobieranie ich wartości. Poniższy przykład opakowuje wywołanie TryParse metody i zwraca krotkę.

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

Następnie możesz wywołać metodę i obsłużyć zwróconą krotkę za pomocą kodu, jak w poniższym przykładzie.

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

Literały binarne i separatory cyfr

Literał binarny można zdefiniować przy użyciu prefiksu &B lub &b. Ponadto można użyć znaku podkreślenia , _jako separatora cyfr, aby zwiększyć czytelność. W poniższym przykładzie użyto obu funkcji do przypisania Byte wartości i wyświetlenia jej jako liczby dziesiętnej, szesnastkowej i binarnej.

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)      

Aby uzyskać więcej informacji, zobacz sekcję "Przypisania literału" typów danych Byte, Integer, Long, Short, SByte, UInteger, ULong i UShort .

Obsługa zwracanych wartości odwołania w języku C#

Język C# obsługuje wartości zwracane przez odwołanie. Oznacza to, że gdy metoda wywołująca odbiera wartość zwróconą przez odwołanie, może zmienić wartość odwołania. Visual Basic nie pozwala na definiowanie metod zwracających wartości przez odwołanie, ale umożliwia korzystanie i modyfikowanie tych wartości.

Na przykład następująca Sentence klasa napisana w języku C# zawiera metodę FindNext , która znajduje następne słowo w zdaniu rozpoczynającym się od określonego podciągnięcia. Ciąg jest zwracany jako wartość zwracana przez odwołanie, a Boolean zmienna przekazana przez odwołanie do metody wskazuje, czy wyszukiwanie zakończyło się pomyślnie. Oznacza to, że oprócz odczytywania zwróconej wartości obiekt wywołujący może go również modyfikować i że modyfikacja jest odzwierciedlana w Sentence klasie.

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

W najprostszej formie można zmodyfikować wyraz znaleziony w zdaniu przy użyciu kodu podobnego do poniższego przykładu. Pamiętaj, że nie przypisujesz wartości do metody, ale raczej do wyrażenia, które zwraca metoda, czyli wartości zwrotnej przez odwołanie.

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.

Jednak problem z tym kodem polega na tym, że jeśli dopasowanie nie zostanie znalezione, metoda zwróci pierwsze słowo. Ponieważ przykład nie sprawdza wartości argumentu Boolean , aby określić, czy znaleziono dopasowanie, modyfikuje pierwsze słowo, jeśli nie ma dopasowania. Poniższy przykład rozwiązuje ten problem, zastępując pierwsze słowo nim samym, jeśli nie ma dopasowania.

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.

Lepszym rozwiązaniem jest użycie metody pomocniczej, do której jest przekazywana wartość zwracana przez odwołanie. Metoda pomocnika może następnie zmodyfikować argument przekazany do niego przez odwołanie. Poniższy przykład to robi.

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.

Aby uzyskać więcej informacji, zobacz Odwołania wartości zwracane.

Visual Basic 14

NameOf

Możesz uzyskać niekwalifikowaną nazwę ciągu typu lub elementu członkowskiego do użycia w komunikacie o błędzie bez kodowania ciągu. Takie podejście zapewnia poprawność kodu podczas refaktoryzacji. Ta funkcja jest również przydatna do podłączania łączy MVC kontrolera modelu i wyzwalania zdarzeń zmienionych właściwości.

Interpolacja ciągów

Użyj wyrażeń interpolacji ciągów do konstruowania ciągów. Wyrażenie ciągu interpolowanego wygląda jak ciąg szablonu zawierający wyrażenia. Ciąg interpolowany jest łatwiejszy do zrozumienia w odniesieniu do argumentów niż formatowanie złożone.

Dostęp warunkowy do składowych o wartości null i indeksowanie

Wartości null można przetestować w bardzo lekki sposób składni przed wykonaniem operacji dostępu do składowej (?.) lub indeksu (?[]). Te operatory ułatwiają pisanie mniejszej ilości kodu w celu obsługi kontroli wartości null, szczególnie w przypadku malenia w strukturach danych. Jeśli lewy argument operacji lub odwołanie do obiektu ma wartość null, operacje zwracają wartość null.

Literały ciągu wielowierszowego

Literały ciągu mogą zawierać sekwencje nowego wiersza. Nie potrzebujesz już starego obejścia problemu przy użyciu polecenia <xml><![CDATA[...text with newlines...]]></xml>.Value.

Comments

Komentarze można umieszczać po niejawnych kontynuacjach wierszy, wewnątrz wyrażeń inicjatora i wśród terminów wyrażeń LINQ.

Inteligentniejsze w pełni kwalifikowane rozpoznawanie nazw

Podany kod, taki jak Threading.Thread.Sleep(1000), Visual Basic używał do wyszukiwania przestrzeni nazw "Threading", odkrywając, że było niejednoznaczne pomiędzy System.Threading i System.Windows.Threading, a następnie zgłaszał błąd. Program Visual Basic uwzględnia teraz obie możliwe przestrzenie nazw. Jeśli zostanie wyświetlona lista uzupełniania, edytor programu Visual Studio wyświetli listę elementów członkowskich z obu typów na liście uzupełniania.

Literały daty pierwszej roku

Literały daty można mieć w formacie rrrr-mm-dd, #2015-03-17 16:10 PM#.

Właściwości interfejsu odczytu

Właściwości interfejsu tylko do odczytu można zaimplementować przy użyciu właściwości odczyt i zapis. Interfejs gwarantuje minimalną funkcjonalność i nie zatrzymuje implementowania klasy, aby umożliwić ustawienie właściwości.

TypeOf <expr> IsNot <, typ>

Aby uzyskać większą czytelność kodu, można teraz używać z TypeOfprogramem IsNot .

identyfikator< ostrzeżenia >#Disable i identyfikator ostrzeżenia <#Enable>

Możesz wyłączyć i włączyć określone ostrzeżenia dla regionów w pliku źródłowym.

Ulepszenia komentarza dokumentu XML

Podczas pisania komentarzy do dokumentu uzyskasz inteligentny edytor i utworzysz obsługę walidacji nazw parametrów, prawidłowej obsługi crefs (na przykład typów ogólnych i operatorów), kolorowania i refaktoryzacji.

Częściowe definicje modułu i interfejsu

Oprócz klas i struktur można zadeklarować częściowe moduły i interfejsy.

dyrektywy #Region wewnątrz treści metod

Można umieścić ograniczniki #Region...#End Region w dowolnym miejscu w pliku, wewnątrz funkcji, a nawet obejmujące wiele ciał funkcji.

Definicje przesłonięć są niejawnie przeciążenia

Jeśli dodasz Overrides modyfikator do definicji, kompilator niejawnie dodaje Overloads , aby w typowych przypadkach można było wpisać mniej kodu.

CObj dozwolone w argumentach atrybutów

Teraz możesz użyć CObj(...) w argumentach atrybutów. Wcześniej kompilator zwrócił błąd informujący, że nie jest wartością stałą.

Deklarowanie i używanie niejednoznacznych metod z różnych interfejsów

Wcześniej następujący kod zwrócił błędy, które uniemożliwiły deklarowanie IMock lub wywoływanie metod GetDetails (jeśli te metody zostały zadeklarowane w języku 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

Teraz kompilator używa normalnych reguł rozwiązywania przeciążenia, aby wybrać najbardziej odpowiednią GetDetails metodę do wywołania. Relacje interfejsu można zadeklarować w języku Visual Basic, tak jak pokazano w przykładzie.

Zobacz także