🔷 Datové typy

VB.NET je silně typovaný jazyk. Každá proměnná má přesně definovaný typ určující rozsah hodnot a paměťové nároky.

Primitivní (hodnotové) typy

TypRozsah / PopisPřípona literáluVýchozí
BooleanTrue / False—False
Byte0 – 255 (8 bit bez znaménka)—0
SByte−128 – 127 (8 bit se znaménkem)—0
Short−32 768 – 32 767 (16 bit)S0
Integer−2 147 483 648 – 2 147 483 647 (32 bit)I0
Long±9,2 × 1018 (64 bit)L0
Single±1,5 × 10−45 – ±3,4 × 1038 (32 bit)F0.0
Double±5 × 10−324 – ±1,7 × 10308 (64 bit)R0.0
Decimal±7,9 × 1028, 28–29 des. míst (128 bit)D nebo M0
CharJeden znak Unicode (16 bit)CNUL
Date1.1.0001 – 31.12.9999—#1/1/0001#
StringŘetězec znaků Unicode—Nothing

Deklarace a konverze typů

VB.NET
' Explicitní deklarace
Dim cislo As Integer = 42
Dim cena As Decimal = 19.99D
Dim jmeno As String = "Pavel"
Dim aktivni As Boolean = True
Dim datum As Date = Date.Now

' Odvozený typ — Option Infer On
Dim x = 3.14      ' Double
Dim s = "ahoj"  ' String

' Konverze typů
Dim i As Integer = CInt("123")          ' String → Integer
Dim d As Double  = CDbl(i)              ' Integer → Double
Dim t As String  = i.ToString()         ' Integer → String
Dim b As Boolean = CBool(1)             ' Číslo → Boolean

' Bezpečná konverze (TryParse)
Dim vysledek As Integer
If Integer.TryParse("456", vysledek) Then
    Console.WriteLine(vysledek)   ' 456
End If

' Nullable typy (hodnota nebo Nothing)
Dim nullable As Integer? = Nothing
If nullable.HasValue Then
    Console.WriteLine(nullable.Value)
End If

Konverzní funkce — přehled

FunkceCílový typPříklad
CInt()IntegerCInt(3.7) → 4
CLng()LongCLng("999999999")
CDbl()DoubleCDbl("3.14")
CDec()DecimalCDec("19.99")
CSng()SingleCSng(3.14)
CBool()BooleanCBool(0) → False
CStr()StringCStr(42) → "42"
CChar()CharCChar("A")
CDate()DateCDate("31.12.2024")
CByte()ByteCByte(255)
CObj()ObjectCObj(cislo)
💡 Tip: Pro finanční výpočty vždy používejte typ Decimal — má přesnost 28–29 desetinných míst a vyhne se zaokrouhlovacím chybám plovoucí desetinné čárky.

📦 Proměnné & konstanty

Deklarace, rozsah platnosti a modifikátory přístupu proměnných, konstant a výčtů.

Deklarace proměnných

VB.NET
' Základní Dim
Dim vek As Integer = 30

' Více proměnných na jednom řádku
Dim x, y, z As Double

' Konstanty — hodnota se nesmí měnit
Const PI As Double = 3.14159265358979
Const MAX_SIZE As Integer = 100

' ReadOnly — inicializace jen jednou (i v konstruktoru)
ReadOnly CreatedAt As Date = Date.Now

' Static — proměnná procedury uchovává hodnotu mezi voláními
Sub Pocitej()
    Static pocet As Integer = 0
    pocet += 1
    Console.WriteLine(pocet)
End Sub

Rozsah platnosti (Scope)

RozsahKlíčové slovoPopis
BlokDimPlatí jen uvnitř bloku (If, For…)
ProceduraDim, StaticPlatí v celé proceduře/funkci
Modul / třídaPrivatePlatí v celém modulu nebo třídě
Jmenný prostorFriendPlatí v celém sestavení (assembly)
GlobálníPublicPřístupné odkudkoliv

Výčty (Enum)

VB.NET
Enum Barva
    Cervena = 1
    Zelena
    Modra
    Bila
End Enum

Enum Opravneni As Byte    ' podkladový typ Byte
    Zadne  = 0
    Cteni  = 1
    Zapis  = 2
    Admin  = 4
End Enum

' Použití
Dim b As Barva = Barva.Zelena
Console.WriteLine(b)                   ' Zelena
Console.WriteLine(CInt(b))              ' 2
Console.WriteLine(b.ToString())        ' "Zelena"

