JavaRush /Курсы /C# SELF /Погружаемся в C# проект

Погружаемся в C# проект

C# SELF
5 уровень , 4 лекция
Открыта

1. Общая структура C#-проекта

Ваша программа — это не просто один файл, а целая коллекция файлов, папок и настроек. C# — язык строго типизированный, для больших приложений важно держать всё в строгом порядке. Если вы будете игнорировать структуру проекта, ваш код быстро превратится в электронный лабиринт, где невозможно найти даже собственную строку вывода "Hello, World!".

Кроме того, понимание структуры проекта — это тот навык, который оценят на собеседованиях. Это как знать, где в доме лежат ключи и пульт от телевизора — гораздо проще жить!

Для наглядности представим, что наш C#-проект — это коробка с ячейками:

MyFirstConsoleApp/
├── MyFirstConsoleApp.csproj
├── Program.cs
├── Properties/
│    └── launchSettings.json
├── bin/
│    └── ... (сюда попадает скомпилированная программа)
├── obj/
│    └── ... (сюда складываются промежуточные файлы компиляции)

Детали структуры:

Имя Зачем нужно
MyFirstConsoleApp.csproj
Файл проекта: «паспорт» всей вашей программы, здесь указаны все настройки проекта.
Program.cs
Главный файл с точкой входа (Main). Именно сюда вы обычно пишете свой первый код.
Properties/
Папка с настройками проекта, например, способы запуска из IDE.
bin/
«Корзина для готовых продуктов» — туда попадает собранный (скомпилированный) исполнительный файл.
obj/
Внутренние рабочие файлы компиляции (как черновики при написании романа, вы туда редко заглядываете).

2. Файл проекта (.csproj)

Файл с расширением .csproj — это сердце и мозг проекта. Именно здесь записаны все глобальные настройки: версия языка, зависимости, какие файлы нужно компилировать, какие пакеты подключены и т. д. Переключись в Solution Explorer на вкладку Files.

Пример файла для консольного приложения:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net9.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>

</Project>
  • <TargetFramework>net9.0</TargetFramework> — говорит, что проект заточен под .NET 9.
  • <OutputType>Exe</OutputType> — значит, что получится исполняемый файл (.exe для Windows).
  • В блоке <PropertyGroup> хранятся основные параметры.
  • В этом файле вы можете добавлять дополнительные NuGet-пакеты, менять настройки компиляции, включать/выключать фичи.

3. Главный файл программы: Program.cs

Если сравнивать проект с театром, то Program.cs — это сцена, а все остальные файлы — закулисье. Именно здесь размещается так называемая "точка входа" приложения — метод Main.


// Program.cs
using System;

namespace MyFirstConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Привет, мир!");
        }
    }
}
Минимальный пример Program.cs
  • namespace — пространство имён, помогает группировать классы и избегать конфликта имён.
  • class Program — основной класс, где располагается метод Main.
  • static void Main(string[] args) — обязательная точка входа — отсюда начинает выполняться программа.
  • Console.WriteLine() — уже знакомый вам способ сообщения миру о своих мыслях.

Обновляем наше приложение

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


// Program.cs
using System;

namespace MyFirstConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Please enter your name: ");
            string name = Console.ReadLine();
            Console.WriteLine($"Welcome, {name}! Live long and prosper.");
        }
    }
}

Запустите проект: щёлкните зелёную кнопку ▶️ Run.

Если всё прошло успешно, внизу появится вкладка Run. Вы увидите, что программа запустилась и ждет вашего ответа на вопрос Please enter your name:. Напечатайте любое имя (например, "Cat") прямо в этой консоли и нажмите клавишу Enter.

Сразу после нажатия Enter программа обработает ваш ввод и выведет финальное сообщение с вашим именем. Программа завершила свою работу, и мы видим результат.

4. Как писать свой код: основные правила

Где писать код?

Основную логику поначалу лучше писать в файле Program.cs в методе Main. По мере роста приложения вы будете создавать новые файлы и классы, но пока не прыгайте выше головы — всё самое интересное происходит именно здесь.

Что можно (и что нельзя) делать в Main?

  • Можно: объявлять переменные, писать вычисления, вызывать методы, выводить/считывать данные.
  • Нельзя: писать код «вне» методов или классов (например, просто строку Console.WriteLine("Hello"); вне Main — так делать нельзя!).

Комментарии

