LEARN X · ЗА 15 МИН

Visual Basic .NET

Весь Visual Basic .NET на одной странице: модули, типы, циклы, коллекции, классы, ООП, обработка ошибок и особенности языка в комментариях кода.

Visual Basic .NET (VB.NET) — язык платформы .NET со словесным, читаемым синтаксисом. Весь язык на одной странице через плотно закомментированный код. Комментарий начинается с одинарной кавычки '. Читайте сверху вниз.

Структура программы

Точка входа — процедура Sub Main внутри модуля.

' Это однострочный комментарий — начинается с апострофа.
REM Устаревший способ комментария — ключевое слово REM.

' Imports подключает пространство имён (аналог using/import).
Imports System

' Module — контейнер для кода. Точка входа — Sub Main.
Module Program
    ' Sub Main — стартовая процедура (ничего не возвращает).
    Sub Main()
        ' Console.WriteLine — печать строки с переводом строки.
        Console.WriteLine("Привет, мир!")
        ' Console.Write — без перевода строки.
        Console.Write("Без ")
        Console.WriteLine("переноса")
        ' Чтение строки с клавиатуры:
        ' Dim name As String = Console.ReadLine()
    End Sub
End Module
' VB.NET НЕ чувствителен к регистру: dim = Dim = DIM.
' Инструкции разделяются переводом строки, а не точкой с запятой.

Переменные и типы

Объявление через Dim ... As Тип.

' Dim имя As Тип = значение
Dim age As Integer = 25          ' целое 32 бита
Dim big As Long = 9000000000L    ' целое 64 бита
Dim price As Double = 19.99       ' дробное двойной точности
Dim rate As Decimal = 0.05D       ' точное дробное (деньги)
Dim isOk As Boolean = True        ' True / False
Dim letter As Char = "A"c         ' один символ, суффикс c
Dim name As String = "Анна"       ' строка

' Несколько переменных одного типа в одной строке:
Dim x, y, z As Integer

' Const — константа, значение неизменно.
Const Pi As Double = 3.14159

' Nothing — значение по умолчанию (null для ссылок, 0 для чисел).
Dim empty As String = Nothing

' Преобразования типов:
Dim n As Integer = CInt("42")     ' строка → Integer
Dim s As String = CStr(42)         ' число → строка
Dim d As Double = CDbl("3.14")     ' строка → Double
' TryParse — безопасный разбор без исключения:
Dim parsed As Integer
Dim okParse As Boolean = Integer.TryParse("100", parsed)

Строки

Конкатенация через &, интерполяция через $"...".

Dim first As String = "Иван"
Dim last As String = "Петров"

' & — конкатенация (рекомендуется вместо +).
Dim full As String = first & " " & last  ' "Иван Петров"

' Интерполяция строк: $"...{выражение}..."
Dim age As Integer = 30
Dim msg As String = $"{first}, возраст {age}"

' String.Format с плейсхолдерами {0}, {1}:
Dim t As String = String.Format("{0} лет: {1}", age, first)

' Многострочный текст и спецсимволы:
Dim line As String = "Строка1" & vbCrLf & "Строка2"  ' перевод строки
Dim tab As String = "A" & vbTab & "B"               ' табуляция
Dim quote As String = "Он сказал ""да"""            ' кавычки удваиваются

' Методы строк:
Dim s As String = "  Hello World  "
Dim a = s.Trim()                  ' убрать пробелы по краям
Dim b = s.ToUpper()               ' ВЕРХНИЙ регистр
Dim c = s.ToLower()               ' нижний регистр
Dim d = s.Replace("o", "0")       ' замена подстроки
Dim len As Integer = s.Length     ' длина
Dim has As Boolean = s.Contains("World")
Dim idx As Integer = s.IndexOf("World")  ' позиция или -1
Dim sub_ As String = s.Substring(2, 5)   ' подстрока с позиции
Dim parts() As String = "a,b,c".Split(","c)  ' массив частей

Операторы и условия

If / ElseIf / Else / End If и Select Case.

Dim n As Integer = 7

' Арифметика: + - * / \ Mod ^
Dim div As Double = 7 / 2     ' 3.5 — обычное деление
Dim idiv As Integer = 7 \ 2   ' 3 — целочисленное деление
Dim rem_ As Integer = 7 Mod 2 ' 1 — остаток
Dim pow As Double = 2 ^ 10    ' 1024 — возведение в степень

' Сравнения: = <> < > <= >=
' Логические: And  Or  Not  AndAlso  OrElse (с коротким замыканием)
If n > 0 AndAlso n < 10 Then
    Console.WriteLine("Одна цифра")
ElseIf n >= 10 Then
    Console.WriteLine("Десять и больше")
Else
    Console.WriteLine("Ноль или отрицательное")
End If

' Однострочный If:
If n <> 0 Then Console.WriteLine("Не ноль")

' Тернарный аналог — функция If(условие, еслиИстина, еслиЛожь):
Dim sign As String = If(n >= 0, "плюс", "минус")

' Select Case — выбор по значению.
Select Case n
    Case 1
        Console.WriteLine("один")
    Case 2, 3, 4            ' несколько значений
        Console.WriteLine("немного")
    Case 5 To 9            ' диапазон
        Console.WriteLine("несколько")
    Case Is > 9            ' условие через Is
        Console.WriteLine("много")
    Case Else
        Console.WriteLine("другое")
End Select

Циклы

For/Next, For Each, While, Do/Loop.

' For — счётчик от/до, опционально Step (шаг).
For i As Integer = 1 To 5
    Console.Write(i & " ")        ' 1 2 3 4 5
Next

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

' For Each — перебор элементов коллекции.
Dim nums() As Integer = {10, 20, 30}
For Each num As Integer In nums
    Console.Write(num & " ")
Next

' While ... End While — пока условие истинно.
Dim k As Integer = 0
While k < 3
    k += 1
End While

' Do While ... Loop — проверка до тела.
Dim j As Integer = 0
Do While j < 3
    j += 1
Loop

' Do ... Loop Until — проверка после тела (выполнится хотя бы раз).
Dim m As Integer = 0
Do
    m += 1
Loop Until m >= 3

' Управление циклом:
For i As Integer = 1 To 10
    If i = 3 Then Continue For   ' пропустить итерацию
    If i = 6 Then Exit For       ' выйти из цикла
Next

Массивы и коллекции

Array, List(Of T), Dictionary(Of K, V).

' Массив фиксированного размера. Индексация с 0.
Dim arr(4) As Integer          ' 5 элементов: индексы 0..4
arr(0) = 100
Dim primes() As Integer = {2, 3, 5, 7, 11}  ' с инициализацией
Console.WriteLine(primes(2))   ' 5
Console.WriteLine(primes.Length)  ' 5

' Двумерный массив:
Dim grid(2, 2) As Integer
grid(0, 1) = 9

' List(Of T) — динамический список (нужен Imports System.Collections.Generic).
Dim names As New List(Of String) From {"Аня", "Боб"}
names.Add("Вика")             ' добавить
names.Remove("Боб")          ' удалить по значению
names.Insert(0, "Зоя")        ' вставить по индексу
Console.WriteLine(names.Count) ' количество
Console.WriteLine(names(0))    ' доступ по индексу
Dim hasAnya As Boolean = names.Contains("Аня")

' Dictionary(Of K, V) — пары ключ→значение.
Dim ages As New Dictionary(Of String, Integer) From {
    {"Аня", 25},
    {"Боб", 30}
}
ages("Вика") = 28             ' добавить/изменить
Console.WriteLine(ages("Аня")) ' 25
If ages.ContainsKey("Боб") Then Console.WriteLine(ages("Боб"))
For Each pair In ages          ' перебор пар
    Console.WriteLine($"{pair.Key} = {pair.Value}")
Next

Процедуры и функции

Sub — без возврата, Function — возвращает значение. ByVal / ByRef / Optional.

' Sub — процедура без возвращаемого значения.
Sub Greet(name As String)
    Console.WriteLine($"Привет, {name}!")
End Sub

' Function — возвращает значение через As Тип и Return.
Function Add(a As Integer, b As Integer) As Integer
    Return a + b
End Function

' ByVal (по умолчанию) — копия; ByRef — изменяет оригинал.
Sub Increment(ByRef value As Integer)
    value += 1                 ' меняет переменную вызывающего
End Sub

' Optional — необязательный параметр со значением по умолчанию.
Function Power(base As Double, Optional exp As Integer = 2) As Double
    Return base ^ exp
End Function

' ParamArray — произвольное число аргументов.
Function Sum(ParamArray items() As Integer) As Integer
    Dim total As Integer = 0
    For Each it In items
        total += it
    Next
    Return total
End Function

' Вызовы:
Greet("Иван")
Dim s As Integer = Add(2, 3)            ' 5
Dim n As Integer = 5
Increment(n)                            ' n стало 6
Dim p As Double = Power(3)              ' 9 (exp по умолчанию 2)
Dim total As Integer = Sum(1, 2, 3, 4)  ' 10

' Именованные аргументы:
Dim q As Double = Power(base:=2, exp:=10)  ' 1024

Классы и ООП

Class, Property, конструктор New, наследование Inherits.

Class Animal
    ' Приватное поле.
    Private _name As String

    ' Авто-свойство (Property) с геттером/сеттером.
    Public Property Age As Integer

    ' Свойство с логикой.
    Public Property Name As String
        Get
            Return _name
        End Get
        Set(value As String)
            _name = value
        End Set
    End Property

    ' Конструктор — Sub New.
    Public Sub New(name As String, age As Integer)
        _name = name
        Me.Age = age           ' Me — ссылка на текущий объект (this)
    End Sub

    ' Overridable — метод можно переопределить в наследнике.
    Public Overridable Function Speak() As String
        Return "..."
    End Function
End Class

' Inherits — наследование.
Class Dog
    Inherits Animal

    ' Вызов конструктора базового класса через MyBase.New.
    Public Sub New(name As String, age As Integer)
        MyBase.New(name, age)
    End Sub

    ' Overrides — переопределение метода.
    Public Overrides Function Speak() As String
        Return "Гав!"
    End Function
End Class

' Использование (New создаёт объект):
Dim d As New Dog("Рекс", 3)
Console.WriteLine(d.Name)      ' Рекс
Console.WriteLine(d.Speak())   ' Гав!

' Shared — член класса, общий для всех (static).
Class Counter
    Public Shared Total As Integer = 0
    Public Sub New()
        Total += 1
End Sub
End Class

' Интерфейс:
Interface IShape
    Function Area() As Double
End Interface
Class Circle
    Implements IShape
    Public R As Double
    Public Function Area() As Double Implements IShape.Area
        Return Math.PI * R * R
    End Function
End Class

Обработка ошибок

Try / Catch / Finally и Throw.

Try
    Dim x As Integer = CInt("не число")  ' выбросит исключение
Catch ex As FormatException
    ' Перехват конкретного типа исключения.
    Console.WriteLine("Неверный формат: " & ex.Message)
Catch ex As Exception
    ' Перехват любого исключения (общий случай — последним).
    Console.WriteLine("Ошибка: " & ex.Message)
Finally
    ' Finally выполняется всегда (и при ошибке, и без).
    Console.WriteLine("Готово")
End Try

' Throw — выброс исключения вручную.
Function Divide(a As Integer, b As Integer) As Integer
    If b = 0 Then
        Throw New DivideByZeroException("Деление на ноль")
    End If
    Return a \ b
End Function

' Catch с условием (When):
Try
    Throw New Exception("42")
Catch ex As Exception When ex.Message = "42"
    Console.WriteLine("Поймали именно 42")
End Try

Работа со строками — продолжение

Построение и разбор текста.

' StringBuilder — эффективная сборка строк в цикле.
' (Imports System.Text)
Dim sb As New System.Text.StringBuilder()
For i As Integer = 1 To 3
    sb.Append("item").Append(i).Append(" ")
Next
Dim result As String = sb.ToString()  ' "item1 item2 item3 "

' Проверки и форматирование:
Dim s As String = ""
Dim isEmpty As Boolean = String.IsNullOrEmpty(s)        ' True
Dim isBlank As Boolean = String.IsNullOrWhiteSpace("  ") ' True

' Дополнение и выравнивание:
Dim n As String = "7".PadLeft(3, "0"c)   ' "007"
Dim r As String = "ab".PadRight(5)        ' "ab   "

' StartsWith / EndsWith:
Dim url As String = "https://codechick.io"
Dim secure As Boolean = url.StartsWith("https")  ' True

' Join — собрать массив в строку через разделитель.
Dim joined As String = String.Join(", ", {"a", "b", "c"})  ' "a, b, c"

' Форматирование чисел:
Dim money As String = (1234.5).ToString("N2")   ' "1 234,50"
Dim hex As String = (255).ToString("X")         ' "FF"

LINQ — запросы к коллекциям

Фильтрация и преобразование данных (нужен Imports System.Linq).

Dim nums As New List(Of Integer) From {5, 1, 8, 3, 9, 2}

' Синтаксис запросов (похож на SQL):
Dim bigOnes = From n In nums
              Where n > 3        ' фильтр
              Order By n          ' сортировка
              Select n            ' проекция
' bigOnes: 5, 8, 9

