🔷 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
| Typ | Rozsah / Popis | Přípona literálu | Výchozí |
|---|---|---|---|
Boolean | True / False | — | False |
Byte | 0 – 255 (8 bit bez znaménka) | — | 0 |
SByte | −128 – 127 (8 bit se znaménkem) | — | 0 |
Short | −32 768 – 32 767 (16 bit) | S | 0 |
Integer | −2 147 483 648 – 2 147 483 647 (32 bit) | I | 0 |
Long | ±9,2 × 1018 (64 bit) | L | 0 |
Single | ±1,5 × 10−45 – ±3,4 × 1038 (32 bit) | F | 0.0 |
Double | ±5 × 10−324 – ±1,7 × 10308 (64 bit) | R | 0.0 |
Decimal | ±7,9 × 1028, 28–29 des. míst (128 bit) | D nebo M | 0 |
Char | Jeden znak Unicode (16 bit) | C | NUL |
Date | 1.1.0001 – 31.12.9999 | — | #1/1/0001# |
String | Řetězec znaků Unicode | — | Nothing |
Deklarace a konverze typů
' 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
| Funkce | Cílový typ | Příklad |
|---|---|---|
CInt() | Integer | CInt(3.7) → 4 |
CLng() | Long | CLng("999999999") |
CDbl() | Double | CDbl("3.14") |
CDec() | Decimal | CDec("19.99") |
CSng() | Single | CSng(3.14) |
CBool() | Boolean | CBool(0) → False |
CStr() | String | CStr(42) → "42" |
CChar() | Char | CChar("A") |
CDate() | Date | CDate("31.12.2024") |
CByte() | Byte | CByte(255) |
CObj() | Object | CObj(cislo) |
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
' 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)
| Rozsah | Klíčové slovo | Popis |
|---|---|---|
| Blok | Dim | Platí jen uvnitř bloku (If, For…) |
| Procedura | Dim, Static | Platí v celé proceduře/funkci |
| Modul / třída | Private | Platí v celém modulu nebo třídě |
| Jmenný prostor | Friend | Platí v celém sestavení (assembly) |
| Globální | Public | Přístupné odkudkoliv |
Výčty (Enum)
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átor | Popis | Příklad | Výsledek |
|---|---|---|---|
+ | Sčítání | 5 + 3 | 8 |
- | Odčítání | 10 - 4 | 6 |
* | Násobení | 3 * 7 | 21 |
/ | Dělení (Double) | 7 / 2 | 3.5 |
\ | Celočíselné dělení | 7 \ 2 | 3 |
Mod | Zbytek po dělení | 7 Mod 2 | 1 |
^ | Mocnina | 2 ^ 10 | 1024 |
& | Zřetězení řetězců | "Ahoj" & " " & "světe" | "Ahoj světe" |
Porovnávací & logické operátory
' 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
' 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
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
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í
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
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
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
' 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
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
' 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)
' 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
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
' 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)
' 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
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)
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
' 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
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
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).
' 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í.
' 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
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
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
💾 Soubory (File I/O)
Čtení, zápis a správa souborů a adresářů přes System.IO.
Textové soubory
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
' 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
' 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
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é
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.
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
.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.
' 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