Подтвердить что ты не робот

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

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

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), но он все равно не работает.

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

args == null или args.Length == 0

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

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

if(args == null || args.Length == 0){
    ComputeNoParam cptern = new ComputeNoParam();
    cptern.ComputeWithoutParameters();
}
else
{
    ComputeParam cpter = new ComputeParam();
    foreach (string s in args){...}
}

Ответ 4

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

if (args.Length < 1)
{
    //no args passed
}

Ответ 5

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

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

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

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

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

Ответ 6

Другой доступный параметр, если вы уже используете 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
}