' Тот же запрос через методы-расширения:
Dim result = nums.Where(Function(n) n > 3) _
                 .OrderBy(Function(n) n) _
                 .ToList()
' Function(n) n > 3 — лямбда (анонимная функция).

' Агрегаты:
Dim total As Integer = nums.Sum()        ' сумма
Dim maxN As Integer = nums.Max()         ' максимум
Dim minN As Integer = nums.Min()         ' минимум
Dim avg As Double = nums.Average()        ' среднее
Dim cnt As Integer = nums.Count(Function(n) n > 4)  ' сколько > 4

' Проверки:
Dim anyBig As Boolean = nums.Any(Function(n) n > 8)  ' есть ли хоть один
Dim allPos As Boolean = nums.All(Function(n) n > 0)  ' все ли положительны

' Преобразование (Select) и взятие части:
Dim squares = nums.Select(Function(n) n * n).ToArray()  ' квадраты
Dim firstTwo = nums.Take(2).ToList()    ' первые 2
Dim skip = nums.Skip(2).ToList()        ' пропустить 2
Dim found = nums.FirstOrDefault(Function(n) n > 100)  ' 0, если не найдено

Стандартная библиотека

Math, DateTime, Random — частые помощники из .NET.

' Math — математические функции.
Dim r As Double = Math.Sqrt(16)      ' 4 — корень
Dim p As Double = Math.Pow(2, 8)     ' 256 — степень
Dim ab As Integer = Math.Abs(-5)     ' 5 — модуль
Dim mx As Integer = Math.Max(3, 7)   ' 7
Dim rnd As Double = Math.Round(3.14159, 2)  ' 3.14
Dim up As Double = Math.Ceiling(4.1) ' 5 — вверх
Dim dn As Double = Math.Floor(4.9)   ' 4 — вниз
Console.WriteLine(Math.PI)           ' 3.14159...

' DateTime — дата и время.
Dim now As DateTime = DateTime.Now       ' текущие дата и время
Dim today As DateTime = DateTime.Today   ' сегодня (00:00)
Dim bday As New DateTime(2000, 1, 15)    ' конкретная дата
Console.WriteLine(now.Year)              ' год
Console.WriteLine(now.ToString("dd.MM.yyyy"))  ' формат
Dim tomorrow As DateTime = now.AddDays(1)      ' +1 день
Dim diff As TimeSpan = now - bday              ' разница
Console.WriteLine(diff.TotalDays)              ' дней между датами

' Random — случайные числа.
Dim rng As New Random()
Dim dice As Integer = rng.Next(1, 7)     ' 1..6 (верх не включён)
Dim frac As Double = rng.NextDouble()    ' [0.0, 1.0)

' Преобразования и проверки:
Console.WriteLine(Convert.ToString(255, 2))  ' "11111111" — двоичное
Console.WriteLine(Char.IsDigit("5"c))         ' True

Особенности языка

Option Strict, Option Explicit, Nothing и нюансы.

' Директивы в самом верху файла (до Imports):
Option Explicit On  ' требует объявлять все переменные через Dim
Option Strict On    ' запрещает неявные сужающие преобразования
Option Infer On     ' разрешает вывод типа: Dim x = 5 (x — Integer)

' С Option Strict On это ОШИБКА (потеря данных неявно):
' Dim i As Integer = 3.14   ' нужно CInt(3.14)

' Nothing — отсутствие значения.
Dim obj As String = Nothing
If obj Is Nothing Then Console.WriteLine("пусто")  ' сравнение через Is
' Для НЕ-Nothing: If obj IsNot Nothing Then ...

' Оператор ?. — безопасный доступ (не упадёт на Nothing):
Dim len As Integer? = obj?.Length   ' вернёт Nothing, а не ошибку

' Оператор ?? через If — значение по умолчанию:
Dim safe As String = If(obj, "по умолчанию")

' Nullable-типы (могут быть Nothing):
Dim maybe As Integer? = Nothing
maybe = 5
If maybe.HasValue Then Console.WriteLine(maybe.Value)

' With — обращение к объекту без повторения имени.
Dim list As New List(Of Integer)
With list
    .Add(1)
    .Add(2)
End With

' Числовые литералы и суффиксы:
' 100L — Long, 1.5F — Single, 1.5D — Decimal, &HFF — hex, &O17 — octal

' True/False — встроенные булевы. VB.NET внутри возвращает -1 для True
' в числовом контексте, но для логики используйте только True/False.
Поддержать проект