Visual Basic .NET Language
Funkcje Visual Basic 14.0
Szukaj…
Wprowadzenie
Visual Basic 14 to wersja Visual Basic, która została dostarczona jako część Visual Studio 2015.
Ta wersja została przepisana od nowa w około 1,3 miliona linii VB. Dodano wiele funkcji, aby usunąć typowe podrażnienia i oczyścić wspólne wzorce kodowania.
Numer wersji Visual Basic przeszedł od 12 do 14, pomijając 13. Pominięto to, aby VB było zgodne z numeracją wersji samego Visual Studio.
Operator warunkowy zerowy
Aby uniknąć gadatliwy sprawdzania null, ?.
operator został wprowadzony w języku.
Stara pełna składnia:
If myObject IsNot Nothing AndAlso myObject.Value >= 10 Then
Można teraz zastąpić zwięzłym:
If myObject?.Value >= 10 Then
The ?
Operator jest szczególnie wydajny, gdy masz ciąg właściwości. Rozważ następujące:
Dim fooInstance As Foo = Nothing
Dim s As String
Zwykle musiałbyś napisać coś takiego:
If fooInstance IsNot Nothing AndAlso fooInstance.BarInstance IsNot Nothing Then
s = fooInstance.BarInstance.Baz
Else
s = Nothing
End If
Ale z ?
operator można zastąpić tylko:
s = fooInstance?.BarInstance?.Baz
Nazwa operatora
Operator NameOf
rozpoznaje przestrzenie nazw, typy, zmienne i nazwy członków w czasie kompilacji i zastępuje je ciągiem znaków.
Jeden z przypadków użycia:
Sub MySub(variable As String)
If variable Is Nothing Then Throw New ArgumentNullException("variable")
End Sub
Stara składnia naraża na ryzyko zmiany nazwy zmiennej i pozostawienia zakodowanego ciągu na niewłaściwą wartość.
Sub MySub(variable As String)
If variable Is Nothing Then Throw New ArgumentNullException(NameOf(variable))
End Sub
W przypadku NameOf
zmiana nazwy tylko zmiennej spowoduje błąd kompilatora. Pozwoli to również na zmianę nazwy narzędzia za jednym razem.
Operator NameOf
używa tylko ostatniego komponentu odwołania w nawiasach. Jest to ważne przy obsłudze czegoś takiego jak przestrzenie nazw w operatorze NameOf
.
Imports System
Module Module1
Sub WriteIO()
Console.WriteLine(NameOf(IO)) 'displays "IO"
Console.WriteLine(NameOf(System.IO)) 'displays "IO"
End Sub
End Module
Operator korzysta również z wpisanej nazwy odwołania bez rozstrzygania importu zmieniającego nazwę. Na przykład:
Imports OldList = System.Collections.ArrayList
Module Module1
Sub WriteList()
Console.WriteLine(NameOf(OldList)) 'displays "OldList"
Console.WriteLine(NameOf(System.Collections.ArrayList)) 'displays "ArrayList"
End Sub
End Module
Interpolacja ciągów
Ta nowa funkcja sprawia, że konkatenacja ciągów jest bardziej czytelna. Ta składnia zostanie skompilowana do równoważnego wywołania String.Format
.
Bez interpolacji ciągów:
String.Format("Hello, {0}", name)
Z interpolacją ciągów:
$"Hello, {name}"
Dwie linie są równoważne i obie są kompilowane do wywołania String.Format
.
Podobnie jak w String.Format
, nawiasy String.Format
mogą zawierać dowolne pojedyncze wyrażenie (wywołanie metody, właściwości, operator koalescencji zerowej i tak dalej).
Interpolacja ciągów jest metodą preferowaną w stosunku do String.Format
ponieważ zapobiega występowaniu niektórych błędów środowiska wykonawczego. Rozważ następujący wiersz String.Format
:
String.Format("The number of people is {0}/{1}", numPeople)
Spowoduje to kompilację, ale spowoduje błąd w czasie wykonywania, ponieważ kompilator nie sprawdza, czy liczba argumentów pasuje do symboli zastępczych.
Automatyczne właściwości tylko do odczytu
Właściwości tylko do odczytu zawsze były możliwe w VB.NET w tym formacie:
Public Class Foo
Private _MyProperty As String = "Bar"
Public ReadOnly Property MyProperty As String
Get
Return _MyProperty
End Get
End Property
End Class
Nowa wersja Visual Basic pozwala na krótką rękę do deklaracji właściwości w następujący sposób:
Public Class Foo
Public ReadOnly Property MyProperty As String = "Bar"
End Class
Rzeczywista implementacja wygenerowana przez kompilator jest dokładnie taka sama dla obu przykładów. Nowa metoda pisania to tylko krótka ręka. Kompilator nadal będzie generował prywatne pole w formacie: _<PropertyName>
Nazwa _<PropertyName>
aby utworzyć kopię zapasową właściwości tylko do odczytu.
Częściowe moduły i interfejsy
Podobnie jak klasy częściowe, nowa wersja Visual Basic może teraz obsługiwać częściowe moduły i częściowe interfejsy. Składnia i zachowanie są dokładnie takie same, jak w przypadku klas częściowych.
Przykład częściowego modułu:
Partial Module Module1
Sub Main()
Console.Write("Ping -> ")
TestFunktion()
End Sub
End Module
Partial Module Module1
Private Sub TestFunktion()
Console.WriteLine("Pong")
End Sub
End Module
I częściowy interfejs:
Partial Interface Interface1
Sub Methode1()
End Interface
Partial Interface Interface1
Sub Methode2()
End Interface
Public Class Class1
Implements Interface1
Public Sub Methode1() Implements Interface1.Methode1
Throw New NotImplementedException()
End Sub
Public Sub Methode2() Implements Interface1.Methode2
Throw New NotImplementedException()
End Sub
End Class
Podobnie jak w przypadku klas częściowych definicje częściowych modułów i interfejsów muszą znajdować się w tej samej przestrzeni nazw i tym samym zestawie. Wynika to z faktu, że częściowe moduły i interfejsy są scalane podczas kompilacji, a skompilowany zestaw nie zawiera żadnych wskazówek, że pierwotna definicja modułu lub interfejsu została podzielona.
Wieloliniowe literały łańcuchowe
VB pozwala teraz na literały łańcuchowe, które dzielą się na wiele wierszy.
Stara składnia:
Dim text As String = "Line1" & Environment.NewLine & "Line2"
Nowa składnia:
Dim text As String = "Line 1
Line 2"
Udoskonalenia dyrektywy #Region
Dyrektywa #Region może być teraz umieszczana wewnątrz metod, a nawet obejmować metody, klasy i moduły.
#Region "A Region Spanning A Class and Ending Inside Of A Method In A Module"
Public Class FakeClass
'Nothing to see here, just a fake class.
End Class
Module Extensions
''' <summary>
''' Checks the path of files or directories and returns [TRUE] if it exists.
''' </summary>
''' <param name="Path">[Sting] Path of file or directory to check.</param>
''' <returns>[Boolean]</returns>
<Extension>
Public Function PathExists(ByVal Path As String) As Boolean
If My.Computer.FileSystem.FileExists(Path) Then Return True
If My.Computer.FileSystem.DirectoryExists(Path) Then Return True
Return False
End Function
''' <summary>
''' Returns the version number from the specified assembly using the assembly's strong name.
''' </summary>
''' <param name="Assy">[Assembly] Assembly to get the version info from.</param>
''' <returns>[String]</returns>
<Extension>
Friend Function GetVersionFromAssembly(ByVal Assy As Assembly) As String
#End Region
Return Split(Split(Assy.FullName, ",")(1), "=")(1)
End Function
End Module
Komentarze po niejawnej kontynuacji linii
VB 14.0 wprowadza możliwość dodawania komentarzy po niejawnej kontynuacji linii.
Dim number =
From c As Char 'Comment
In "dj58kwd92n4" 'Comment
Where Char.IsNumber(c) 'Comment
Select c 'Comment
Obsługa wyjątków
Podczas kodowania często pojawiają się nieoczekiwane błędy, które wymagają debugowania i testowania. Ale czasami błędy są rzeczywiście oczekiwane i aby je ominąć, istnieje blok Try..Catch..Throw..Finally..End Try
.
Aby poprawnie zarządzać błędem, kod jest umieszczany w bloku Try..Catch
, w którym Catch
, jak sama nazwa wskazuje, Try..Catch
wszystkie wyjątki, które występują w tym bloku.
Aw przypadku wyjątku mamy możliwość Throw
ten błąd, że jest to powrót do powiadomienia użytkownika lub zarządzać wewnętrznie w samym kodzie.
Finally
część to końcowy kod, który niezależnie od wyniku, jeśli jest wyjątek, czy nie, kod zostanie uruchomiony przed wyjściem z bloku.
W przypadku, gdy musimy wyskoczyć z zegara, istnieje instrukcja Exit Try
, której można użyć. Ale tutaj również kod w sekcji W Finally
zostanie wykonany przed zakończeniem.
Składnia jest prosta;
Try
[ tryStatements ]
[ Exit Try ]
[ Catch [ exception [ As type ] ] [ When expression ]
[ catchStatements ]
[ Exit Try ] ]
[ Catch ... ]
[ Finally
[ finallyStatements ] ]
End Try
gdzie tylko Try
i End Try
jest obowiązkowe. Resztę można zignorować, ale jako dobrą praktykę Finally
część Finally
, nawet jeśli pozostanie pusta.
Jeśli chodzi o wyjątek, można wychwycić inny rodzaj wyjątku. Są to gotowe wyjątki dostępne w .NET Framework, jak poniżej;
Klasa wyjątków | Krótki opis |
---|---|
System.IO.IOException | Obsługuje błędy we / wy |
System.IndexOutOfRangeException | Odnosi się do indeksu tablicy poza zakresem |
System.ArrayTypeMismatchException | Gdy typ jest niezgodny z typem tablicy |
System.NullReferenceException | Obsługuje błędy generowane podczas odwoływania się do pustego obiektu. |
System.DivideByZeroException | Obsługuje błędy generowane przez podzielenie dywidendy na zero. |
System.InvalidCastException | Obsługuje błędy generowane podczas rzutowania. |
System.OutOfMemoryException | Obsługuje błędy generowane z niewystarczającej ilości wolnej pamięci. |
System.StackOverflowException | Obsługuje błędy generowane z przepełnienia stosu. |
--------------------------- | ------------------------ |