Ответ 1
if(args.Length==0)
должен работать, args[0]
требует, чтобы хотя бы один аргумент не разбился.
У меня есть этот код:
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)
, но он все равно не работает.
В принципе, я хочу узнать, вызвал ли пользователь программу с аргументами. Если программа не запросит ввода.
Как я могу это сделать? Спасибо заранее.
if(args.Length==0)
должен работать, args[0]
требует, чтобы хотя бы один аргумент не разбился.
if(args == null || args.Length == 0)
{
// no arguments
}
else
{
// arguments
}
это массив и есть два сценария, которые могут иметь значение, переданное без аргументов. В зависимости от вашей семантики
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){...}
}
Это также должно работать:
if (args.Length < 1)
{
//no args passed
}
Это должно работать по вашему сценарию:
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,
это вызовет исключение для первого условия, хотя второе условие истинно.
Это то, что мы должны учитывать при размещении условий.
Другой доступный параметр, если вы уже используете 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
}