Ondřej Linhart

Vývojářský blog Ondřeje Linharta



Podle kategorie

Proč je Visual Basic lepší než C#

Ondřej Linhart       10. 2. 2012       C#, VB.NET       8671 zobrazení

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.

ApplicationFramework

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)
{
}

 

hodnocení článku

2 bodů / 2 hlasů       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

Diskuse: Proč je Visual Basic lepší než C#

Já osobně dělám v C# a vyhovuje mi, ale mám i zkušenosti s VB.NET zde je můj pohled na věc -

1) Ano i ne, pro začátečníka je tento zápis možná přehlednější, ale pro programátory, kteří jsou odkojeni jazyky z rodiny C syntaxe určitě ne. Toto je velice subjektivní a nezařazoval bych to mezi výhody jazyka, ba naopak ta ukecanost je někdy dost otravná. Jak jste psal pro někoho jsou to zbytečné znaky, pro někoho je to přehledné.

2)Dobře, ale tohle už se netýká jazyka, ale jeho podpory ve Visual Studiu a to jsou dvě naprosto odlišné věci!

3)Toto je opět záležitost VS a jeho integrace s VB. Ale uznávám, může se to hodit, ale já a spousta dalších C# vývojářů to nepoužívá a je spokojená i bez toho.

4)Uznávám, toto je jedna z velkých zbraní VB.NET

5)Také se to může hodit, ale opět to není nic, bez čeho by se seriozní vývojář neobešel.

6)Toto bych spíše označil za nevýhodu a já bych tedy vždy pracoval ve striktním módu, protože jinak je to tak trochu proti .NET, které je silně typové. Ale budiž, toto nebezpečí jste tam zmínil, takže se o tom nebudu hádat.

7)Toto se dá vyřešit v C#, když před řetězec dáme znak @, nicméně uznávám, že to není úplná alternativa.

8)Tak to je taková malá výhoda, ale opravdu ne příliš využívaná.

Nechci říkat, zda je jeden horší nebo lepší, jelikož nemám dostatečné(stejné) zkušenosti s oběma jazyky, ale já jakožto člověk odkojení C-like syntaxí mám raději C#, jsou tam také věci, které ve VB.NET nejsou. Spousta věcí, které ve VB.NET jsou a v C# ne je způsobena kompilátorem VB.NET, se kterým se lépe pracuje(z hlediska vývojářů Visual Studia). Myslím si, že je to opravdu velice subjektivní volba a každý má rád něco jiného.

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

2), 3) Vezměme tedy Visual Basic jako celek, ne jako jazyk.

5) Zkuste uvést příklad stejně jednoduchých podmínek rozhodování pomocí Case v C#, spláčete nad výdělkem.

6) Máte pravdu, většinou používám striktní zápis, jenže například neustále dělat konverzi z Decimal do celočíselné proměnné u NumericUpDown je více než otravné.

7) To není vůbec žádná alternativa, nevím zda je vám z ukázky vůbec jasné, co to vlastně udělá.

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

2), 3) Budiž, v tom případě je to tedy výhoda

5)Ano, ušetří to pár řádek kódu, ale není to nic, bez čeho bych se neobešel...

6)To ano, ten NumericUpDown je opravdu otravný

7)Pokud to správně chápu, tak se to XML automaticky stane novou instancí třídy XElement a můžeme s ním tedy nakládat jako s XElementem bez přetypování či vytváření tříd?

Ale stejně si stojím za svým názorem, že každému vyhovuje něco jiného. Kontrétně u těch závorek, přijde mi rychlejší napsat znak { než psát End <Něco>.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky 7 budu jsem nepřešel na C#, Xml hodně používám.

Ano stane se z něj instance třídy Xelement. VS k němu dává i kompletní intelisence při psaní xml

Dim idValue as integer = 1
Dim nameValue as string = "Ondřej Linhart"
Dim xml as Xelement = <Persons>
                         <Person id="<%= id.ToString %>"><%= nameValue %></Person>
                      </Persons>

A End (něco) psát nemusíte VS to doplní ihned při napsání hlavičky (Sub, Function, Class ....) přičemž c# složenou závorku vždy rozhodně nepřidá.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Vím, že to doplní sám, ale by se ten článek mohl jmenovat Visual Basic s Visual Studiem vs. C# s Visual Studiem. Já jsem přešel na C# s toho důvodu, že jsem dělal hodně v C-like jazycích(C++, Java) a proto se mi moc nelíbila syntaxe VB.NET, které mi dost lidí doporučovalo, nyní po 1,5 roce, jsem u C# stále, stále je to můj oblíbený jazyk a stále jsem ještě nenarazil na syntaktický problém, který by mi znesnadňoval práci.

Například do verze 8(2005) neuměl VB.NET ani přetěžovat operátory, které byli v C# od začátku, další věc je, že VB.NET nepodporuje pointery, ano dá se to celkem úspěšně nahradit IntPtr, ale není to vždy použitelné.

Další výhodou je, že pokud hledáte práci, tak jakožto C# developer máte více nabídek než jakožto VB.NET dev.

VB.NET také neumí partial interfaces, dá se bez toho obejít ,ale je to zase výhoda na straně C#.

VB.NET nepodporuje yield return.

VB.NET nepodporuje klíčová slova checked/unchecked pro kontrolu přetečení.

A našlo by se toho více, tady jsem zase ukázal, jaké jsou výhody C# oproti VB.NET, takže ano, každý z těch jazyků je v něčem lepší, ale ve výsledku to není nic, bez čeho by se nedalo obejít.

PS:Pokud tam něco z toho co jsem jmenoval bylo přidáno např. ve verzi 2010, tak se omlouvám, možná jsem to přehlédl...

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Pokud jednou začnete v něčem dělat, je velmi malá pravděpodobnost, že přejdete na něco jiného. O pointerech v C# vím, ale nikdy jsem to nepoužil a ani mne nenapadá rozumný důvod, k čemu by se to hodilo. Nabídek práce s C# je více, navíc poslední dobou je bohužel větší zájem o webové aplikace. Partial interfaces - zajímavé, nevěděl jsem. yield return - opět jsem nikdy nepotřeboval, nicméně velmi užitečná věc. checked/unchecked se dá ve VB nastavit pouze globálně, nikoliv lokálně.

nahlásit spamnahlásit spam -15 / 15 odpovědětodpovědět

S tím souhlasím, jinak jsem rád, že jsme se víceméně shodli, nevím jak pro vás, ale pro mě není žádné lepší a horší, pro mě je pouze vyhovující.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Tady se ukazuje, jak je VB.NET kompilátor "chytrý". Ten XML kód nebere jako text, ale při kompilaci to přeloží do přímého vytváření XElementu a přidávání dalších elementů a atributů. To je jedna z věcí, které jsou na VB.NETu velkou předností, má hodně vlastních příkazů, nepocházejících z MSIL, které C# nepodporuje. Z tohoto důvodu preferuji C#, protože výsledný kompilovaný kód je mnohem "čistší", když si ho zobrazíte v IL. VB.NET si sám vytváří bez dohledu programátora vlastní namespace My a další třídy v něm, způsob zachycování metod a Error object jsou taky šíleně řešené pomocí metod v Microsoft.VisualBasic, kód je pochopitelnější, ale náchylnější na různé chyby vznikající ze špatně napsaného kódu. Uznávám, že VB.NET je možná přehlednější pro začátečníky, ale některé věci jsou na něm otravné.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Konstruktivní kritika se cení, ale:

Co to znamená, že výsledný kompilovaný kód je mnohem "čistší"?

Ty příkazy specifické pro VB chybějící v CS vůbec není nutné používat, místo nich se použije klasická Frameworková metoda společná pro oba jazyky. Ovšem použití toho VB příkazu bývá jednodušší a není nutné Importsovat nebo usingovat příslušný Namespace. VB se snaží co nejvíce zamezit nutnosti psaní Boilerplate kódu, což je pravý opak CS.

Error objekt se nepoužívá již od první .NET verze Visual Basicu, nicméně ve specifických situacích se hodí, protože narozdíl od klasického Try...Catch lze pomocí něj zjistit velmi užitečný kód chyby, který by se jinak musel zjišťovat poměrně komplikovaně.

VB je přehlednější i pro mne jakožto profesionálního vývojáře a žádnou otravnou věc kromě podtržítka pro pokračování na dalším řádku (které ve VB10 již není nutné) jsem na něm neshledal.

nahlásit spamnahlásit spam -14 / 14 odpovědětodpovědět

A on vás ty funkce, které se vám nelíbí, nutí někdo používat?

Já když něco píšu ve VB.NET, tak používám de facto jen věci, které bych mohl používat v C#. Přestože bych nemusel. Prehistorické funkce a handling výjimek z VB6 nemám rád, není to systémové.

Naproti tomu generování XML se hodí, je to přehlednější než směčka vnořených konstruktorů XElementu při dělání té samé věci v C#. A spousta dalších vychytávek (např. do ByRef parametru nemusíte dát hodnotu, pokud vás nezajímá, již zmiňované With bloky atd.) je taky příjemná.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

7) Ano. Stejně tak lze WYSIWYG vytvořit třeba HTML, nebo cokoliv jiného s XML strukturou.

Díky automatickému formátování kódu nemusíte psát vůbec žádné ukončení bloku kódu, máte-li napsáno např. Class X, tak po stisku Enter pro přesun na další řádek vám VB automaticky doplní End Class, takže neřešíte žádné složené závorky ani klávesové zkratky. O něčem takovém si v CS můžete nechat zdát.

nahlásit spamnahlásit spam -15 / 15 odpovědětodpovědět

Nepleť si jazyk s vývojovým prostředím.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Prehladnost

No ja robim prevazne v C#, ale bol som nuteny robit aj vo VB. Co ma na VB najviac otravuje, je jeho ukecanost. To vyslovene neznasam.

If C IsNot Nothing Then
 Dim V As MyObject = New MyObject()
End If

If (C != null)
{
 MyObject V = New MyObject();
}

Opticky je kod v C# ovela prehladnejsi, pretoze kombinuje text a specialne znaky. Co zvyrazni mnou napisany kod, od "kodu" samotneho jazyka.

Navyse vo VB pri praci s intellisense musim vzdy vediet, co mam dalej dat. Ci zatvorku, ci bodu, alebo niekedy zbytocnu medzeru, aby pouzil mnou vybranu moznost. V C# staci na vsetko enter, ktory je velky, a hned po ruke.

Bolo by zaujimave si dat battle, ci "to iste" sa rychlejsie napise v C# alebo vo VB :). Samozrejme za predpokladu, ze kazdy by rovnako obvladal svoj jazyk...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Event handlery v C#

Možno už od verzie 2.0 je možné vynechávať vytvorenie delegátu

this.Load += this.Form1_Load;

// ...

this.Load -= this.Form1_Load;
 
void Form1_Load(Object sender, EventArgs e)
{
}
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Proč je Visual Basic lepší než C#

Já osobně si myslím, že tyhle věci jen každého otravují a znepřehledňují kód. Prostě klasický C zdroják (ne C++ !) je nejjednodušší, nejpřehlednější atd. Nemusím všehny zbytečnosti, které zmiňujete v článku a mohu se soustředit jen na psaní vlastní logiky. Pro zajímavé věci jde případně i okořenit přímo instrukcemi assembleru. Ve VB.NET si prostě doprostřed instrukce neskočíte ...

J

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Ve skutečnosti je to právě naopak - tyhle věci kód dělají mnohem přehlednější, čitelnější a srozumitelnější, než je například uváděné C(++), které je na tom syntakticky ještě mnohem hůře, než C#. Ty "zbytečnosti" obrovsky urychlují vývoj a usnadňují vytváření často používané funkčnosti, která by se jinak musela dělat od píky ručně (a kromě toho vůbec není nutné je používat). Assembler v dnešní době kromě vysoce výkonově náročných aplikací zcela postrádá smysl, tudíž to není žádný argument. Pokud je potřeba někam skočit, použije se GoTo.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Diskuse: Proč je Visual Basic lepší než C#

1) Late binding je v C#, máme typ dynamic.

2) VB.NET nemá yield return, který se občas hodí. V nadcházející verzi naštěstí bude (resp. budou tam iterátory, což je totéž).

3) Ukecaná syntaxe VB je věc, která mi na něm vadí asi nejvíc (přestože ho na některých projektech používáme). Místo krátkého zápisu lambda funkce a => výraz se musí psát Function(a) výraz, což je otravné. Navíc se mi Visual Studio u složitějších lambda výrazů seká a je pomalejší než v C# - to není chyba jazyka, ale bez Visual Studia stejně ve VB.NET ani v C# nikdo nepíše.

4) XML literály jsou super i proto, že uvnitř můžete mít For Each cyklus, který vygeneruje kusy XML dynamicky.

5) Select Case na steroidech jsou hezké, ale v praxi použiji Select tak jednou za měsíc a složitější podmínku než rovnost jsem tam snad ještě nikdy dát nepotřeboval. Smečka Ifů to řeší.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

1) A je v C# také něco jako CreateObject? Pokud vím tak není, ani v nejnovější verzi.

nahlásit spamnahlásit spam -14 / 14 odpovědětodpovědět
var comType = Type.GetTypeFromProgID("SQLXMLBulkLoad.SQLXMLBulkload.3.0");
dynamic comObject = Activator.CreateInstance(comType);

Anebo můžete nareferencovat Microsoft.VisualBasic.dll a použít CreateObject.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Diskuse: Proč je Visual Basic lepší než C#

Ještě jsem zapomněl dodat, že ve VB jde vytvořit statická proměnná uvnitř metody. To je vlastně další úroveň zapouzdřenosti, protože k takové proměnné je přísup jen z metody, ve které je deklarovaná, přestože je statická.

Sub DoWork()
  Static Dim n As Integer
End Sub

nahlásit spamnahlásit spam -14 / 14 odpovědětodpovědět

Ano, statická proměnná v metodě je super - navíc je thrad safe.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Diskuse: Proč je Visual Basic lepší než C#

Co mě, ale na VB trochu chybí je, že když chci case nějaké enumerace, tak VB mi dá jen end case a zbytek je na mě.

V C# mi switch vyplní i všechny hodnoty výčtu.

Ale teď si říkám jestli to nedělá jen nová verze VS.

A při přidávání handleru z kódu mi VS C# nabídne tuším že na nějaké F vygenerování metody pro událost. To by se ve VB obšas taky hodilo.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Na ty enumerace používám věcičku z MZ-Tools. Handlovací metoda připojená k události se dá ve VB vyvořit tak, že se z levého seznamu v okně kódu vybere objekt, v pravém seznamu jeho událost, VS vytvoří vše potřebné. Navíc když se v CS připojí metoda k události v návrháři a tato metoda se potom ručně smaže, je nutné provést příslušné změny v souboru .Designer.cs - prasárna. To ve VB díky klauzuli Handles není nutné.

nahlásit spamnahlásit spam -15 / 15 odpovědětodpovědět

Diskuse: Proč je Visual Basic lepší než C#

Pěkný článek :-) Jdu otevřít Visual Studio, a psát Csharpový kód :-) Zvyk je zvyk, at jsou výhody jakékoliv

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback