Классическая первая программа печатает одну строку текста. На 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/ (или в папку вашей целевой версии).