Dva nejznámnější a nejpoužívanější jazyky na platformě Microsoft .NET – Visual Basic (VB) a C# (CS), co z nich je lepší a co si zvolit? Budu se snažit co nejvíce objektivně popsat, proč je lepší právě VB, a to na základě mnohaletých zkušeností s vývojem aplikací v obou jazycích.
Vzhledem k tomu, že používám Visual Studio 2008 (VB 9.0, C# 3.0), budou následující informace založené na těchto verzích.
VB existuje mnohem déle než CS, a proto v něm jeho autoři zdokonalili mnoho věcí od poslední verze 6.0, která ještě nebyla na platformě Microsoft .NET. CS je na druhou stranu jazyk poměrně nový, poprvé uvedený s Visual Studiem .NET 2002. CS si oblíbí hlavně vývojáři předtím pracující v Javě, nebo v některém z unmanaged C(++) jazyků.
1. Syntaxe
Každému vyhovuje jiná syntaxe, ale kód ve VB je na první pohled mnohem přehlednější (i pro někoho, kdo se programováním nezabývá) než kód CS, který svým nadměrným množstvím složených závorek, středníků a zkrácenými zápisy připomíná spíš složitou matematickou rovnici. VB je naopak ukecanější, používá spoustu výrazů z mluveného jazyka a žádné zbytečné znaky. Typický příklad čitelnosti kódu, který jsem zde již několikrát uváděl:
Next
End If
End Sub
End Class
Ve spoustě odborné literatury zabývající se psaním kódu se dočtete, jak důležitá je srozumitelnost a čitelnost kódu, a to i na úkor výkonnosti (samozřejmě se nesmí jednat o něco, co by se výrazně podílelo na snížení výkonu celé aplikace). Výborně je to popsáno v knize Co programátory ve škole neučí (ISBN 80-251-0073-1).
Rozlišování velkých a malých písmen je výhoda pouze při vymýšlení názvů proměnných, ve VB nemůžou existovat dva členy třídy se stejným názvem lišícím se pouze velikostí písmen, to se ale u Private proměnných třídy řeší pomocí podtržítka, což je ostatně běžná praxe při pojmenovávání i v C#.
Automatické formátování zdrojového kódu během psaní ve VB je výhoda obrovská, v C# sice jsou různé klávesové zkratky na dokončení bloku kódu atd., ale to se prostě nemůže vyrovnat tomu, co je ve VB.
2. Application Framework
Nepostradatelná věc pro desktopové aplikace, založená na třídách z prostoru Microsoft.VisualBasic. Ve VB projektu se integruje přímo do vlastností projektu na kartu Application.
Díky Application Frameworku můžete na několik klepnutí nastavit běžné věci jako například smí-li aplikace běžet pouze v jediné instanci, úvodní obrazovku s logem, nebo reagovat na události, které by bez AF bylo velmi obtížné realizovat. Praktický příklad: Pomocí AF můžete reagovat na pokus o spuštění další instance stejné aplikace, a pokud by tato další instance byla spuštěna s nějakými parametry příkazového řádku, tak tyto parametry získat v původní instanci. AF poskytuje i další užitečné události jako např. změna dostupnosti sítě, nebo vznik neošetřené vyjímky kdekoliv v aplikaci (vynikající místo pro zápis do protokolu). Toto vše musíte v CS dělat ručně.
3. Jmenný prostor My
Extrémně návyková věc, bez které si už rychlý vývoj nedovedu představit. Ve VB je vše organizováno do prostoru My, podobně jako ve Windows Moje Dokumenty, Moje Hudba, Moje Obrázky, atd. Všechno od konfiguračních hodnot (My.Settings, obdoba Properties.Settings v CS), přes Resources v My.Resources až po často prováděné úkony týkající se například souborového systému (My.Computer.FileSystem), systémových informací (My.Computer.Info), nebo registru (My.Computer.Registry). Vše rychle po ruce bez nutnosti Imports dalších věcí, tak to má být.
4. Klíčové slovo With
Pokud v nějakém bloku kódu mnohokrát používáte dlouhou cestu k členu třídy, lze to zkrátit použitím klíčového slova With. With lze i víceúrovňově zanořovat nebo používat anonymně v kombinaci s nějakým výrazem.
With My.Settings
.MainFormRectangle = New Rectangle(Left, Top, Width, Height)
.MainFormVisible = Visible
End With
With New Text.StringBuilder(10)
.Append("a")
.Append("b")
.Append("c")
End With
Dim rect As New Rectangle With {.X = 1, .Y = 1}
5. Dokonalé Case
Ve VB je možné na rozdíl od CS velmi flexibilně používat rozhodování pomocí Case, lze používat <, >, <=, >=, rozsah hodnot, seznam hodnot a všechny tyto podmínky lze navíc kombinovat.
Dim n = 10
Select Case n
Case 1, 2, 3
Case Is > 5
Case 7 To 10
Case Else
End Select
6. Možnost striktního nebo volného zápisu kódu
Pomocí možnosti Option Strict na kartě Compile ve vlastnostech projektu, nebo zápisem přímo v kódu lze řídit, zda je vyžadován striktní zápis kódu, což znamená, že kompilátor bude kontrolovat, zda jsou všude definovány typy parametrů a návratových hodnot a také jestli jsou použity explicitní konverze všude, kde je potřeba. Potom nedovolí např. přiřadit Double do Byte přestože na 100% víte, že nikdy nedojde k přetečení a ztráta přesnosti je vám lhostejná. Pokud není tato volba zapnutá, ponechá vám kompilátor možná až příliš volné ruce, protože pokud nedáváte pozor, může provést implicitní konverzi, která povede k neočekávanému výsledku, viz. zde.
7. Zápis XML přímo v kódu
VB umožňuje zapisovat XML přímo v kódu včetně zvýrazňování syntaxe a přiřadit do odpovídajícího datového typu. Ideální pro jednoduché a středně složité XML dokumenty.
'xml bude typu XElement
Dim xml = <Persons>
<Person id="1">Ondřej Linhart</Person>
</Persons>
8. Late Binding
Příliš nepoužívaná věc, myslím že ponechaná hlavně z důvodu zpětné kompatibility s VB6. Jedná se o možnost volání metod u předem neznámého objektu a proto u takového kódu nemůže fungovat IntelliSense. Využití je především u volání metod COM objektů vytvořených pomocí CreateObject, viz. příklad:
Dim comObject = CreateObject("Scripting.FileSystemObject")
Dim fileStream = comObject.CreateTextFile("C:\TextFile.txt", True)
fileStream.WriteLine("Řádek 1")
9. Statické proměnné uvnitř metod
Ve VB je možnost definovat statické proměnné uvnitř metod. Taková proměnná má obor platnosti pouze uvnitř metody, ve které je definovaná a je to tedy svým způsobem další úroveň zapouzdřenosti. Toto využívám poměrně často. Deklaruje se pomocí klíčových slov Static Dim.
Sub DoWork()
Static Dim count As Integer
End Sub
10. Jednoduché přiřazování delegátů
Delegát je zástupce funkce, který se může odkazovat na libovolnou metodu se stejnou signaturou, jako má sám. V C# se musí vždy vytvořit instance delegáta s názvem příslušné metody, ve VB stačí použít klíčové slovo AddHandler, které delegáta samo vytvoří. Je samozřejmě možné explicitně použít C# způsob. Při napojování obslužných metod na události lze dokonce ve VB10 použít metody s jinou signaturou.
AddHandler Me.Load, AddressOf Form1_Load
Sub Form1_Load(sender As Object, e As EventArgs)
End Sub
this.Load += new EventHandler(this.Form1_Load);
void Form1_Load(Object sender, EventArgs e)
{
}