Метод Main — это точка входа приложения C#. (Библиотекам и службам точка входа в виде метода Main не требуется.) Когда приложение запускается, первым вызывается именно метод Main .
В программе на C# может существовать только одна точка входа. Если у вас есть несколько классов с методом Main , программу нужно компилировать с параметром компилятора StartupObject, чтобы указать, какой из методов Main будет использоваться в качестве точки входа. Дополнительные сведения см. в разделе StartupObject (параметры компилятора C#).
class TestClass < static void Main(string[] args) < // Display the number of command line arguments. Console.WriteLine(args.Length); >>
Начиная с версии C# 9, можно не указывать метод Main и писать инструкции C# как включенные в метод Main , как показано в следующем примере:
using System.Text; StringBuilder builder = new(); builder.AppendLine(«Hello»); builder.AppendLine(«World!»); Console.WriteLine(builder.ToString());
Сведения о написании кода приложения с помощью неявного метода точки входа см. в статье Инструкции верхнего уровня (руководство по программированию на C#).
Console.SetCursorPosition — метод
Обзор
- Метод Main — это точка входа для выполняемой программы. Это начальный и завершающий этапы управления программой.
- Main объявляется внутри класса или структуры. Main значение должно иметь значение static , а не должно быть public . (В предыдущем примере он получает доступ private по умолчанию .) Включающий класс или структуру не обязательно должен быть статическим.
- Main может иметь тип возвращаемого void значения , int , Task , или Task .
- Если только Main возвращает Task или Task , объявление Main может включать модификатор async . Это, в частности, исключает async void Main метод .
- Метод Main может быть объявлен с параметром string[] , который содержит аргументы командной строки, или без него. При использовании Visual Studio для создания приложений Windows можно добавить параметр вручную или использовать GetCommandLineArgs() метод для получения аргументов командной строки. Параметры считываются как аргументы командной строки, индексы которых начинаются с нуля. В отличие от C и C++, имя программы не рассматривается как первый аргумент командной строки в массиве args , но является первым элементом метода GetCommandLineArgs().
В следующем списке показаны допустимые Main подписи:
public static void Main() < >public static int Main() < >public static void Main(string[] args) < >public static int Main(string[] args) < >public static async Task Main() < >public static async Task Main() < >public static async Task Main(string[] args) < >public static async Task Main(string[] args)
Во всех предыдущих примерах используется модификатор public доступа. Это типично, но не обязательно.
Добавление значений async и Task , а также типов возвращаемого значения Task упрощает код программы, когда консольным приложениям требуется запустить и ожидать ( await ) асинхронные операции в Main .
C# ВВОД ДАННЫХ В КОНСОЛЬ | C# ОТ НОВИЧКА К ПРОФЕССИОНАЛУ | Урок # 5
Возвращаемые значения Main()
Вы можете возвратить int из метода Main , определив метод одним из следующих способов:
Без использования args или await | static int Main() |
С использованием args , без использования await | static int Main(string[] args) |
Без использования args , с использованием await | static async Task Main() |
С использованием args и await | static async Task Main(string[] args) |
Если значение, возвращаемое методом Main , не используется, возврат void или Task несколько упрощает код.
Без использования args или await | static void Main() |
С использованием args , без использования await | static void Main(string[] args) |
Без использования args , с использованием await | static async Task Main() |
С использованием args и await | static async Task Main(string[] args) |
Однако возврат int или Task позволяет программе передавать информацию о своем состоянии другим программам и скриптам, которые вызывают исполняемый файл.
В следующем примере показано, как можно получить доступ к коду завершения для процесса.
В этом примере используются программы командной строки .NET Core. Если вы не знакомы с программами командной строки .NET Core, можете обратиться к этой статье по началу работы.
Создайте новое приложение, запустив dotnet new console . Измените Main метод в Файле Program.cs следующим образом:
// Save this program as MainReturnValTest.cs. class MainReturnValTest < static int Main() < //. return 0; >>
При запуске программы в Windows значение, возвращаемое функцией Main , сохраняется в переменной среды. Эту переменную среды можно получить из пакетного файла с помощью ERRORLEVEL или в PowerShell с помощью $LastExitCode .
Вы можете создать приложение с помощью команды dotnet CLI dotnet build .
Затем создайте скрипт PowerShell для запуска приложения и отображения результата. Вставьте следующий код в текстовый файл и сохраните его под именем test.ps1 в папке проекта. Запустите скрипт PowerShell, введя команду test.ps1 в командной строке PowerShell.
Так как код возвращает нулевое значение, пакетный файл сообщает об успехе. Но если изменить файл MainReturnValTest.cs, чтобы он возвращал ненулевое значение, и затем повторно скомпилировать программу, то при последующем выполнении скрипта PowerShell будет выдано сообщение об ошибке.
dotnet run if ($LastExitCode -eq 0) < Write-Host «Execution succeeded» >else < Write-Host «Execution Failed» >Write-Host «Return value = » $LastExitCode
Execution succeeded Return value = 0
Значения, возвращаемые асинхронным методом main
При объявлении возвращаемого async значения для Main компилятор создает стандартный код для вызова асинхронных методов в Main . Если вы не укажете async ключевое слово, необходимо написать этот код самостоятельно, как показано в следующем примере. Код в примере гарантирует, что программа выполняется до завершения асинхронной операции:
public static void Main() < AsyncConsoleWork().GetAwaiter().GetResult(); >private static async Task AsyncConsoleWork() < // Main body here return 0; >
Этот стандартный код можно заменить следующим кодом:
static async Task Main(string[] args)
Преимущество объявления Main как async заключается в том, что компилятор всегда создает правильный код.
Если точка входа приложения возвращает Task или Task , то компилятор создает новую точку входа, которая вызывает метод точки входа, объявленный в коде приложения. Предположим, что эта точка входа называется $GeneratedMain . В этом случае компилятор создает следующий код для этих точек входа:
- static Task Main() приводит к тому, что компилятор формирует эквивалент private static void $GeneratedMain() => Main().GetAwaiter().GetResult();
- static Task Main(string[]) приводит к тому, что компилятор формирует эквивалент private static void $GeneratedMain(string[] args) => Main(args).GetAwaiter().GetResult();
- static Task Main() приводит к тому, что компилятор формирует эквивалент private static int $GeneratedMain() => Main().GetAwaiter().GetResult();
- static Task Main(string[]) приводит к тому, что компилятор формирует эквивалент private static int $GeneratedMain(string[] args) => Main(args).GetAwaiter().GetResult();
Если бы в примерах использовался модификатор async метода Main , компилятор сформировал бы точно такой же код.
Аргументы командной строки
Вы можете передавать аргументы в метод Main , определив метод одним из следующих способов:
Без возвращаемого значения, без использования await | static void Main(string[] args) |
С возвращаемым значением, без использования await | static int Main(string[] args) |
Без возвращаемого значения, с использованием await | static async Task Main(string[] args) |
С возвращаемым значением, с использованием await | static async Task Main(string[] args) |
Если аргументы не используются, можно опустить args в сигнатуре метода, чтобы немного упростить код:
Без возвращаемого значения, без использования await | static void Main() |
С возвращаемым значением, без использования await | static int Main() |
Без возвращаемого значения, с использованием await | static async Task Main() |
С возвращаемым значением, с использованием await | static async Task Main() |
Вы также можете использовать Environment.CommandLine или Environment.GetCommandLineArgs для доступа к аргументам командной строки из любой точки консоли или Windows Forms приложения. Чтобы включить аргументы командной строки в сигнатуре Main метода в приложении Windows Forms, необходимо вручную изменить сигнатуру Main . Код, созданный конструктором Windows Forms создается Main без входного параметра.
Параметр метода Main — это массив String, представляющий аргументы командной строки. Как правило, определить, существуют ли аргументы, можно, проверив свойство Length , например:
if (args.Length == 0)
Массив args не может иметь значение NULL. Поэтому доступ к свойству Length можно получить без проверки значения NULL.
Строковые аргументы также можно преобразовать в числовые типы с помощью класса Convert или метода Parse . Например, следующая инструкция преобразует string в число long с помощью метода Parse:
long num = Int64.Parse(args[0]);
Можно также использовать тип C# long , который является псевдонимом Int64 :
long num = long.Parse(args[0]);
Кроме того, можно использовать метод класса Convert , ToInt64 :
long num = Convert.ToInt64(s);
Дополнительные сведения см. в разделах Parse и Convert.
В следующем примере показано использование аргументов командной строки в консольном приложении. Приложение принимает один аргумент времени выполнения, преобразует аргумент в целое число и вычисляет факториал числа. Если не указано никаких аргументов, приложение выдает сообщение, поясняющее правильное использование программы.
Чтобы скомпилировать и запустить приложение из командной строки, выполните следующие действия.
-
Вставьте следующий код в любой текстовый редактор, а затем сохраните файл как текстовый файл с именем Factorial.cs.
public class Functions < public static long Factorial(int n) < // Test for invalid input. if ((n < 0) || (n >20)) < return -1; >// Calculate the factorial iteratively rather than recursively. long tempResult = 1; for (int i = 1; i return tempResult; > > class MainClass < static int Main(string[] args) < // Test if input arguments were supplied. if (args.Length == 0) < Console.WriteLine(«Please enter a numeric argument.»); Console.WriteLine(«Usage: Factorial «); return 1; > // Try to convert the input arguments to numbers. This will throw // an exception if the argument is not a number. // num = int.Parse(args[0]); int num; bool test = int.TryParse(args[0], out num); if (!test) < Console.WriteLine(«Please enter a numeric argument.»); Console.WriteLine(«Usage: Factorial «); return 1; > // Calculate factorial. long result = Functions.Factorial(num); // Print result. if (result == -1) Console.WriteLine(«Input must be >= 0 and <= 20.»); else Console.WriteLine($»The Factorial of is .»); return 0; > > // If 3 is entered on command line, the // output reads: The factorial of 3 is 6.
При выполнении приложения в Visual Studio аргументы командной строки можно указать на странице «Отладка» в конструкторе проектов.
Спецификация языка C#
Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.
См. также
- System.Environment
- Отображение аргументов командной строки
Источник: learn.microsoft.com
В консольном приложении точкой входа в программу является метод
Точкой входа в программу на языке C# является метод Main. Именно с этого метода начинается выполнение программы на C#. И программа на C# должна обязательно иметь метод Main . Однако может возникнуть вопрос, какой еще метод Main, если, например, Visual Studio 2022 по умолчанию создает проект консольного приложения со следующим кодом:
// See https://aka.ms/new-console-template for more information Console.WriteLine(«Hello, World!»);
И эта программа никаких методов Main не содержит, но при этом нормально выполняется и выводит на консоль строку «Hello, World!», как и запланировано. Это так называемая программа верхнего уровня (top-level program). А вызов Console.WriteLine(«Hello, World!») представляет инструкцию вехнего уровня (top-level statement)
Однако в реальности этот код неявно помещается компилятором в метод Main, который, в свою очередь, помещается в класс Program. В действительности название класса может быть любым (как правило, это класс Program, собственно поэтому генерируемый по умолчанию файл кода называется Program.cs ). Но метод Main является обязательной частью консольного приложения. Поэтому выше представленный код фактически эквивалентен следующей программе:
class Program < static void Main(string[] args) < // See https://aka.ms/new-console-template for more information Console.WriteLine(«Hello, World!»); >>
Определение метода Main обязательно начинается с модификатора static , которое указывает, что метод Main — статический. Позже мы подробнее разберем, что все это значит.
Возвращаемым типом метода Main обязательно является тип void . Кроме того, в качестве параметра он принимает массив строк — string[] args — в реальной программе это те параметры, через которые при запуске программы из консоли мы можем передать ей некоторые значения. Внутри метода располагаются действия, которые выполняет программа.
До Visual Studio 2022 все предыдущие студии создавали по умолчанию примерно такой код. Но начиная с Visual Studio 2022 нам необязательно вручную определять класс Program и в нем метод Main — компилятор генерирует их самостоятельно.
Если мы определяем какие-то переменные, константы, методы и обращаемся к ним, они помещаются в метод Main. Например, следующая программа верхнего уровня
string hello = «Hello METANIT.COM»; Print(hello); void Print(string message)
будет аналогична следующей программе:
class Program < static void Main(string[] args) < string hello = «Hello METANIT.COM»; Print(hello); void Print(string message) < Console.WriteLine(message); >> >
Если определяются новые типы, например, классы, то они помещаются вне класса Program. Например, код:
Person tom = new(); tom.SayHello(); class Person < public void SayHello() =>Console.WriteLine(«Hello»); >
будет аналогичен следующему
class Program < static void Main(string[] args) < Person tom = new(); tom.SayHello(); >> class Person < public void SayHello() =>Console.WriteLine(«Hello»); >
Однако надо учитывать, что опредления типов (в частности классов) должны идти в конце файла после инструкций верхнего уровня. То есть:
// инструкции верхнего уровня (top-level statements) Person tom = new(); tom.SayHello(); // определение класса идет после инструкций верхнего уровня class Person < public void SayHello() =>Console.WriteLine(«Hello»); >
Таким образом, мы можем продолжать писать программы верхнего уровня без явного определения метода Main. Либо мы можем явным образом определить метод Main и класс Program:
И этот код будет выполняться аналогичным образом, как если бы мы не использовали класс Program и метод Main.
Источник: metanit.com
Из приведенных ниже высказываний укажите истинное высказывание:В консольном приложении точкой входа в программу является метод, который может иметь любое имя, а его определение в исходном коде класса Program должно быть первым
Определен class ПРОДУКТ> Класс ВИД является наследником класса ПРОДУКТ . В классе ВИД метод F переопределен как public override string F() В методе Main созданы объекты ПРОДУКТ P1 = new ВИД(); ВИД P2 = new ВИД(); В результате выполнения оператора string S=P2.F() + P1.F(); переменная S получит значение:
Определен class ПРОДУКТ> Класс ВИД является наследником класса ПРОДУКТ . В классе ВИД метод F переопределен как public new string F() В методе Main созданы объекты ПРОДУКТ P1 = new ВИД(); ВИД P2 = new ВИД(); В результате выполнения оператора string S= P1.F() + P2.F(); переменная S получит значение:
Определен class ПРОДУКТ> Класс ВИД является наследником класса ПРОДУКТ . В классе ВИД метод F переопределен как public new string F() В методе Main созданы объекты ПРОДУКТ P1 = new ВИД(); ПРОДУКТ P2 = new ВИД(); В результате выполнения оператора string S=P1.F() + P2.F(); переменная S получит значение:
Метод определен как static void P(int A) В вызывающем методе объявлены локальные переменные int A, B=9; Непосредственно за объявлениями переменных выполняется вызов метода P . Метод P и вызывающий метод определены в одном классе. Корректными вызовами метода P являются
Метод определен как static void P(int A) В вызывающем методе объявлены локальные переменные int A=5, B=9; Метод P и вызывающий метод определены в одном классе. Корректными вызовами метода P являются
Из приведенных ниже высказываний укажите все истинные высказывания, относящиеся к абстрактным классам:
Класс СТУДЕНТ определен как наследник класса ЧЕЛОВЕК , а класс ВЫПУСКНИК – как наследник класса СТУДЕНТ . Создан объект ЧЕЛОВЕК P = new ВЫПУСКНИК(); Результатом вывода на консоль Console.Write(P.GetType().Name); будет
Источник: bazaintuit.ru