Args c что это
Перейти к содержимому

Args c что это

Main() и аргументы командной строки

Метод Main — это точка входа приложения C#. (Библиотекам и службам точка входа в виде метода Main не требуется.) Когда приложение запускается, первым вызывается именно метод Main .

В программе на C# может существовать только одна точка входа. Если у вас есть несколько классов с методом Main , программу нужно компилировать с параметром компилятора StartupObject, чтобы указать, какой из методов Main будет использоваться в качестве точки входа. Дополнительные сведения см. в разделе StartupObject (параметры компилятора C#).

Начиная с версии C# 9, можно не указывать метод Main и писать инструкции C# как включенные в метод Main , как показано в следующем примере:

Сведения о написании кода приложения с помощью неявного метода точки входа см. в статье Инструкции верхнего уровня (руководство по программированию на C#).

Обзор

  • Метод Main — это точка входа для выполняемой программы. Это начальный и завершающий этапы управления программой.
  • Main объявляется внутри класса или структуры. Main должно быть static и не public обязательно. (В предыдущем примере он получает доступ private по умолчанию.) Включающий класс или структура не обязательно должны быть статическими.
  • Метод Main может иметь значение void , int или (начиная с C# 7.1) Task , а также тип возвращаемого значения Task<int> .
  • Если только Main возвращает Task или Task<int> , объявление Main может включать модификатор async . В частности, async void Main это исключает метод.
  • Метод Main может быть объявлен с параметром string[] , который содержит аргументы командной строки, или без него. при использовании Visual Studio для создания Windows приложений можно добавить параметр вручную или использовать GetCommandLineArgs() метод для получения аргументов командной строки. Параметры считываются как аргументы командной строки, индексы которых начинаются с нуля. В отличие от C и C++, имя программы не рассматривается как первый аргумент командной строки в массиве args , но является первым элементом метода GetCommandLineArgs().

В следующем списке приведены допустимые Main сигнатуры.

В предыдущих примерах используется public Модификатор доступа. Это обычная, но не обязательная.

Добавление значений async и Task , а также типов возвращаемого значения Task<int> упрощает код программы, когда консольным приложениям требуется запустить и ожидать ( await ) асинхронные операции в Main .

Возвращаемые значения Main ()

Вы можете возвратить int из метода Main , определив метод одним из следующих способов:

Код метода Main Сигнатура Main
Без использования args или await static int Main()
С использованием args , без использования await static int Main(string[] args)
Без использования args , с использованием await static async Task<int> Main()
С использованием args и await static async Task<int> Main(string[] args)

Если значение, возвращаемое методом Main , не используется, возврат void или Task несколько упрощает код.

Код метода Main Сигнатура Main
Без использования 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<int> позволяет программе передавать информацию о своем состоянии другим программам и скриптам, которые вызывают исполняемый файл.

В следующем примере показано, как можно получить доступ к коду завершения для процесса.

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

Создайте новое приложение, выполнив dotnet new console . Main Измените метод в Program. CS следующим образом:

При запуске программы в Windows значение, возвращаемое функцией Main , сохраняется в переменной среды. Эту переменную среды можно получить из пакетного файла с помощью ERRORLEVEL или в PowerShell с помощью $LastExitCode .

Вы можете создать приложение, используя команду DotNet CLI dotnet build .

Затем создайте скрипт PowerShell для запуска приложения и отображения результата. Вставьте следующий код в текстовый файл и сохраните его под именем test.ps1 в папке проекта. Запустите скрипт PowerShell, введя команду test.ps1 в командной строке PowerShell.

Так как код возвращает нулевое значение, пакетный файл сообщает об успехе. Но если изменить файл MainReturnValTest.cs, чтобы он возвращал ненулевое значение, и затем повторно скомпилировать программу, то при последующем выполнении скрипта PowerShell будет выдано сообщение об ошибке.

Значения, возвращаемые асинхронным методом main

При объявлении async возвращаемого значения для Main компилятор создает стандартный код для вызова асинхронных методов в Main . Если не указать async ключевое слово, необходимо написать этот код самостоятельно, как показано в следующем примере. Код в примере гарантирует, что программа будет выполняться до завершения асинхронной операции:

Этот стандартный код можно заменить на:

Преимуществом объявления Main As async является то, что компилятор всегда создает правильный код.

Если точка входа приложения возвращает Task или Task<int> , то компилятор создает новую точку входа, которая вызывает метод точки входа, объявленный в коде приложения. Предположим, что эта точка входа называется $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<int> Main() приводит к тому, что компилятор формирует эквивалент private static int $GeneratedMain() => Main().GetAwaiter().GetResult();
  • static Task<int> Main(string[]) приводит к тому, что компилятор формирует эквивалент private static int $GeneratedMain(string[] args) => Main(args).GetAwaiter().GetResult();

Если бы в примерах использовался модификатор async метода Main , компилятор сформировал бы точно такой же код.

Аргументы командной строки

Вы можете передавать аргументы в метод Main , определив метод одним из следующих способов:

Код метода 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<int> Main(string[] args)

Если аргументы не используются, можно опустить args в сигнатуре метода, чтобы немного упростить код:

Код метода Main Сигнатура Main
Без возвращаемого значения, без использования await static void Main()
С возвращаемым значением, без использования await static int Main()
Без возвращаемого значения, с использованием await static async Task Main()
С возвращаемым значением, с использованием await static async Task<int> Main()

также можно использовать Environment.CommandLine или Environment.GetCommandLineArgs для доступа к аргументам командной строки из любой точки в консоли или в приложении Windows Forms. чтобы включить аргументы командной строки в Main сигнатуре метода в Windows Forms приложении, необходимо вручную изменить сигнатуру Main . код, созданный конструктором Windows Forms, создает Main без входного параметра.

Параметр метода Main — это массив String, представляющий аргументы командной строки. Как правило, определить, существуют ли аргументы, можно, проверив свойство Length , например:

args Массив не может иметь значение null. Поэтому доступ к свойству Length можно получить без проверки значения NULL.

Строковые аргументы также можно преобразовать в числовые типы с помощью класса Convert или метода Parse . Например, следующая инструкция преобразует string в число long с помощью метода Parse:

Можно также использовать тип C# long , который является псевдонимом Int64 :

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

Дополнительные сведения см. в разделах Parse и Convert.

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

Чтобы скомпилировать и запустить приложение из командной строки, выполните следующие действия.

Вставьте следующий код в любой текстовый редактор, а затем сохраните файл как текстовый файл с именем факториал. CS.

на начальном экране или в меню » пуск » откройте окно Visual Studio Командная строка разработчика , а затем перейдите в папку, содержащую созданный файл.

Введите следующую команду для компиляции приложения.

Если для приложения не выдаются ошибки компиляции, создается исполняемый файл с именем Factorial.exe.

Введите приведенную ниже команду для вычисления факториала числа 3:

Код создает следующие выходные данные: The factorial of 3 is 6.

При выполнении приложения в Visual Studio аргументы командной строки можно указать на странице «Отладка» в конструкторе проектов.

Спецификация языка C#

Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

Что такое «string[] args»в основном классе?

Итак, если бы у меня была программа (MyApp.exe) вот так:

что я начал с командной строки следующим образом:

метод Main будет передан массиву, содержащему три строки: «Arg1», «Arg2», «Arg3».

Если вам нужно сдать аргумент, содержащий пробел, затем оберните его в кавычки. Например:

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

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

этот код является вполне допустимым:

для передачи параметров командной строки. Например args[0] даст вам первый параметр командной строки, если он есть.

кроме других ответов. Вы должны заметить, что эти args могут дать вам путь к файлу, который был перетащен на . Я. e если вы перетащите любой файл на свой .exe файл, то приложение будет запущено и arg[0] будет содержать путь к файлу, который был сброшен на него.

это напечатает путь к файлу, упавшему на . е.г

это массив переключателей командной строки, передаваемых программе. Е. Г. если вы запустите программу с помощью команды » myapp.exe -c -d » после string[] args[] будет содержать строки «- c»и» — d».

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

Если вы запускаете свою программу с консоли следующим образом:

вы должны были видеть какое-то приложение, которое запускается из командной строки и позволяет передавать им аргументы. Если вы пишете одно такое приложение на C#, массив args служит коллекцией указанных аргументов.

Что такое argc, char * argv[] в Си

В Си все функции в исполняемом файле вызываются из функции main ().

Функция main () тоже должна быть вызвана. Например, из bash .

Вызов может быть как без аргументов, так и с аргументами.

Начнём с первого варианта

Вызов без аргументов

Если Вы не собираетесь использовать аргументы командной строки, то можно писать int main ()

Что вообще под этим имеется в виду:

Рассмотрим простейшую программу, которую мы написали в файле hello_world.c

#include <stdio.h> int main ( int argc, char * argv[])

Предположим, что мы скомпилировали наш hello_world.c в object файл hello_world командой

gcc -o hello_world hello_world.c

И теперь выполняем

Нам совершенно не важно написано

int main ( int argc, char * argv[])

просто int main ()

В какой момент это станет важным?

— В тот момент когда нужно будет вызывать с аргументами

Вызов с аргументами

argc — argument count — это количество аргументов командной строки.

Тип argc — int

Минимально значение argc это 1. argv[0] это имя программного файла (в нашем случае программный файл это hello_world.c).

Си это очень старый язык, созданный задолго до появления современных графических интерфейсов.

char * — это тип возвращаемого значени

argv[] — argument vector — массив значений этих аргументов

Рассмотрим другую программу, написанную в файле example.c

Она будет ожидать два аргумента типа int .

В коде они будут называться a1 и a2. Обратите внимание на седьмую и восьмую строки.

#include <stdio.h> #include <stdlib.h> int main ( int argc, char * argv[])

Скомпилируйте этот код командой

gcc -o example example.c

Осталось вызвать программу и передать при вызове аргументы прямо в командной строке.

File name = ./example
7 9

Мы вызываем example и прямо в командной строке передаём два аргумента.

Сперва мы убедились что argv[0] это действительно имя файла. Затем увидели переданные аргументы

Теперь, если Вы захотите убрать int argc, char * argv[] из main

Компилятор Вас не поймёт и пожалуется на необъявленные argv

example.c: In function ‘main’: example.c:7:16: error: ‘argv’ undeclared (first use in this function) int a0=atoi(argv[0]); ^

example.c:7:16: note: each undeclared identifier is reported only once for each function it appears in

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

Добавить комментарий

Ваш адрес email не будет опубликован.