' Parsování řetězce na Enum
Dim e As Barva = DirectCast([Enum].Parse(GetType(Barva), "Modra"), Barva)

➕ Operátory

Aritmetické, porovnávací, logické, bitové operátory a operátory přiřazení.

Aritmetické operátory

OperátorPopisPříkladVýsledek
+Sčítání5 + 38
-Odčítání10 - 46
*Násobení3 * 721
/Dělení (Double)7 / 23.5
\Celočíselné dělení7 \ 23
ModZbytek po dělení7 Mod 21
^Mocnina2 ^ 101024
&Zřetězení řetězců"Ahoj" & " " & "světe""Ahoj světe"

Porovnávací & logické operátory

VB.NET
' Porovnávací
a = 5 = 5    ' rovnost
a <> b        ' nerovnost
a <  b        ' menší
a >  b        ' větší
a <= b        ' menší nebo rovno
a >= b        ' větší nebo rovno

' Logické (vyhodnotí oba operandy)
And   ' logické AND
Or    ' logické OR
Not   ' logické NOT
Xor   ' exkluzivní OR

' Zkrácené vyhodnocení (short-circuit)
AndAlso   ' pravý operand se nevyhodnotí, je-li levý False
OrElse    ' pravý operand se nevyhodnotí, je-li levý True

' Příklad
Dim s As String = Nothing
If s IsNot Nothing AndAlso s.Length > 0 Then   ' bezpečné — s.Length se nezavolá
    Console.WriteLine(s)
End If

' Operátory přiřazení
x += 5    ' x = x + 5
x -= 3    ' x = x - 3
x *= 2    ' x = x * 2
x /= 4    ' x = x / 4
x \= 2    ' x = x \ 2
x ^= 2    ' x = x ^ 2
s &= " světe"  ' zřetězení a přiřazení

Operátory pro typy

VB.NET
' TypeOf … Is — kontrola typu
If TypeOf obj Is String Then
    Console.WriteLine("Je to řetězec")
End If

' Is / IsNot — porovnání reference
If obj1 Is obj2 Then     ' stejný objekt v paměti?
If obj Is Nothing Then   ' null kontrola

' Like — porovnání řetězce se vzorem
If "Pavel123" Like "Pavel*" Then  ' True — hvězdička = libovolné znaky
If "A" Like "[A-Z]" Then         ' True — velké písmeno

📝 Řetězce (String)

Práce s řetězci — metody třídy String, StringBuilder, formátování a interpolace.

Základní operace s řetězci

VB.NET
Dim s As String = "  Ahoj, světe!  "

' Délka a přístup
Console.WriteLine(s.Length)              ' 17
Console.WriteLine(s(2))                  ' 'A' (0-based)

' Ořezání mezer
Console.WriteLine(s.Trim())             ' "Ahoj, světe!"
Console.WriteLine(s.TrimStart())       ' odebere mezery zleva
Console.WriteLine(s.TrimEnd())         ' odebere mezery zprava

' Velká/malá písmena
Console.WriteLine(s.ToUpper())         ' "  AHOJ, SVĚTE!  "
Console.WriteLine(s.ToLower())         ' "  ahoj, světe!  "

' Hledání
Console.WriteLine(s.Contains("světe"))     ' True
Console.WriteLine(s.IndexOf("světe"))      ' 8
Console.WriteLine(s.StartsWith("  Ahoj")) ' True
Console.WriteLine(s.EndsWith("!  "))     ' True

' Výřez, nahrazení
Console.WriteLine(s.Substring(2, 4))     ' "Ahoj"
Console.WriteLine(s.Replace("světe", "VB.NET")) ' "  Ahoj, VB.NET!  "

' Dělení
Dim casti() As String = "a,b,c,d".Split(","c)   ' {"a","b","c","d"}

' Spojení
Dim spp As String = String.Join("; ", casti)  ' "a; b; c; d"

' Opakování
Dim rrr As String = String.Concat(Enumerable.Repeat("-", 10)) ' "----------"

Formátování a interpolace

VB.NET
Dim jmeno = "Pavel"
Dim vek = 35
Dim cena = 1234.5D

' Interpolace ($ prefix)
Dim zpr = $"Jméno: {jmeno}, věk: {vek}"

' String.Format
Dim z2 = String.Format("Jméno: {0}, věk: {1}", jmeno, vek)

' Číselné formáty
Console.WriteLine(cena.ToString("N2"))     ' 1 234,50
Console.WriteLine(cena.ToString("C"))      ' 1 234,50 Kč (dle locale)
Console.WriteLine(cena.ToString("F0"))     ' 1235 (zaokrouhleno)
Console.WriteLine(cena.ToString("E2"))     ' 1,23E+003
Console.WriteLine(cena.ToString("P"))      ' 123 450,00 %

' Formát data
Dim d = Date.Now
Console.WriteLine(d.ToString("dd.MM.yyyy"))         ' 29.04.2025
Console.WriteLine(d.ToString("HH:mm:ss"))           ' 14:05:33
Console.WriteLine(d.ToString("dd.MM.yyyy HH:mm"))   ' 29.04.2025 14:05

StringBuilder — efektivní sestavování

VB.NET
Imports System.Text

Dim sb As New StringBuilder()
sb.Append("Ahoj")
sb.Append(", ")
sb.AppendLine("světe!")             ' přidá + nový řádek
sb.AppendFormat("Čas: {0:HH:mm}", Date.Now)
sb.Insert(0, "--- Start ---" & vbCrLf)  ' vloží na pozici 0
sb.Replace("světe", "VB.NET")
sb.Remove(0, 7)                        ' odebere 7 znaků od pozice 0
Console.WriteLine(sb.ToString())

💚 Tip: Pro opakované skládání řetězců (v cyklu, 100+ iterací) je StringBuilder výrazně rychlejší než operátor &.

🔀 Podmínky

Větvení programu pomocí If…Then…Else a Select Case.

If … Then … Else

VB.NET
Dim teplota As Integer = 22

' Jednořádkový If
If teplota > 30 Then Console.WriteLine("Horko!")

' Víceřádkový If
If teplota < 0 Then
    Console.WriteLine("Mráz")
ElseIf teplota < 10 Then
    Console.WriteLine("Chladno")
ElseIf teplota < 25 Then
    Console.WriteLine("Příjemno")
Else
    Console.WriteLine("Teplo nebo horko")
End If

' Terciární operátor — IIf (vyhodnotí oba výrazy!)
Dim popis = IIf(teplota > 20, "teplé", "studené")

' If() — zkrácené, bezpečné
Dim popis2 = If(teplota > 20, "teplé", "studené")

' Null-coalescing: If(value, fallback)
Dim nazev As String = Nothing
Dim vysledek = If(nazev, "Neznámý")   ' "Neznámý"

Select Case

VB.NET
Dim kod As Integer = 404

Select Case kod
    Case 200
        Console.WriteLine("OK")
    Case 201, 202
        Console.WriteLine("Created / Accepted")
    Case 400 To 499
        Console.WriteLine("Chyba klienta")
    Case Is >= 500
        Console.WriteLine("Chyba serveru")
    Case Else
        Console.WriteLine("Neznámý kód")
End Select

' Select Case se řetězci
Dim jazyk = "VB"
Select Case jazyk.ToUpper()
    Case "VB", "VBNET"
        Console.WriteLine("Visual Basic")
    Case "CS", "CSHARP"
        Console.WriteLine("C#")
    Case Else
        Console.WriteLine("Jiný jazyk")
End Select

🔁 Smyčky

For…Next, For Each, While, Do…Loop — iterace a ovládání průběhu smyčky.

For … Next

VB.NET
' Základní cyklus
For i As Integer = 1 To 5
    Console.Write(i & " ")   ' 1 2 3 4 5
Next i

' Se Step (krokem)
For i As Integer = 10 To 1 Step -2
    Console.Write(i & " ")   ' 10 8 6 4 2
Next

' Vnořené cykly s Exit For / Continue For
For r As Integer = 1 To 3
    For c As Integer = 1 To 3
        If c = 2 Then Continue For   ' přeskočí c=2
        Console.Write($"({r},{c}) ")
    Next
Next

For Each

VB.NET
Dim ovoce As New List(Of String) From {"jablko", "hruška", "švestka"}

For Each polozka As String In ovoce
    Console.WriteLine(polozka)
Next

' Iterace přes Dictionary
Dim slovnik As New Dictionary(Of String, Integer) From {
    {"a", 1}, {"b", 2}, {"c", 3}
}
For Each par As KeyValuePair(Of String, Integer) In slovnik
    Console.WriteLine($"{par.Key} = {par.Value}")
Next

While a Do … Loop

VB.NET
' While — podmínka na začátku
Dim n As Integer = 1
While n <= 5
    Console.Write(n & " ")
    n += 1
End While

' Do While — podmínka na začátku
Do While n <= 10
    Console.Write(n & " ")
    n += 1
Loop

' Do … Loop Until — podmínka na konci (proběhne alespoň 1×)
Dim vstup As String
Do
    Console.Write("Zadej 'konec': ")
    vstup = Console.ReadLine()
Loop Until vstup.ToLower() = "konec"

' Exit Loop — okamžité ukončení
Dim k = 0
Do
    If k = 3 Then Exit Do
    k += 1
Loop

⚙️ Sub & Function

Procedury (Sub), funkce (Function), parametry, přetížení a lambdy.

Sub — procedura (nevrací hodnotu)

VB.NET
' Základní Sub
Sub Pozdrav(jmeno As String)
    Console.WriteLine($"Ahoj, {jmeno}!")
End Sub

' Volitelný parametr s výchozí hodnotou
Sub Tisk(text As String, Optional odsazeni As Integer = 0)
    Console.WriteLine(New String(" "c, odsazeni) & text)
End Sub

' Předání hodnotou (ByVal) a referencí (ByRef)
Sub ZdvojRef(ByRef x As Integer)
    x *= 2    ' změní původní proměnnou
End Sub

Sub ZdvojVal(ByVal x As Integer)
    x *= 2    ' mění pouze lokální kopii
End Sub

' ParamArray — proměnný počet parametrů
Sub SoucetVsech(ParamArray cisla() As Integer)
    Dim s = cisla.Sum()
    Console.WriteLine($"Součet: {s}")
End Sub
SoucetVsech(1, 2, 3, 4, 5)   ' Součet: 15

Function — vrací hodnotu

VB.NET
Function Faktorial(n As Integer) As Long
    If n <= 1 Then Return 1
    Return n * Faktorial(n - 1)     ' rekurze
End Function

' Pojmenované argumenty při volání
Function Mocnina(zaklad As Double, exponent As Integer) As Double
    Return zaklad ^ exponent
End Function
Dim v = Mocnina(exponent:=3, zaklad:=2)  ' 8 (pojmenované argumenty)

' Přetížení (Overloads)
Overloads Function Soucet(a As Integer, b As Integer) As Integer
    Return a + b
End Function
Overloads Function Soucet(a As Double, b As Double) As Double
    Return a + b
End Function

Lambda výrazy

VB.NET
' Jednořádková lambda
Dim ctverec As Func(Of Integer, Integer) = Function(x) x * x
Console.WriteLine(ctverec(5))   ' 25

' Víceřádková lambda
Dim pozdrav As Action(Of String) = Sub(jmeno)
    Console.WriteLine($"Dobrý den, {jmeno}!")
End Sub
pozdrav("Pavel")

' Lambda v LINQ
Dim cisla = {1, 2, 3, 4, 5, 6}
Dim suda = cisla.Where(Function(x) x Mod 2 = 0).ToList()  ' {2,4,6}
Dim souct = cisla.Sum(Function(x) x * x)              ' 91

📋 Pole & kolekce

Jednorozměrná i vícerozměrná pole, List, Dictionary, Queue, Stack a další generické kolekce.

Pole (Array)

VB.NET
' Deklarace a inicializace
Dim a1(4) As Integer                  ' 5 prvků (0–4), výchozí 0
Dim a2() As String = {"x", "y", "z"}  ' inicializátor
Dim a3 = New Integer() {10, 20, 30}

' Přístup a délka
a1(0) = 42
Console.WriteLine(a2.Length)        ' 3
Console.WriteLine(a2.GetUpperBound(0)) ' 2 (max index)

' Dynamická změna velikosti
ReDim Preserve a1(9)               ' zvětšení, zachová data

' Dvourozměrné pole
Dim matice(2, 2) As Integer
matice(0, 0) = 1 : matice(0, 1) = 2
Console.WriteLine(matice.Length)    ' 9 (celkem prvků)

' Třídění a vyhledávání
Array.Sort(a3)
Array.Reverse(a3)
Dim idx = Array.IndexOf(a2, "y")     ' 1

List(Of T) — dynamický seznam

