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.
--------------------------- ------------------------


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow