Menu

Hello World на C#: Main, Console.WriteLine и ReadLine

Ваша первая программа на C# построчно: метод Main, Console.WriteLine и Write, чтение ввода через Console.ReadLine, комментарии, создание и запуск проекта через dotnet CLI и операторы верхнего уровня.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

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

Вывод:

Hello, World!

Построчно

  • using System; позволяет писать Console вместо полного имени System.Console. Console это класс в пространстве имён System (см. пространства имён и using).
  • class Program объявляет класс. Весь код C# находится внутри какого-либо типа; имя Program это соглашение, а не требование.
  • static void Main() это точка входа. При запуске программы среда выполнения ищет статический метод с именем Main и вызывает его. static означает, что метод принадлежит самому классу, поэтому не нужно сначала создавать объект. void означает, что метод ничего не возвращает.
  • Console.WriteLine("Hello, World!"); вызывает метод WriteLine со строковым аргументом. Каждый оператор заканчивается точкой с запятой.
  • Фигурные скобки { } обозначают тело класса и тело метода.

C# чувствителен к регистру. console.writeline и main это имена, отличные от Console.WriteLine и Main, и таких имён не существует.

Console.WriteLine и Console.Write

WriteLine добавляет перевод строки после текста. Write этого не делает, поэтому следующий вывод продолжается на той же строке. Оба метода принимают любой тип, а не только строки: числа, логические значения и объекты преобразуются своим методом ToString().

Вывод:

Loading.. done
42
True

Item: coffee
coffee costs 3.20
coffee costs 3.20

Обратите внимание, что true печатается как True: именно это возвращает bool.ToString(). Форма $"...", которая называется интерполяцией строк, будет встречаться чаще всего; коды форматирования вроде :F2 описаны в разделе интерполяция строк.

Чтение ввода через Console.ReadLine

Console.ReadLine() ждёт, пока пользователь наберёт строку и нажмёт Enter, а затем возвращает эту строку как string без перевода строки. Когда ввод закончился (например, если ввод перенаправлен из файла и файл закончился), метод возвращает null.

Вывод:

What is your name? How old are you? 
Hi Maya, next year you will be 28.

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

ReadLine всегда возвращает текст. Чтобы использовать значение как число, его нужно преобразовать. int.Parse(text) выбрасывает FormatException, если текст не является числом; int.TryParse вместо этого возвращает false, поэтому для пользовательского ввода правильно выбирать его. Подробности в разделе преобразование типов.

Два родственных метода: Console.Read() возвращает следующий символ в виде кода int, а Console.ReadKey() читает одно нажатие клавиши без ожидания Enter (работает только в интерактивном терминале).

Другие формы метода Main

Main может принимать аргументы командной строки и возвращать код завершения. Всё это допустимые точки входа:

static void Main()
static void Main(string[] args)
static int Main()
static int Main(string[] args)
static async Task Main()             // C# 7.1 and later
static async Task<int> Main(string[] args)  // C# 7.1 and later

Возвращённое значение int становится кодом завершения процесса, по которому скрипты и системы CI решают, успешно ли отработала программа (по соглашению 0 означает успех).

Вывод:

Got 0 argument(s)

Запустите её командой dotnet run -- apples pears, и в args окажутся "apples" и "pears". -- отделяет аргументы вашей программы от аргументов инструмента dotnet.

Комментарии

В C# есть три вида комментариев. Компилятор игнорирует их все.

// A single-line comment runs to the end of the line.

/* A block comment
   can span several lines. */

/// <summary>
/// An XML documentation comment. Editors show it as the tooltip for the method.
/// </summary>
static decimal ApplyDiscount(decimal price) => price * 0.9m;

Используйте // для заметок внутри кода. Комментарии /// ставят над типами и открытыми членами; IDE показывает их при наведении на вызов, а компилятор может выгрузить их в XML-файл для инструментов документации.

Создание и запуск проекта через dotnet

На своём компьютере установите .NET SDK с сайта dotnet.microsoft.com, затем:

dotnet new console -o HelloApp
cd HelloApp
dotnet run
Hello, World!

dotnet new console создаёт два файла: HelloApp.csproj (файл проекта: целевая платформа, настройки, ссылки на пакеты) и Program.cs. dotnet run компилирует проект и запускает его. dotnet build компилирует без запуска и записывает результат в bin/Debug/net8.0/ (имя папки соответствует целевой платформе).

Операторы верхнего уровня (C# 9 и новее)

Откройте созданный Program.cs, и вы найдёте там только это:

// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

Это программа с операторами верхнего уровня (top-level statements), возможностью C# 9. Компилятор сам создаёт вокруг ваших операторов класс Program и метод Main. using System; тоже отсутствует, потому что в проектах .NET 6 и новее включены неявные using: распространённые пространства имён, такие как System, System.IO, System.Linq и System.Collections.Generic, импортируются для всего проекта.

Программы верхнего уровня всё равно могут читать args, использовать await и возвращать код завершения через return:

// C# 9 and later: the whole Program.cs
Console.Write("Name: ");
string? name = Console.ReadLine();
Console.WriteLine($"Hello, {name}! You passed {args.Length} arguments.");
return 0;

Операторы верхнего уровня может содержать только один файл в проекте, а типы (классы, записи) должны идти после них. Аннотация string? это ссылочный тип, допускающий null (C# 8), и она нужна потому, что ReadLine может вернуть null. Явная форма с class Program, которая используется в примерах на этой странице, эквивалентна, и именно её вы увидите в старом коде и в большинстве скриптов Unity, поэтому полезно уметь читать обе. Передайте --use-program-main в dotnet new console, если в новых проектах вам удобнее явная форма.

Первые ошибки, которые вы увидите

  • CS1002: ; expected. В операторе не хватает точки с запятой. Ошибка указывает на конец строки, где её нет.
  • CS0103: The name 'console' does not exist in the current context. Неправильный регистр букв или отсутствует using System; в проекте без неявных using.
  • CS5001: Program does not contain a static 'Main' method suitable for an entry point. Main написан с ошибкой, не объявлен как static или имеет неподдерживаемую сигнатуру.
  • CS0017: Program has more than one entry point defined. В двух классах есть свой Main. Оставьте один или выберите нужный настройкой StartupObject в .csproj.
  • Окно сразу закрывается. Когда консольное приложение запускают двойным щелчком, окно закрывается, как только Main возвращает управление. Запускайте его из терминала или на время тестирования добавьте Console.ReadKey(); в конец.

Часто задаваемые вопросы

Как написать Hello World на C#?

Поместите Console.WriteLine("Hello, World!"); внутрь метода static void Main() какого-нибудь класса, а в начало файла добавьте using System;. В проекте, созданном командой dotnet new console на .NET 6 или новее, весь файл может состоять из одной этой строки, потому что операторы верхнего уровня сами генерируют класс и Main.

Что такое метод Main в C#?

Main это точка входа: метод, который среда выполнения вызывает при запуске программы. Он должен быть static, может возвращать void или int (код завершения) и может принимать параметр string[] args с аргументами командной строки. В программе должен быть ровно один такой метод.

Чем Console.Write отличается от Console.WriteLine?

Console.WriteLine выводит текст и затем перевод строки, поэтому следующий вывод начнётся с новой строки. Console.Write выводит только текст, поэтому следующий вывод продолжится на той же строке. Console.WriteLine() без аргументов печатает пустую строку.

Как считать ввод пользователя в C#?

Console.ReadLine() читает одну строку текста и возвращает её как string (без перевода строки) или null, когда ввода больше нет. Чтобы получить число, преобразуйте строку: int.TryParse(Console.ReadLine(), out int n) вернёт false вместо падения программы, если текст не является числом.

Как запустить программу на C# из командной строки?

Установите .NET SDK, затем выполните dotnet new console -o HelloApp, чтобы создать проект, cd HelloApp и dotnet run, чтобы собрать и запустить его. dotnet build только компилирует и кладёт результат в bin/Debug/net8.0/ (или в папку вашей целевой версии).

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