VB.NET
Dim lst As New List(Of String) From {"A", "B", "C"}
lst.Add("D")
lst.AddRange({"E", "F"})
lst.Insert(0, "Z")                    ' vloží na index 0
lst.Remove("B")                       ' odebere první výskyt
lst.RemoveAt(2)                       ' odebere na indexu 2
Console.WriteLine(lst.Contains("A"))  ' True
Console.WriteLine(lst.Count)          ' počet prvků
lst.Sort()
lst.Reverse()
Dim arr = lst.ToArray()              ' List → Array

Dictionary(Of TKey, TValue)

VB.NET
Dim d As New Dictionary(Of String, Integer)
d.Add("alfa", 1)
d("beta") = 2      ' přidá nebo přepíše
d("gama") = 3

Console.WriteLine(d("alfa"))          ' 1
Console.WriteLine(d.ContainsKey("beta")) ' True

' Bezpečné čtení — TryGetValue
Dim val As Integer
If d.TryGetValue("delta", val) Then
    Console.WriteLine(val)
Else
    Console.WriteLine("Klíč neexistuje")
End If

d.Remove("gama")
Console.WriteLine(String.Join(", ", d.Keys))   ' alfa, beta

Ostatní kolekce

VB.NET
' Queue(Of T) — FIFO
Dim fronta As New Queue(Of String)
fronta.Enqueue("první")
fronta.Enqueue("druhý")
Console.WriteLine(fronta.Dequeue())  ' "první"
Console.WriteLine(fronta.Peek())     ' "druhý" (nemaže)

' Stack(Of T) — LIFO
Dim zasobnik As New Stack(Of Integer)
zasobnik.Push(10)
zasobnik.Push(20)
Console.WriteLine(zasobnik.Pop())    ' 20

' HashSet(Of T) — unikátní prvky
Dim hs As New HashSet(Of Integer) From {1, 2, 3, 2, 1}
Console.WriteLine(hs.Count)         ' 3
hs.Add(4) : hs.Remove(2)
Console.WriteLine(hs.Contains(3))   ' True

🏛️ Třídy (OOP)

Definice tříd, konstruktory, vlastnosti, metody, modifikátory přístupu.

Definice třídy

VB.NET
Public Class Osoba
    ' Soukromá pole
    Private _jmeno As String
    Private _vek As Integer

    ' Automatická vlastnost
    Public Property Email As String

    ' Vlastnost s validací
    Public Property Vek As Integer
        Get
            Return _vek
        End Get
        Set(value As Integer)
            If value < 0 OrElse value > 150 Then
                Throw New ArgumentOutOfRangeException("Neplatný věk")
            End If
            _vek = value
        End Set
    End Property

    ' Vlastnost pouze pro čtení
    Public ReadOnly Property Jmeno As String
        Get
            Return _jmeno
        End Get
    End Property

    ' Konstruktory
    Public Sub New(jmeno As String)
        _jmeno = jmeno
        _vek = 0
    End Sub

    Public Sub New(jmeno As String, vek As Integer)
        Me.New(jmeno)    ' delegace na jiný konstruktor
        Me.Vek = vek
    End Sub

    ' Metody
    Public Function PredstavSe() As String
        Return $"Jmenuji se {_jmeno}, je mi {_vek} let."
    End Function

    ' Přepsání ToString
    Public Overrides Function ToString() As String
        Return $"Osoba({_jmeno}, {_vek})"
    End Function

    ' Destruktor (Finalize)
    Protected Overrides Sub Finalize()
        ' úklid nespravovaných zdrojů
        MyBase.Finalize()
    End Sub
End Class

' Použití třídy
Dim p As New Osoba("Pavel", 35)
Console.WriteLine(p.PredstavSe())
Console.WriteLine(p)

Sdílené (Shared) členy

VB.NET
Public Class Pocitadlo
    Private Shared _celkem As Integer = 0

    Public Shared ReadOnly Property Celkem As Integer
        Get
            Return _celkem
        End Get
    End Property

    Public Sub New()
        _celkem += 1
    End Sub

    Public Shared Sub Reset()
        _celkem = 0
    End Sub
End Class

Dim a As New Pocitadlo()
Dim b As New Pocitadlo()
Console.WriteLine(Pocitadlo.Celkem)  ' 2
Pocitadlo.Reset()

🧬 Dědičnost

Extends, Overrides, MustInherit (abstraktní třídy), NotInheritable (sealed).

VB.NET
' Abstraktní (MustInherit) třída
Public MustInherit Class Tvar
    Public Property Barva As String

    Public MustOverride Function Obvod() As Double
    Public MustOverride Function Obsah() As Double

    Public Overridable Sub Popis()   ' lze přepsat, ale nemusí
        Console.WriteLine($"Tvar barvy {Barva}")
    End Sub
End Class

' Odvozená třída
Public Class Obdelnik
    Inherits Tvar

    Public Property Sirka As Double
    Public Property Vyska As Double

    Public Sub New(s As Double, v As Double)
        Sirka = s : Vyska = v
    End Sub

    Public Overrides Function Obvod() As Double
        Return 2 * (Sirka + Vyska)
    End Function

    Public Overrides Function Obsah() As Double
        Return Sirka * Vyska
    End Function

    Public Overrides Sub Popis()
        MyBase.Popis()    ' volání metody předka
        Console.WriteLine($"Obdélník {Sirka}×{Vyska}")
    End Sub
End Class

' Zapečetěná (nelze dědit)
Public NotInheritable Class Ctverec
    Inherits Obdelnik
    Public Sub New(strana As Double)
        MyBase.New(strana, strana)
    End Sub
End Class

' Polymorfismus
Dim tvary As New List(Of Tvar) From {
    New Obdelnik(4, 3), New Ctverec(5)
}
For Each t In tvary
    Console.WriteLine($"Obsah: {t.Obsah()}")
Next

🔌 Rozhraní (Interface)

Kontrakty chování — třída může implementovat více rozhraní.

VB.NET
' Definice rozhraní
Public Interface IUkladatelny
    Sub Uloz(cesta As String)
    Function Nacti(cesta As String) As Boolean
    ReadOnly Property JeUlozeno As Boolean
End Interface

Public Interface IValidovatelny
    Function Validuj() As Boolean
End Interface

' Implementace více rozhraní
Public Class Dokument
    Implements IUkladatelny, IValidovatelny

    Private _ulozeno As Boolean

    Public ReadOnly Property JeUlozeno As Boolean Implements IUkladatelny.JeUlozeno
        Get
            Return _ulozeno
        End Get
    End Property

    Public Sub Uloz(cesta As String) Implements IUkladatelny.Uloz
        ' logika uložení...
        _ulozeno = True
    End Sub

    Public Function Nacti(cesta As String) As Boolean Implements IUkladatelny.Nacti
        Return IO.File.Exists(cesta)
    End Function

    Public Function Validuj() As Boolean Implements IValidovatelny.Validuj
        Return True
    End Function
End Class

' Použití rozhraní jako typ
Dim dok As IUkladatelny = New Dokument()
dok.Uloz("C:\data.txt")

🛡️ Ošetření chyb

Try…Catch…Finally, vlastní výjimky a vzory jejich použití.

Try … Catch … Finally

VB.NET
Try
    Dim text = IO.File.ReadAllText("data.txt")
    Dim cislo = CInt(text)
    Console.WriteLine(100 / cislo)

Catch ex As IO.FileNotFoundException
    Console.WriteLine($"Soubor nenalezen: {ex.Message}")

Catch ex As InvalidCastException
    Console.WriteLine("Nelze převést na číslo")

Catch ex As DivideByZeroException
    Console.WriteLine("Dělení nulou!")

Catch ex As Exception
    Console.WriteLine($"Obecná chyba: {ex.Message}")
    Console.WriteLine(ex.StackTrace)

Finally
    ' Vždy se provede (i při výjimce)
    Console.WriteLine("Hotovo.")
End Try

' Opakované vyvolání výjimky
Catch ex As Exception
    Console.WriteLine("Loguji...")
    Throw   ' zachová původní stack trace
End Try

Vlastní výjimka

VB.NET
Public Class ValidationException
    Inherits Exception

    Public ReadOnly Property Pole As String

    Public Sub New(pole As String, zprava As String)
        MyBase.New(zprava)
        Pole = pole
    End Sub
End Class

' Použití
Sub ValidujVek(vek As Integer)
    If vek < 0 Then
        Throw New ValidationException("Vek", "Věk musí být kladný")
    End If
End Sub

Try
    ValidujVek(-5)
Catch ex As ValidationException
    Console.WriteLine($"Chyba pole '{ex.Pole}': {ex.Message}")
