Miłe cechy VB.NET 2005

Wiele osób w ogóle nie chce się przyjrzeć VB.NET, traktując go jako "jeszcze jeden Basic". Jednak ten "Basic" ma identyczne możliwości, jak C#, ale równocześnie zawiera wiele mechanizmów upraszczających i skracających kod. Dysponuje też specjalnymi obiektami API, ułatwiającymi pracę z rozbudowanym .NET Framework.

Wiele osób w ogóle nie chce się przyjrzeć VB.NET, traktując go jako "jeszcze jeden Basic". Jednak ten "Basic" ma identyczne możliwości, jak C#, ale równocześnie zawiera wiele mechanizmów upraszczających i skracających kod. Dysponuje też specjalnymi obiektami API, ułatwiającymi pracę z rozbudowanym .NET Framework.

Nowi programiści .NET od razu zaczynają programować w C#, ale warto też przyjrzeć się VB.NET - jest może mniej wyrafinowany, ale za to wiele rzeczy da się w nim napisać krócej, a przy obecnym tempie wzrostu prędkości procesorów optymalizacja wydajności jest mniej istotna. Zresztą to, czy aplikacja działa szybko, czy wolno, zależy głównie od sposobu rozwiązania, algorytmów itp., a nie sposobu "zakodowania". Kod powinien być przede wszystkim zrozumiały.

W VB.NET można stosować tzw. luźne wiązanie. Powoduje to, że dopiero w trakcie działania sprawdza się, czy dany obiekt rzeczywiście udostępnia daną funkcję. Proszę przyjrzeć się poniższemu fragmentowi kodu:

Module NiceVB

Public Sub CallAnyObject(ByVal obj As Object)

obj.CallMe()

End Sub

Public Class OneFunClass

Sub CallMe()

End Sub

End Class

...

End Module

Funkcja CallAnyObject wywołuje metodę CallMe, ale jako parametr przekazywany jest typ Object. Metoda nie sprawdza, czy rzeczywiście dana klasa implementuje odpowiednią metodę. Można ją wywołać w taki sposób:

Dim m As New OneFunClass

CallAnyObject(m)

i wszystko będzie działać prawidłowo, ale można też użyć innego typu (wszystkie przecież dziedziczą po Object):

Dim m1 As String

m1 = "AAA"

CallAnyObject(m1)

Konfiguracja szkieletu aplikacji Windows Forms w VB.NET 2005.

Konfiguracja szkieletu aplikacji Windows Forms w VB.NET 2005.

co spowoduje zgłoszenie wyjątku. Taki sposób programowania czasami jest wygodny, ale należy pamiętać, że dopiero w czasie działania wiadomo, czy wywołanie funkcji lub metody powiedzie się.

Gdy przyjrzymy się wygenerowanemu kodowi MSIL, okaże się, że po prostu używana jest funkcja pomocnicza:

call object [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.NewLateBinding::

LateCall(object, [mscorlib]System.Type, string, object[], string[], [mscorlib]System.Type[], bool[], bool)

Aby osiągnąć analogiczny efekt w C#, trzeba, używając refleksji, utworzyć typ i wywołać metodę - dobrych kilka wierszy kodu zamiast jednego w VB.

Pytanie, czy warto stosować taki sposób wywoływania funkcji? Czasami nie ma wyjścia, ale zawsze trzeba się zastanowić, czy np. nie da się wyodrębnić jakiegoś interfejsu i wtedy wymagać, by procedura CallAnyObject otrzymywała obiekt, który implementuje dany interfejs.

Innym ciekawym mechanizmem w VB.NET jest instrukcja With. Określa ona, że w danym bloku dostępna jest funkcjonalność (metody, właściwości) danego obiektu przy użyciu skróconej składni. Załóżmy, że w kodzie powstała jakaś skomplikowana struktura:

Public Class ComplicatedClass

Public subcls As SubClass

Public Sub New()

subcls = New SubClass()

End Sub

Public Class SubClass

Function GetStream() As StringReader

Return New StringReader("aaaa")

End Function

End Class

End Class

Aby użyć StringReader zwracanego przez funkcję GetStream, w VB.NET można napisać:

With New ComplicatedClass().subcls.GetStream()

.ReadToEnd()

.Close()

End With

Oczywiście można też utworzyć tymczasową referencję, ale na pewno With skraca kod, nie zaciemniając go przy okazji.

Język VB.NET 2005 ma praktycznie dokładnie te same funkcje, co C# - można przeciążać operatory, używać typów ogólnych, wprowadzono też funkcje, których zabrakło w poprzedniej wersji VB 2003, np. polecenie Continue, pozwalające pominąć dalszą część kodu w pętli i kontynuować od następnej iteracji, czy konstrukcję Using ... End Using, pozwalającą na wygodne wykorzystanie schematu Dispose.

Wśród elementów tego języka warto wymienić także nowy sposób dostępu do form w aplikacjach Windows. Można, tak jak dotychczas, odwoływać się do zmiennej, która przechowuje instancję danej formy. Ale można też używać nazwy klasy (czyli nazwy formy) jak zmiennej. Jeżeli w programie mamy formę o nazwie Form1, to mamy też klasę Form1. A wtedy można po prostu napisać:

Public Sub ChangeForm1Colors()

Form1.ForeColor = System.Drawing.Color.Coral

Form1.BackColor = System.Drawing.Color.Cyan

Form1.Show()

End Sub

Oczywiście to jest pewne ułatwienie składniowe - VB.NET przy pierwszym odwołaniu tworzy zmienną globalną o tej samej nazwie, co nazwa klasy, i taki kod może działać.

W Visual Basic zdefiniowany jest specjalny szkielet do budowy i kontroli aplikacji Windows Forms (można zdecydować, czy chce się z niego skorzystać w konfiguracji projektu). Także większość elementów konfiguracji tego szkieletu można określić jak zwykłe ustawienia projektu.

Można na przykład podać ekran startowy (Splash Screen), określić, czy aplikacja jest zamykana, gdy ostatnie okno będzie zamknięte, czy wystarczy zamknąć główną formę; czy można tworzyć wiele instancji programu; w jaki sposób przebiega autoryzacja użytkownika (to określa, jak będą konstruowane obiekty IIdentity i IPrincipal).

Równocześnie można określić specjalne zdarzenia zgłaszane w momencie zajścia "globalnego" zdarzenia:

Namespace My

Class MyApplication

Private Sub

MyApplication_NetworkAvailabilityChanged(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.Devices.NetworkAvailableEventArgs)

Handles Me.NetworkAvailabilityChanged

End Sub

Private Sub MyApplication_Shutdown(ByVal sender As Object, ByVal e As System.EventArgs)

Handles Me.Shutdown

End Sub

End Class

End Namespace

NetworkAvailabilityChanged określa, co się dzieje, gdy pojawia się (lub znika) połączenie sieciowe. Jeżeli piszemy aplikację typu SmartClient, to możemy się zorientować, kiedy próbować synchronizować dane z serwerem, a kiedy trzeba pracować w trybie offline. Zdarzenia Startup/Shutdown pozwalają określić, jakie operacje będą dodatkowo wykonane podczas uruchomienia i zamknięcia programu. Można też kontrolować obsługę "nieobsłużonych" błędów - UnhandledException. W takiej procedurze obsługi zdarzenia można np. spróbować "po cichu" zrestartować główne procesy programu albo zapytać użytkownika, czy program ma zakończyć działanie.

Innym bardzo wygodnym mechanizmem jest obiekt My. Biblioteka BCL (Base Class Library) w .NET Framework uporządkowała co prawda API Win32, ale jest to równocześnie bardzo rozległy zbiór elementów, które trzeba poznać. Obiekt My z jednej strony jest "skrótem" do wybranych klas BCL, a z drugiej - rozszerza je, grupując pewne informacje. Dobrym przykładem jest obiekt Folder, który ma od razu dostęp do Drive (dysku), na którym się znajduje.


Zobacz również