Комментируйте код для себя и для других. Для однострочных комментариев используйте //, для многострочных — /* ... */. Чем проще потом догадаться, зачем вы написали этот загадочный кусок кода, тем лучше.

// Это однострочный комментарий

/*
 А это —
 многострочный.
*/

5. Как происходит выполнение программы?

Ваша программа всегда начинает выполнение с метода Main. Всё, что находится до этих строк, игнорируется. Хотите что-то сделать при запуске? Поместите это в Main.

Пример — упрощённая блок-схема (код → запуск):

Начало программы
     |
     v
Метод Main
     |
     v
Выполнение инструкций внутри Main (по порядку)
     |
     v
Конец программы

6. Как ваше приложение растёт: добавление новых файлов

Когда стоит создавать новый файл?

Когда ваш код перестаёт помещаться на одном экране, а переменные уже не держатся в голове, пришло время разбить код на части.

Пример: если вы делаете калькулятор, то можно сделать отдельный файл Calculator.cs и перенести туда отдельный класс.

MyFirstConsoleApp/
├── Program.cs
├── Calculator.cs  // Новый файл с логикой калькулятора

Как добавить новый файл в Rider

  1. В дереве Solution Explorer кликните правой кнопкой по проекту → "Add" → "New File" (или "New Class").
  2. Дайте файлу осмысленное имя.
  3. Напишите в файле новый класс, или функцию.
// Calculator.cs
namespace MyFirstConsoleApp
{
    class Calculator
    {
        public static int Add(int a, int b)
        {
            return a + b;
        }
    }
}

А теперь используем его из Program.cs:

// Program.cs
using System;

namespace MyFirstConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            int sum = Calculator.Add(2, 3);        //Используем функцию Add из класса Calculator
            Console.WriteLine($"2 + 3 = {sum}");
        }
    }
}

7. "Сборка" и "Запуск" — что происходит под капотом?

Когда вы нажимаете Run (или F5), IDE:

  • Проверяет синтаксис и собирает ваш код в бинарный файл (.exe или .dll) в папку bin/Debug/net9.0/ или bin/Release/net9.0/.
  • Запускает собранный файл.
  • Выводит результат в терминал/консоль, которую вы видите.

bin/ и obj/: зачем нужны эти папки?

  • bin/ — тут лежит ваш готовый продукт (собранные программы).
  • obj/ — тут хранятся временные файлы, которые нужны компилятору для промежуточных вычислений.

Обычно эти папки можно смело игнорировать, их содержимое автоматически пересоберётся при необходимости.

8. Частые ошибки при написании кода и работе с проектом

Писать код — это не бить по клавишам вслепую. Как только появляются ошибки вроде CS5001: Program does not contain a static 'Main' method suitable for an entry point, программисты начинают массово гуглить, а IDE ругается ещё более сложным языком.

  • Одна из частых ошибок — код вне метода или класса. В C# нельзя просто взять и написать выражение прямо в файле программы. Всё должно быть внутри класса и метода!
  • Разные имена файлов и классов. Так можно, но лучше давать файлам и классам одинаковые, понятные имена — для вашего (и вашего будущего коллеги) же удобства.
  • Запутались в пространствах имён. Если вы создали класс в другом пространстве имён (namespace), не забудьте его подключить с помощью using.
  • Забыли про точку входа. Если удалили или переименовали метод Main, программа не запустится.
2
Задача
C# SELF, 5 уровень, 4 лекция
Недоступна
Количество цифр
Количество цифр
2
Задача
C# SELF, 5 уровень, 4 лекция
Недоступна
Минимальное из трёх
Минимальное из трёх
Комментарии (2)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Dom_Tal Уровень 16
29 августа 2025
Интересно, почему if (num[i] >= '0'...) работает, а if (num[i] >= '1'...) нет?
Slevin Уровень 34
22 января 2026
Да вообще-то работает, просто будет игнорировать "0". 1. Тип char в C# input[i] — это char, то есть отдельный символ строки. char в C# на самом деле это число в кодировке Unicode (по сути, целое число). Символ '0' имеет числовой код 48, '1' = 49, … '9' = 57. C# фактически делает числовое сравнение кодов Unicode: '0' → 48 '1' → 49 … '9' → 57 То есть input[i] >= '0' && input[i] <= '9' проверяет: «код символа находится между 48 и 57», что эквивалентно «это цифра».