End Try
💡 Výjimky zachytávej od nejspecifičtější (IOException) po nejobecnější (Exception). Pořadí Catch bloků záleží — platí první shoda.

💾 Soubory (File I/O)

Čtení, zápis a správa souborů a adresářů přes System.IO.

Textové soubory

VB.NET
Imports System.IO

' Zápis — vytvoří nebo přepíše
File.WriteAllText("soubor.txt", "Obsah souboru", Encoding.UTF8)

' Přidání na konec
File.AppendAllText("soubor.txt", vbCrLf & "Další řádek")

' Zápis řádků
Dim radky() = {"Řádek 1", "Řádek 2", "Řádek 3"}
File.WriteAllLines("soubor.txt", radky, Encoding.UTF8)

' Čtení — celý obsah
Dim obsah = File.ReadAllText("soubor.txt", Encoding.UTF8)

' Čtení — pole řádků
Dim vsechnyRadky() = File.ReadAllLines("soubor.txt")

' Čtení řádek po řádku (velké soubory)
Using sr As New StreamReader("soubor.txt", Encoding.UTF8)
    Dim radek As String
    Do While (InlineAssignHelper(radek, sr.ReadLine())) IsNot Nothing
        Console.WriteLine(radek)
    Loop
End Using

' Nebo jednoduše:
For Each radek In File.ReadLines("soubor.txt")
    Console.WriteLine(radek)
Next

StreamWriter — zápis

VB.NET
' Using zajistí uzavření i při výjimce
Using sw As New StreamWriter("log.txt", True, Encoding.UTF8)
    ' True = append (přidávat), False = přepsat
    sw.WriteLine($"[{Date.Now:HH:mm:ss}] Start")
    sw.Write("bez nového řádku")
    sw.Flush()   ' vyprázdní buffer
End Using

Práce s adresáři

VB.NET
' Cesta
Dim cesta = Path.Combine("C:\Data", "podadresar", "soubor.txt")
Console.WriteLine(Path.GetFileName(cesta))      ' soubor.txt
Console.WriteLine(Path.GetExtension(cesta))    ' .txt
Console.WriteLine(Path.GetDirectoryName(cesta)) ' C:\Data\podadresar
Console.WriteLine(Path.GetTempPath())            ' dočasný adresář

' Soubory
Console.WriteLine(File.Exists(cesta))            ' True/False
File.Copy("zdrojovy.txt", "cilovy.txt", True)    ' True = přepsat
File.Move("stary.txt", "novy.txt")
File.Delete("docasny.txt")

' Adresáře
If Not Directory.Exists("C:\Nove") Then
    Directory.CreateDirectory("C:\Nove")
End If
Dim soubory() = Directory.GetFiles("C:\Data", "*.txt", SearchOption.AllDirectories)

🔎 LINQ

Language Integrated Query — dotazy nad kolekcemi, datovými zdroji a XML.

Syntaxe dotazu vs. metody

VB.NET
Dim cisla = Enumerable.Range(1, 20)  ' 1..20

' ── Syntaxe dotazu (query syntax) ──
Dim vysledek1 = From n In cisla
                 Where n Mod 2 = 0
                 Order By n Descending
                 Select n * n

' ── Metody (lambda syntax) ──
Dim vysledek2 = cisla
    .Where(Function(n) n Mod 2 = 0)
    .OrderByDescending(Function(n) n)
    .Select(Function(n) n * n)

' Agregace
Console.WriteLine(cisla.Sum())          ' 210
Console.WriteLine(cisla.Average())      ' 10.5
Console.WriteLine(cisla.Min())          ' 1
Console.WriteLine(cisla.Max())          ' 20
Console.WriteLine(cisla.Count())        ' 20
Console.WriteLine(cisla.Any(Function(n) n > 15))  ' True
Console.WriteLine(cisla.All(Function(n) n > 0))   ' True

LINQ nad objekty — pokročilé

VB.NET
Class Produkt
    Public Property Nazev As String
    Public Property Cena As Decimal
    Public Property Kategorie As String
End Class

Dim produkty As New List(Of Produkt) From {
    New Produkt With {.Nazev = "Jablko",  .Cena = 5.5D,  .Kategorie = "Ovoce"},
    New Produkt With {.Nazev = "Hruška",  .Cena = 8.0D,  .Kategorie = "Ovoce"},
    New Produkt With {.Nazev = "Mrkev",   .Cena = 3.2D,  .Kategorie = "Zelenina"},
    New Produkt With {.Nazev = "Brambor", .Cena = 2.0D,  .Kategorie = "Zelenina"}
}

' Filtrování a projekce
Dim draze = produkty.Where(Function(p) p.Cena > 4D).Select(Function(p) p.Nazev)

' Třídění dle více klíčů
Dim serazene = produkty.OrderBy(Function(p) p.Kategorie)._
                              .ThenByDescending(Function(p) p.Cena)

' Seskupení (GroupBy)
Dim skupiny = produkty.GroupBy(Function(p) p.Kategorie)
For Each skupina In skupiny
    Console.WriteLine($"{skupina.Key}: {skupina.Count()} ks, průměr {skupina.Average(Function(p) p.Cena):N2}")
Next

' Stránkování (Skip / Take)
Dim stranka2 = produkty.Skip(2).Take(2).ToList()

' První / poslední / jediný
Dim nejdrazsi = produkty.MaxBy(Function(p) p.Cena)
Dim prvni     = produkty.FirstOrDefault(Function(p) p.Cena < 3D)

⚡ Async / Await

Asynchronní programování — neblokující operace s Async/Await a Task.

VB.NET
Imports System.Net.Http
Imports System.Threading.Tasks

' Async Sub — pouze pro event handlery
Private Async Sub BtnClick(sender As Object, e As EventArgs)
    Await NactiDataAsync()
End Sub

' Async Function — vrací Task(Of T)
Private Async Function NactiDataAsync() As Task(Of String)
    Using klient As New HttpClient()
        Dim odpoved = Await klient.GetStringAsync("https://api.example.com/data")
        Return odpoved
    End Using
End Function

' Paralelní čekání na více úloh
Async Function VsechnyNarazoAsync() As Task
    Dim ukol1 = NactiDataAsync()
    Dim ukol2 = NactiDataAsync()
    Await Task.WhenAll(ukol1, ukol2)
    Console.WriteLine($"1: {ukol1.Result}")
    Console.WriteLine($"2: {ukol2.Result}")
End Function

' Timeout a zrušení (CancellationToken)
Async Function STimeoutemAsync() As Task
    Dim cts As New CancellationTokenSource(TimeSpan.FromSeconds(5))
    Try
        Using klient As New HttpClient()
            Dim r = Await klient.GetAsync("https://api.example.com", cts.Token)
        End Using
    Catch ex As OperationCanceledException
        Console.WriteLine("Operace zrušena nebo vypršel čas")
    End Try
End Function
⚠️ Nikdy nepoužívej .Result nebo .Wait() v synchronním kódu — způsobí deadlock. Místo toho vždy Await.

📡 Delegáti & události

Typově bezpečné ukazatele na funkce, events a vzor Observer.

VB.NET
' Definice delegáta
Delegate Function Transformace(x As Integer) As Integer
Delegate Sub Oznameni(zprava As String)

' Přiřazení metody
Dim t As Transformace = AddressOf Zdvoj
Console.WriteLine(t(5))   ' 10

' Třída s událostmi
Public Class Timer
    Public Event Tiknuto(sekunda As Integer)
    Public Event Dokonceno()

    Public Async Sub Spust(sekundy As Integer)
        For i As Integer = 1 To sekundy
            Await Task.Delay(1000)
            RaiseEvent Tiknuto(i)
        Next
        RaiseEvent Dokonceno()
    End Sub
End Class

' Přihlášení k události (WithEvents)
Private WithEvents odpocet As New Timer()

Private Sub odpocet_Tiknuto(sekunda As Integer) Handles odpocet.Tiknuto
    Console.WriteLine($"Tik: {sekunda}")
End Sub

' Nebo AddHandler / RemoveHandler (dynamicky)
Dim t2 As New Timer()
AddHandler t2.Tiknuto, Sub(s) Console.WriteLine($"Sekunda: {s}")
AddHandler t2.Dokonceno, Sub() Console.WriteLine("Konec!")
t2.Spust(5)

' Func(Of …) a Action(Of …) — vestavěné typy delegátů
Dim f As Func(Of Integer, Integer, Integer) = Function(a, b) a + b
Dim g As Action(Of String) = Sub(s) Console.WriteLine(s)
Dim pred As Predicate(Of Integer) = Function(n) n > 0
Žádné výsledky pro ""