С# проверьте, передали ли вы аргументы или нет

У меня есть этот код:

public static void Main(string[] args)
{         
    if (string.IsNullOrEmpty(args[0]))  // Warning : Index was out of the bounds of the array
    {
        ComputeNoParam cptern = new ComputeNoParam();
        cptern.ComputeWithoutParameters();
    }
    else
    {
        ComputeParam cpter = new ComputeParam();
        foreach (string s in args){...}
    }
}

Также пробовал if(args.Length==0), но все равно не работает.

В основном я хочу узнать, вызывал ли пользователь программу с аргументами. Если нет, программа запросит ввод.

Как я могу это сделать? Заранее спасибо.


person robertpas    schedule 03.08.2012    source источник
comment
Что происходит, когда вы пытаетесь args.Length == 0?   -  person Richard Ev    schedule 03.08.2012
comment
Что не работает с args.Length == 0? Скромный совет на будущее: когда вы говорите, что это не работает, этого недостаточно для объяснения проблемы. Уточните, скажите, что не работает, как не работает, что вместо этого происходит, чего вы не ожидаете и т.д. =)   -  person J. Steen    schedule 03.08.2012
comment
Когда вы используете if (args.Length == 0), и он не работает, что он делает вместо того, чтобы работать?   -  person phoog    schedule 03.08.2012
comment
Сотрите это, это работает. Возникла проблема в классе ComputeNoParam.   -  person robertpas    schedule 03.08.2012


Ответы (6)


if(args.Length==0) должно работать, args[0] требует хотя бы одного аргумента, чтобы избежать сбоя.

person Albin Sunnanbo    schedule 03.08.2012

это массив, и есть два сценария, которые могут иметь значение НЕ передавать аргументы. В зависимости от вашей семантики

args == null or args.Length == 0

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

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

if(args == null || args.Length == 0){
    ComputeNoParam cptern = new ComputeNoParam();
    cptern.ComputeWithoutParameters();
}
else
{
    ComputeParam cpter = new ComputeParam();
    foreach (string s in args){...}
}
person Rune FS    schedule 03.08.2012
comment
Должен быть ответ. Это более полно, чем сообщения Тома или Альбина, хотя на него ответили через несколько минут. - person JoePC; 19.07.2019
comment
Документация явно указывает массив args не может быть пустым - person Caius Jard; 07.05.2021
comment
Это верно только в том случае, если он вызывается средой выполнения в качестве точки входа. Метод может быть вызван и другими способами, где аргументы могут быть нулевыми, что я также указываю в ответе. - person Rune FS; 08.05.2021

Это также должно работать:

if (args.Length < 1)
{
    //no args passed
}
person Michelle    schedule 03.08.2012

Это должно работать в вашем сценарии:

if (args == null || args.Length == 0)
{
    //Code when no arguments are supplied
}
else
{
    //Code when arguments are supplied
}

Обратите внимание, как check args == null должен выполняться перед args.Length == 0 при использовании || или же &&. Это называется «замыканием условий», когда C# начинает оценивать первое условие и, если оно истинно, не будет смотреть на второе условие. В этом случае C# будет оценивать второе условие только в том случае, если первое условие ложно.

Предположим, что если ваши условия выровнены так, что if(args.Length == 0 || args == null) и args становятся null,, это вызовет исключение для первого условия, хотя второе условие истинно.

Это то, что мы должны иметь в виду при размещении условий.

person Janaka Dissanayake    schedule 21.01.2019
comment
Будут ли аргументы когда-либо равны нулю в любом случае в main? - person Vivek MVK; 20.12.2019
comment
Документация явно указывает массив args не может быть пустым - person Caius Jard; 07.05.2021

Другой доступный вариант, если вы уже используете System.Linq, — использовать расширение Any(), например:

public static void Main(string[] args)
{
    if (args == null && !args.Any())
    {
        // No parameters passed.
        ComputeNoParam cptern = new ComputeNoParam();
        cptern.ComputeWithoutParameters();

        return;
    }

    // process parameters
    ComputeParam cpter = new ComputeParam();
    foreach (string s in args){...}
}

Это также может быть написано:

public static void Main(string[] args)
{
    if (!args?.Any() ?? true)
    {
        // No parameters passed.
        ComputeNoParam cptern = new ComputeNoParam();
        cptern.ComputeWithoutParameters();

        return;
    }

    // process parameters
    ComputeParam cpter = new ComputeParam();
    foreach (string s in args){...}
}

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

if (args?.Length == 0) {
    // Code hit if args is null or zero
}
person derpasaurus    schedule 06.11.2017
comment
Документация явно указывает массив args не может быть пустым - person Caius Jard; 07.05.2021

person    schedule
comment
Я попытался запустить службу без каких-либо аргументов. Args был массивом из 0 элементов, поэтому я думаю, что args никогда не будет нулевым? - person Maurice Klimek; 05.06.2019
comment
да, я так думаю - person Tom; 05.06.2019
comment
Документация явно указывает массив args не может быть пустым - person Caius Jard; 07.05.2021