XXX. ASR '2005 Seminar, Instruments and Control, Ostrava, April 29, 2005
155
Innovations of Microsoft Visual Basic .NET 2005 language Inovace v jazyce Visual Basic .NET 2005 FOJTÍK, David Ing., Ph.D., Katedra ATŘ-352, VŠB-TU Ostrava, 17. listopadu, Ostrava - Poruba, 708 33
[email protected], http://fs1.vsb.cz/~foj74/ Abstrakt: Tento příspěvek popisuje novinky připravované verze jazyka MS Visual Basic .NET 2005 jehož uvedení se očekává v letošním roce. Článek představuje jednak zcela nové vlastnosti, které souvisejí s novou generací Visual Studia 2005 a .NET farmeworku 2.0, tak také zde objevíme vlastnosti, které jsou již známé z jazyka C#, ale které doposud ve Visual Basicu chyběly. Klíčová slova: Visual Studio .NET 2005, Visual Basic .NET 2005, novinky
1 Úvod Letošní rok bude z pozice programátorů zajímavý uvedením nové verze Visual Studia .NET 2005. Současně se také objeví zcela nová verze .NET frameworku 2.0 a spolu s ní i mnohá vylepšení týkající se programovacích jazyků. Těmto vylepšením neušel ani velmi známý Microsoft Visual Basic, který si svou oblibu získal daleko dřív a to mimo platformu .NET. Kupodivu na platformě .NET byl tento jazyk ochuzen o některé velmi užitečné vlastnosti jimiž se mohl pyšnit konkurent C#. Nová verze Visual Basicu .NET 2005 již tyto vlastnosti implementuje a spolu s nimi i mnoho dalších. Právě o těchto inovacích jazyka pojednává tento příspěvek.
Obrázek 1 – Visual Studio .NET 2005 Beta 2
XXX. ASR '2005 Seminar, Instruments and Control, Ostrava, April 29, 2005
156
2 Snadný přístup k prostředkům počítače - klíčové slovo My Tento nový prvek jazyka usnadňuje orientaci v hierarchické struktuře objektů přístupných za běhu aplikace. Nové klíčové slovo představuje pomyslný objekt na vrcholu pyramidy těchto objektů. Po zadání tečky za slovem My, IntelliSense nabídne odkazy minimálně na tři základní objekty: My.Application, My.Computer, My.User. Prostřednictvím těchto objektů lze například přistupovat k souborovému systému počítače (My.Computer.FileSystem) nebo zjistit jméno aktuálně přihlášeného uživatele (My.User.name). V závislosti na typu aplikace nabídne IntelliSense logicky i další odkazy například: My.Forms, My.Webservices apod.
3 Oddělené definice tříd objektů – klíčové slovo Partial Mezi velmi zajímavé novinky, které byly implementovány do všech verzí .NET jazyků 2005 patří možnost rozdělit definici třídy nebo struktury do dílčích částí. To znamená, že se tato definice může skládat z několika dílčích celků, které se mohou nacházet i v různých zdrojových souborech. Tato schopnost má význam v případě, že se na tvorbě třídy podílí více programátorů nebo když je možné rozdělit třídu na logické celky. Visual studio .NET 2005 tuto možnost využívá především u formulářů, kdy takto odděluje kód vytvořený prostřednictvím visuálního návrháře od kódu vytvořeného programátorem. V tomto konkrétním případě je dokonce soubor s kódem návrháře implicitně skrytý a tudíž programátor vidí pouze zdrojové texty jím vytvořené.
Obrázek 2 – Okno Solution se zapnutou volbou zobrazující skryté soubory Ve Visual Basicu se jednotlivé dílčí definice třídy označují klíčovým slovem Partial uvedeným v hlavičce deklarace. Takto označená definice je chápaná jako jedna z částí, tudíž že se v projektu může, ale nemusí vyskytovat další dílčí definice této třídy. Samozřejmě se tyto definice musejí nacházet ve stejném jmenném prostoru téhož assembly, to znamená, že ve stejném jmenném prostoru se mohou nacházet dvě deklarace stejné třídy či struktury za podmínky, že alespoň jedna z nich je označena klíčovým slovem Partial. V případě většího počtu dílčích definic se může klíčové slovo Partial vynechat pouze u jedné z nich. Princip nejlépe objasňuje níže uvedený fragment kódu.
XXX. ASR '2005 Seminar, Instruments and Control, Ostrava, April 29, 2005
157
Namespace Firma Public Class COsoba Private mJmeno As String Private mPrijmeni As String End Class End Namespace Namespace Firma Partial Class COsoba Public Sub New(ByVal Jmeno As String, ByVal Prijmeni As String) mJmeno = Jmeno mPrijmeni = Prijmeni End Sub End Class End Namespace
4 Separátní určení modifikátoru přístupu vlastností Určitým nedostatkem stávající verze Visual Basicu .NET byla nemožnost odlišit kvalifikátor přístupu vlastnosti zvlášť pro čtení a zvlášť pro zápis. Nyní je tedy možné definovat vlastnost, která je například v rámci assemby plně přístupná, mimo ni je však pouze pro čtení (viz níže uvedený fragment kódu). Public Property Jmeno() As String Get Return mJmeno End Get Friend Set(ByVal value As String) mJmeno = value End Set End Property
5 Typově nezávislá definice (Generic types) Úplnou novinkou platformy .NET je možnost vytvářet zcela obecné algoritmy s předem nedefinovanými datovými typy. Tuto techniku lze aplikovat na třídy, struktury, rozhraní, procedury i delegáty. Princip spočívá ve vytvoření zástupce datového typu, který se při požití nahradí skutečným typem. Ve své podstatě kompilátor již pracuje s konkrétním typem, tudíž dochází k plné datové kontrole. Jako příklad uveďme deklaraci třídy která, obsahuje jedinou sdílenou metodu Zamenit, jenž se má používat k záměně dvou proměnných libovolného datového typu. Public Class CTypoveNezavisleOperace(Of TypDelegatu) Public Shared Sub Zamenit(ByRef prvni As TypDelegatu, ByRef druhy As TypDelegatu) Dim dump As TypDelegatu = prvni prvni = druhy druhy = dump End Sub End Class
Jak vyplývá z příkladu ve Visual Basicu, v této souvislosti přibylo nové klíčové slovo Of, jenž slouží k označení zmiňovaného zástupce datového typu. Ten je pak použit na místo datového typy při deklaraci proměnných. Objekt lze pak použít například takto: Sub test() Dim s1 As String = "První", s2 As String = "Druhý" CTypoveNezavisleOperace(Of String).Zamenit(s1, s2) MsgBox(String.Format("s1 = {0}, s2 = {1}", s1, s2)) 'S1 = Druhý, s2 = První Dim n1 As Long = 100, n2 As Long = 200 CTypoveNezavisleOperace(Of Long).Zamenit(n1, n2) MsgBox(String.Format("n1 = {0}, n2 = {1}", n1, n2)) 'n1 = 200, n2 = 100 End Sub
Samotný .NET framework 2.0 ve jmenném prostoru System.Collections.Generic nabízí hned několik obdobně definovaných tříd pro práci s kolekcemi.
XXX. ASR '2005 Seminar, Instruments and Control, Ostrava, April 29, 2005
158
6 Zakázkové události (Custom Events) Další novinkou je možnost definovat událost tak, aby se zavedla do paměti až když jej konzument objektu fyzicky využívá. Klasicky definované události se zavedou ihned spolu s objektem a to i v případě, že v kódu konzumenta nejsou vůbec využívány. Důsledkem toho dochází k určitému plýtvání paměti. Na moderních počítačích PC to není žádný problém, avšak u malých mobilních zařízení, kde je paměti téměř vždy nedostatek, může tato možnost výrazně napomoci. Definice zakázkové události nejlépe vystihuje následující fragment kódu. Namespace Company Public Class CEventArgsNameChange : Inherits EventArgs Public Type, CurrentName, NewName As String Public Sub New(ByVal NameType As String, _ ByVal CurrentNameValue As String, _ ByVal NewNameValue As String) CurrentName = CurrentNameValue NewName = NewNameValue Type = NameType End Sub End Class Public Class CPerson Private mFirstName As String Private mLastName As String ' Definice delegáta – úložiště pro uživatelskou událost. Public Delegate Sub NameChangingDelegate(ByVal sender As Object, _ ByVal e As CEventArgsNameChange) Private NameChangingHandler As NameChangingDelegate ' Definice zakázkové události na bázi definovaného delegáta. Public Custom Event NameChanging As NameChangingDelegate AddHandler(ByVal value As NameChangingDelegate) NameChangingHandler = value End AddHandler RemoveHandler(ByVal value As NameChangingDelegate) NameChangingHandler = Nothing End RemoveHandler RaiseEvent(ByVal sender As Object, ByVal e As CEventArgsNameChange) If NameChangingHandler IsNot Nothing Then NameChangingHandler.Invoke(sender, e) End If End RaiseEvent End Event Public Property FirstName() As String Get Return mFirstName End Get Friend Set(ByVal value As String) If mFirstName <> value Then RaiseEvent NameChanging(Me, New CEventArgsNameChange("First name", _ mFirstName, _ value)) mFirstName = value End If End Set End Property ' ... End Class End Namespace
Užití úsporné události se nikterak neliší od běžně definovaných. Rozdíl tedy spočívá pouze v její deklaraci.
XXX. ASR '2005 Seminar, Instruments and Control, Ostrava, April 29, 2005
159
Public Class Form1 Private WithEvents p As Company.CPerson Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click p = New Company.CPerson p.FirstName = "David" p.FirstName = "Petr" End Sub Private Sub p_NameChanging(ByVal sender As Object, _ ByVal e As Company.CEventArgsNameChange) Handles p.NameChanging MsgBox("Changing " & e.Type & " From '" & e.CurrentName & "' To '" & e.NewName & "'") End Sub End Class
7 Řízení životnosti objektů užitím klíčového slova Using Visual Basic .NET je oproti předchůdcům již plně objektově orientovaný. Toto pozitivum však díky použité koncepci přináší jisté komplikace. Především je zde problém s řízením životnosti objektu, přesněji řečeno s jeho zánikem. O zánik objektu se totiž stará Garbage Collector, jehož chování není determinovatelné čímž nastává problém v okamžiku kdy je potřeba ihned uvolnit používané zdroje. Samozřejmě je na tento problém pamatováno a tudíž programátor může uvolnit zdroje metodou Dispose nebo může přinutit Garbage Collector k okamžitému úklidu. Tyto postupy však vyžadují pečlivý přístup a tudíž jsou náchylné k různým opomenutím. Ve Visual Basicu .NET 2005 je možné problematiku zjednodušit použitím příkazu Using. Příkazem Using se definuje blok kódu ve kterém je daný objekt platný a který zajistí, že po opuštění tohoto bloku libovolným způsobem je objekt automaticky uvolněn. O daném principu nejlépe vypovídá níže uvedený fragment kódu. Private Sub Tisk(ByVal Text As String, ByVal Grph As Graphics) Using F As New Font("Arial", 14), BrushText As New SolidBrush(Color.Blue) 'V tomto bloku jsou objekty F a BrushText plne k dispozici Grph.DrawString(Text, F, BrushText, 0, 0) End Using 'Zde jiz objekt F a BrushText neexistuje End Sub
8 Tvorba XML dokumentace Možnost vytvářet dokumentaci ze speciálních XML komentářů bylo doposud výsadou jazyka C#. Nyní je i tato vlastnost dostupná také ve Visual Basic .NET 2005. Princip spočívá ve vytvoření speciálního komentáře uvozeném symbolem ’’’ (tři apostrofy) do nějž se uvede požadovaný XML text tvořený příslušnými elementy. ''' <summary> ''' Parametricky konstruktor tridy zlomku ''' ''' <param name="Citatel">Citatel zlomku ''' <param name="Jmenovatel">Jmenovatel zlomku (musi byt ruzny od nuly) '''
Slouzi k zalozeni a soucasne inicializaci zlomku Public Sub New(ByVal Citatel As Long, ByVal Jmenovatel As Long)
Tyto komentáře zpracovávají nástroje IntelliSense a Object Browser nebo jsou zpracovány kompilátorem, který z nich vytvoří XML dokument.
Obrázek 3 – užití XML komentářů nástrojem IntelliSense
XXX. ASR '2005 Seminar, Instruments and Control, Ostrava, April 29, 2005
160
9 Přetěžování operátorů Mezi další zajímavé vlastnosti, o které byl doposud Visual Basic .NET ochuzen, patří přetěžování operátorů. Tato vlastnost umožňuje používat standardní operátory s objekty či strukturami stejně jako by to byly běžné proměnné. Například lze definovat třídu reprezentující zlomek, jejíž objekty bude možno zpracovávat standardními operátory +, -, *, / apod. Sub Main() Dim z1 As New CZlomek(7, 6) Dim z2 As New CZlomek(2, 5) Dim z As CZlomek = -(z1 + z2) Console.WriteLine("({0})+({1})=({2})", z1.ToString, z2.ToString, z.ToString) Console.ReadKey() End Sub
Definice použitých operátorů by ve Visual Basicu .NET 2005 mohli například vypadat jako v následujícím fragmentu kódu. 'binarni operator + (zlomek = zlomek1-zlomek2) Public Shared Operator +(ByVal L As CZlomek, ByVal R As CZlomek) As CZlomek Dim Result As New CZlomek If L.Jmenovatel = R.Jmenovatel Then Result.Jmenovatel = L.Jmenovatel Result.Citatel = L.Citatel + R.Citatel Else Result.Jmenovatel = L.Jmenovatel * R.Jmenovatel Result.Citatel = L.Citatel * R.Jmenovatel + R.Citatel * L.Jmenovatel End If Normalizace(Result) Return Result End Operator 'unarni operator -: zlomek = -zlomek Public Shared Operator -(ByVal Fraction As CZlomek) As CZlomek Return New CZlomek(-Fraction.Citatel, Fraction.Jmenovatel) End Operator
10 Nový operátor IsNot Tento nový operátor je prostou kombinací dvou operátorů Is a Not. Užití tohoto operátoru zrychluje vyhodnocování a také zpřehledňuje kód (viz níže uvedený fragment kódu). ' Původní podmínka If Not Objekt Is Nothing Then ' ... End If ' nyní může být nahrazena takto If Objekt IsNot Nothing Then ' ... End If
11 Nový příkaz k cyklům - Continue { Do | For | While } Tento příkaz (známý již z jazyka C) se používá v těle cyklů jako povel k okamžitému provedení další smyčky cyklu a tím k vynechání následujících příkazů těla cyklu. Za slovem Continue se vždy uvádí jedno z klíčových slov (Do, For, While), čímž se zpřesňuje vazba s konkrétním cyklem v případě vnoření několika cyklů do sebe.
12 Explicitní definice spodní hranice pole Protože na platformě .NET jsou pole vždy indexovány od nuly, tvůrci Visual Basicu .NET zvolili jediný způsob definice počtu prvků pole a to uvedením čísla představující horní index rozměru pole. Tento způsob je však pro nezasvěcené matoucí. Novinkou je tudíž možnost definovat počet prvků uvedením intervalu obdobně jako ve verzi 6.0. Nicméně pole
XXX. ASR '2005 Seminar, Instruments and Control, Ostrava, April 29, 2005
161
je stále možné indexovat pouze od nuly, tudíž i tato definice musí mít vždy dolní hranici nastavenou na nulu. ' Původní a stále platná definice pole Dim PoleA(10) As Integer ' Nová definice téhož pole s explicitním označením dolní hranice Dim PoleB(0 To 10) As Integer
13 Bezznaménkové datové typy Bezznaménkové datové typy byly prostřednictvím společného typového systému .NET frameworku k dispozici i v předešlé verzi jazyka Visual Basicu .NET. Nyní jsou však tyto typy přímou součástí jazyka. V nové verzi se tak datové typy rozšiřují o typy UShort, UInteger, a ULong. Také je možné nově použít i znaménkový typ o velikosti jednoho byte SByte. Spolu s datovými typy také přibyly příslušné konverzní funkce CUInt(), CULng(), CUShort() a CSByte().
14 Závěr Jak vyplývá z textu, nová verze jazyka přináší mnoho vylepšení, které jazyk zefektivňují. Další množství novinek a to mnohdy ještě významnějších přináší samotný .NET Framework 2.0 spolu s Visual Studiem .NET 2005. Přičemž převážné množství se týká spíše tvorby desktop aplikací z čeho lze usoudit, že Microsoft by rád .NET platformu prosadil i na této úrovni. To, zda se z Visual Basicu .NET 2005 stane opravdový nástupce Visual Basicu 6.0 však ukáže čas. Nástroje-Možnosti-Ukládání-Povolit rychlé ukládání). Jinak dochází k problémům při práci převaděče do formátu PDF.
15 Použitá literatura MICROSOFT. MSDN Library for Visual Studio 2005 Beta 2. Redmond: Microsoft Corporation Redmond USA, April 2005. BABIUCH, M. Konfigurace ASP.NET aplikací. In WORKSHOP 2005. Ostrava : FS VŠB-TU Ostrava, 16. 2. 2005, 4 s. ISBN 80-248-0750-5. KULHÁNEK, J. The Speed of Component Based Application in .NET Platform. In 5th International Carpathian Control Conference. Zakopane, Poland: AGHUST Krakow, 25. - 28. 5. 2004, pp. 843-848. ISBN 83-89772-00-0. FARANA, R., SMUTNÝ, L. & BABIUCH, M. Experimental and Virtual Laboratories in Distance Learning, In Proceedings of the 2004 WSEAS International Conference on APPLIED MATHEMATICS. Corfu, Greece : WSEAS, August 17-19, 2004, Paper 488-223, 4 pp. ISBN 960-8457-01-7. KOČÍ, P. Nový přístup k výuce – SUPERLEARNING. Journal of Cybernetics and Informatics. Sptember 2004, Speciál Issue „New Trends in Education of Automation and Information Technology“. ISSN 1336-4774. Dostupný na URL http://www.sski.sk/casopis/index.php. ŠKUTA, J. & BABIUCH, M. Vzdálené ovládání PC ze systému Control Web 2000 v síti LAN. In Proceedings of XXVIII Seminary ASR 2003 „Instruments and Control“. Ostrava : VŠBTU Ostrava, 6. 5. 2003, pp. 339-341. ISBN 80-248-0326-7.