C# с нуля: основы программирования и первые проекты

Курс для полного новичка: от установки среды разработки и понимания базовых понятий до написания первых консольных приложений на C#. Вы изучите синтаксис, типы данных, управляющие конструкции, методы и основы ООП, закрепляя знания практикой.

1. Старт: установка, среда разработки и первая программа

Старт: установка, среда разработки и первая программа

В этой статье вы:

  • Поймёте, что такое C# и .NET простыми словами
  • Установите всё нужное для разработки
  • Запустите первую программу Hello, World!
  • Научитесь создавать и запускать проекты через командную строку dotnet
  • Что такое C# и .NET

    C# — это язык программирования. На нём пишут:

  • консольные утилиты
  • десктопные приложения
  • веб-сайты и API
  • игры (например, на Unity)
  • Чтобы программа на C# работала, нужен .NET.

  • .NET — это платформа для запуска и разработки приложений.
  • .NET SDK — набор инструментов разработчика: компилятор, шаблоны проектов и команда dotnet.
  • Проще всего думать так:

  • вы пишете код на C#
  • .NET SDK помогает собрать проект
  • .NET запускает результат
  • !Как код превращается в работающую программу

    Что установить

    Вам нужны две вещи:

  • .NET SDK (обязательно)
  • среда разработки (IDE или редактор) — на выбор
  • Установка .NET SDK

    Скачайте и установите .NET SDK с официального сайта:

  • .NET (официальная страница загрузки)
  • На странице выберите версию .NET SDK (обычно рекомендуемую) под вашу систему.

    #### Проверка установки

    Откройте терминал (или PowerShell на Windows) и выполните:

    Если вы видите номер версии (например, 8.0.2xx), всё установлено.

    Выбор среды разработки

    Есть два самых удобных варианта для старта.

    #### Вариант A: Visual Studio (проще на Windows)

    Это полноценная IDE: сама создаёт проекты, подсказывает код, помогает отлаживать.

  • Visual Studio Community (скачать)
  • При установке отметьте рабочую нагрузку:

  • .NET desktop development
  • #### Вариант B: Visual Studio Code (подходит для Windows/macOS/Linux)

    Это лёгкий редактор, а сборка и запуск идут через dotnet.

  • Visual Studio Code (скачать)
  • Для C# в VS Code обычно используют расширение от Microsoft:

  • C# (расширение для Visual Studio Code)
  • Первая программа через dotnet

    Этот способ работает одинаково на Windows, macOS и Linux.

    Создаём проект

  • Откройте терминал.
  • Перейдите в папку, где будут ваши проекты (любую удобную).
  • Выполните команды:
  • Что произошло:

  • dotnet new console создал шаблон консольного приложения
  • -n HelloCSharp — имя проекта (и папки)
  • cd HelloCSharp — переход внутрь проекта
  • Запускаем

    Выполните:

    Вы увидите текст в консоли. В зависимости от версии шаблона это может быть:

  • Hello, World!
  • Поздравляю: это первая запущенная программа на C#.

    Где находится код и что в нём важно

    Внутри проекта найдите файл Program.cs.

    Пример минимального кода, который выводит сообщение в консоль:

    Разберём построчно:

  • Console — объект, который позволяет работать с окном консоли
  • WriteLine — команда «вывести строку и перейти на новую строку»
  • "Привет, C#!" — текст, который будет выведен
  • ; — конец команды (инструкции)
  • Попробуйте заменить текст на свой и снова выполнить dotnet run.

    Как устроен проект: важные файлы

    В папке проекта вы увидите несколько файлов. Самые важные:

  • Program.cs — ваш код
  • HelloCSharp.csproj — файл проекта (настройки сборки, версия .NET, зависимости)
  • Пока достаточно помнить:

  • пишем код в Program.cs
  • запускаем проект через dotnet run
  • Запуск в Visual Studio (если вы выбрали Visual Studio)

  • Откройте Visual Studio.
  • Создайте проект:
  • - Create a new project - выберите Console App (C#)
  • Нажмите Start (кнопка запуска).
  • Visual Studio сама соберёт и запустит программу.

    Частые проблемы и решения

    Команда dotnet не найдена

    Если терминал пишет, что dotnet не найден:

  • убедитесь, что вы установили именно .NET SDK, а не только runtime
  • перезапустите терминал (иногда система обновляет путь к программам не сразу)
  • на Windows проверьте, что установка завершилась без ошибок
  • Проект не запускается из-за прав или папки

    Если вы создаёте проект в системных папках, могут быть ограничения. Создавайте проекты, например, в:

  • Windows: папка Документы
  • macOS/Linux: домашняя папка пользователя
  • Что дальше

    В следующей статье мы начнём писать программы осознанно: разберём переменные, типы данных и простые операции, чтобы программа могла не только печатать текст, но и хранить и обрабатывать данные.

    2. Базовый синтаксис: типы данных, переменные и операторы

    Базовый синтаксис: типы данных, переменные и операторы

    В прошлой статье вы установили .NET SDK, создали консольный проект и запустили первую программу через dotnet run. Теперь разберём базовый синтаксис C#: какие бывают типы данных, как создавать переменные и как выполнять операции над данными.

    Как C# читает ваш код

    Программа на C# обычно состоит из инструкций — команд, которые выполняются сверху вниз.

    Пример инструкций:

    Что важно:

  • ; завершает инструкцию
  • пробелы и переносы строк обычно не влияют на смысл (но влияют на читаемость)
  • регистр важен: Console и console — разные имена
  • Комментарии

    Комментарии — это текст для человека, который игнорируется компилятором.

    Переменные: как хранить данные

    Переменная — это именованное место, где программа хранит значение.

    !Переменная как "коробка": тип определяет, какие значения можно хранить

    Объявление и присваивание

    В C# переменная создаётся так:

    Чаще делают сразу в одной строке:

    Здесь:

  • intтип данных (какие значения допустимы)
  • age — имя переменной
  • = — оператор присваивания (положить значение в переменную)
  • Имена переменных

    Правила (упрощённо, но достаточно для старта):

  • имя не должно начинаться с цифры
  • пробелы нельзя
  • лучше использовать понятные имена: price, userName, totalSum
  • Типы данных: какие значения бывают

    Тип данных отвечает на вопрос: что именно хранится в переменной и какие операции разрешены.

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

    | Тип | Что хранит | Пример значения | Примечание | |---|---|---|---| | int | целые числа | -3, 0, 42 | для счётчиков, количества | | double | числа с дробной частью | 3.14, -0.5 | быстрый, но может быть неточным | | decimal | числа с дробной частью | 19.99m | часто используют для денег | | bool | логическое значение | true, false | для условий | | char | один символ | 'A', '7' | один символ в одинарных кавычках | | string | текст | "Привет" | строка в двойных кавычках |

    Примеры:

    Обратите внимание:

  • у decimal часто пишут суффикс m, чтобы компилятор понял, что это именно decimal
  • char — это ровно один символ и пишется в одинарных кавычках
  • string — это текст любой длины
  • Неявно типизированная переменная var

    Иногда тип можно не писать явно — компилятор сам определит его по значению справа.

    Важно:

  • var — это не "тип без типа". Тип всё равно есть, просто его выводит компилятор.
  • переменную с var нужно сразу инициализировать значением.
  • Операторы: как выполнять действия

    Оператор — это знак или конструкция, которая выполняет действие над значениями.

    Арифметические операторы

    Для чисел чаще всего используют:

  • + сложение
  • - вычитание
  • * умножение
  • / деление
  • % остаток от деления
  • Пример:

    Ключевой момент: если делить int на int, результат тоже будет int (дробная часть отбрасывается).

    Если нужен результат с дробной частью, используйте double (или преобразование):

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

  • = присваивание
  • +=, -=, *=, /= сокращённая запись
  • Пример:

    Инкремент и декремент

  • ++ увеличить на 1
  • -- уменьшить на 1
  • Операторы сравнения

    Они сравнивают значения и возвращают bool (true или false).

  • == равно
  • != не равно
  • > больше
  • < меньше
  • >= больше или равно
  • <= меньше или равно
  • Пример:

    Логические операторы

    Их применяют к bool:

  • && логическое И (оба условия должны быть true)
  • || логическое ИЛИ (достаточно одного true)
  • ! логическое НЕ (инверсия)
  • Пример:

    Операторы для строк

    Строки можно склеивать оператором +:

    Также часто используют интерполяцию строк — это более читаемый способ подставлять значения:

    Здесь:

  • TryParse пытается распознать число в строке
  • ok становится true, если распознавание удалось
  • out int number означает: метод запишет результат в переменную number
  • Мини-проект в рамках статьи: простой калькулятор суммы

    Этот пример объединяет переменные, типы, операторы и преобразование.

    Как это связано с проектом из прошлой статьи

    Если у вас уже есть проект, созданный командой dotnet new console, то вы можете:

  • Открыть файл Program.cs
  • Заменить его содержимое на любой пример из этой статьи
  • Запустить dotnet run
  • Так вы закрепите синтаксис на практике.

    Что дальше

    Дальше логично перейти к управлению поведением программы: условиям if, ветвлениям и циклам, чтобы программа могла принимать решения и повторять действия, а не просто выполнять инструкции по порядку.

    3. Управление логикой: условия, циклы и обработка ошибок

    Управление логикой: условия, циклы и обработка ошибок

    В предыдущих статьях вы:

  • установили .NET SDK и запустили первую программу
  • познакомились с переменными, типами данных и операторами
  • Теперь сделаем программы умнее: научим их принимать решения, повторять действия и не падать из-за ошибок ввода.

    В этой статье вы разберёте:

  • условия if, else if, else
  • конструкцию выбора switch
  • циклы while, do-while, for, foreach
  • команды управления циклом break и continue
  • обработку ошибок через TryParse и try-catch
  • !Схема показывает, как программа выбирает ветку, повторяет действия и обрабатывает ошибки

    Как программа принимает решения

    По умолчанию инструкции выполняются сверху вниз. Условия и циклы позволяют менять этот поток выполнения:

  • ветвление выбирает один из вариантов
  • циклы повторяют блок кода
  • Чтобы несколько инструкций относились к одной ветке или одному циклу, их объединяют в блок с { }.

    Условия if, else if, else

    Самая базовая форма

    Как это работает:

  • условие в скобках (...) должно быть типа bool
  • если условие true, выполняется блок после if
  • иначе выполняется блок после else
  • Несколько условий подряд

    Проверка идёт сверху вниз и останавливается на первой подходящей ветке.

    Частые ошибки новичков

  • Путать = и ==
  • - = присваивает значение - == сравнивает
  • Ставить ; сразу после if (условие);
  • - тогда if заканчивается пустой инструкцией, и ветвление работает не так, как ожидается

    Подробнее в документации Microsoft:

  • Оператор if и else
  • Конструкция switch

    switch удобен, когда вы выбираете действие по одному значению.

    Пример: меню в консоли.

    Что важно:

  • case задаёт вариант значения
  • break завершает ветку (и не даёт провалиться в следующую)
  • default выполняется, если ни один case не подошёл
  • Документация:

  • Оператор switch
  • Циклы: как повторять действия

    Цикл нужен, когда одно и то же действие надо выполнить несколько раз.

    while

    while сначала проверяет условие, и только потом выполняет тело.

    for

    for часто используют, когда заранее понятно, сколько раз повторять.

    В скобках три части:

  • int i = 0 начальное значение счётчика
  • i < 5 условие продолжения
  • i++ действие после каждой итерации
  • foreach

    foreach удобен для перебора элементов коллекции. На старте проще всего воспринимать это как перебор массива.

    continue

    Здесь число 3 не будет выведено.

    Почему программы падают и как с этим жить

    В консольных программах самая частая проблема новичков: пользователь вводит не то.

    Например, так делать рискованно:

    Почему это хороший стиль для старта:

  • нет падений из-за ввода
  • логика понятная: вводим, проверяем, либо выходим из цикла, либо повторяем
  • Документация:

  • Int32.TryParse
  • Обработка ошибок: try-catch-finally

    Исключение (exception) — это сигнал, что случилась ошибка, из-за которой код не может продолжать работу обычным способом.

    try-catch позволяет:

  • попробовать выполнить код
  • перехватить ошибку и выполнить альтернативные действия
  • Пример:

    Что здесь закрепляется:

  • while (true) создаёт цикл, который работает, пока вы явно не выйдете
  • switch выбирает действие по команде
  • TryParse защищает от неверного ввода
  • return завершает программу
  • Что дальше

    Теперь у вас есть база, чтобы писать программы, которые:

  • принимают решения
  • повторяют действия
  • устойчивы к ошибкам ввода
  • Дальше обычно переходят к структурам данных и разбиению программы на части: массивам, спискам и методам, чтобы делать проекты больше и аккуратнее.

    4. Методы, массивы и коллекции: работа с данными

    Методы, массивы и коллекции: работа с данными

    В прошлой статье вы научились управлять логикой программы с помощью условий, циклов и безопасного ввода. Теперь пора сделать следующий шаг: научиться организовывать код и работать с наборами данных.

    В этой статье вы разберёте:

  • методы: как выносить повторяющийся код в отдельные блоки
  • массивы: когда данных много, но размер заранее известен
  • коллекции: List<T> и Dictionary<TKey, TValue> для более гибкой работы
  • !Иллюстрация показывает, зачем нужны методы и чем отличаются массив и список

    Зачем нужны методы

    Когда программа становится больше, появляется проблема:

  • код трудно читать
  • код начинает повторяться
  • сложно исправлять ошибки (нужно править одно и то же в нескольких местах)
  • Метод — это именованный кусок кода, который можно вызвать из разных мест программы.

    Плюсы методов:

  • код читается как план действий
  • повторяющиеся операции описываются один раз
  • проще тестировать и отлаживать по частям
  • Документация Microsoft:

  • Методы (руководство C#)
  • Как объявить и вызвать метод

    Пример метода, который печатает приветствие:

    Разберём по частям:

  • static — на старте это просто правило для методов в Program.cs в консольном приложении
  • void — метод ничего не возвращает
  • SayHello — имя метода
  • { } — тело метода
  • Вызов метода:

    Важно: метод выполнится в момент вызова, а потом управление вернётся обратно, к строке после вызова.

    Параметры: как передать данные в метод

    Часто методу нужны входные данные. Они передаются через параметры.

    Практичный метод: безопасный ввод числа

    Раньше вы уже делали безопасный ввод через TryParse и цикл. Вынесем это в метод, чтобы переиспользовать.

    Использование:

    foreach удобен, когда индекс не важен:

    Главный минус массива

    Размер массива фиксирован. Если вы создали new int[3], добавить четвёртый элемент нельзя.

    Именно поэтому в реальных программах часто используют коллекции.

    Коллекции: List<T> как “динамический массив”

    List<T> — список, который умеет менять размер: добавлять и удалять элементы.

    Документация:

  • List<T>
  • Создание списка

    Добавление:

    Доступ по индексу (как у массива):

    Количество элементов:

    Перебор:

    Мини-проект: список покупок с методами и List

    Цель: сделать консольную программу, где можно добавлять покупки (название и цена), смотреть список и сумму.

    Что здесь закрепляется:

  • разбиение на методы
  • хранение данных в List<decimal> и List<string>
  • цикл while и меню switch
  • Полный пример (одним файлом Program.cs):

    Обратите внимание на ключевую идею: основная логика в Main стала короткой и понятной, потому что детали спрятаны в методах.

    Как выбрать структуру данных

    Короткая шпаргалка:

  • массив T[] — когда размер известен заранее и не меняется
  • List<T> — когда элементы нужно добавлять и удалять
  • Dictionary<TKey, TValue> — когда нужен быстрый поиск по ключу
  • Что дальше

    Теперь вы умеете:

  • дробить программу на методы
  • хранить много данных в массивах и коллекциях
  • выбирать подходящую структуру под задачу
  • Следующий логичный шаг для “первых проектов” — научиться проектировать более аккуратные программы: создавать собственные типы (классы), хранить данные в объектах и связывать методы с данными, чтобы код был ещё понятнее и масштабируемее.

    5. Основы ООП в C#: классы, объекты, инкапсуляция и наследование

    Основы ООП в C#: классы, объекты, инкапсуляция и наследование

    В прошлых статьях вы научились писать консольные программы, пользоваться условиями и циклами, выносить повторяющийся код в методы и хранить данные в массивах и коллекциях. Теперь сделаем следующий шаг: научимся упаковывать данные и логику вместе, чтобы проекты было проще развивать.

    В этой статье вы разберёте:

  • что такое класс и объект
  • как устроены поля, свойства, конструкторы и методы
  • что такое инкапсуляция и зачем она нужна
  • как работает наследование и переопределение поведения
  • Полезные ссылки от Microsoft (можно читать выборочно):

  • Объектно-ориентированное программирование в C#
  • Классы
  • Свойства
  • Модификаторы доступа
  • Наследование
  • !Иллюстрация «класс как шаблон, объект как конкретный экземпляр»

    Что такое класс и объект

    Класс — это описание того, какие данные и какое поведение будет у сущности.

    Объект — это конкретный экземпляр класса (созданный по этому описанию) со своими значениями.

    Простой пример из жизни:

  • класс: Пользователь
  • объекты: Аня, Борис, Вера (у каждого своё имя, возраст и так далее)
  • Первый класс: данные + поведение

    Сделаем класс Person, который хранит имя и умеет здороваться.

    Теперь внешнему коду не нужно знать, как именно хранится имя (в _name). Он работает через свойство Name.

    Автосвойства

    Когда вам не нужна проверка и логика, используют автосвойства:

    А когда вы хотите запретить изменение снаружи, делают private set:

    Конструкторы: как правильно создавать объект

    Конструктор — это специальный метод, который вызывается при new и помогает создать объект в корректном состоянии.

    Пример: объект нельзя создать без имени.

    Здесь появляются две идеи:

  • protected даёт доступ наследникам (но не внешнему коду)
  • если объект на самом деле SavingsAccount, то при вызове GetInfo() сработает переопределённая версия
  • На практике это помогает строить расширяемые программы: вы добавляете новый тип (новый класс-наследник), а остальная программа может работать через общий базовый тип.

    Как применять ООП в ваших консольных мини-проектах

    Если вы делали меню и списки покупок, то теперь можно сделать архитектуру аккуратнее:

  • вместо двух списков List<string> и List<decimal> создать класс Purchase с полями Name и Price
  • хранить List<Purchase>
  • вынести логику в методы и классы (например, ShoppingList)
  • Мини-пример класса покупки:

    Теперь одна покупка хранится как единый объект, а не как два разрозненных значения.

    Что дальше

    После классов и наследования следующий логичный шаг для “первых проектов”:

  • научиться делать программы из нескольких файлов
  • познакомиться с интерфейсами (как способом задавать контракт без жёсткого наследования)
  • аккуратно разделять ответственность: ввод, хранение данных, бизнес-логика, вывод
  • Это поможет писать небольшие, но уже похожие на настоящие приложения.