Комментарии 32
НЛО прилетело и опубликовало эту надпись здесь
Много опечаток. Ну и, конечно, библиотек множество. Кому-то больше по нраву придется getopt.codeplex.com/.
+1
Есть еще прекрасная штука Mono.Options:
tirania.org/blog/archive/2008/Oct-14.html
devlicio.us/blogs/rob_reynolds/archive/2009/11/22/command-line-parsing-with-mono-options.aspx
Получается что-то типа такого.
Примерно те же яйцы, но на делегатах. В Command Line Parser Library не всем может понравиться генерить и обновлять модельку под параметры.
tirania.org/blog/archive/2008/Oct-14.html
devlicio.us/blogs/rob_reynolds/archive/2009/11/22/command-line-parsing-with-mono-options.aspx
Получается что-то типа такого.
var p = new OptionSet () {
{ "n|name=", "the name of someone to greet.",
v => names.Add (v) },
{ "r|repeat=", "the number of times to repeat the greeting.",
(int v) => repeat = v },
{ "v", "increase debug message verbosity",
v => { if (v != null) ++verbosity; } },
{ "h|help", "show this message and exit",
v => show_help = v != null },
}
Примерно те же яйцы, но на делегатах. В Command Line Parser Library не всем может понравиться генерить и обновлять модельку под параметры.
+1
«Создания пользовательского класса с набором глобальных переменных»
Простите, а мы об одном языке говорим? Я думал, статья о c#.
Простите, а мы об одном языке говорим? Я думал, статья о c#.
0
Спасибо подбправил, согласен не корректно звучит.
0
«пользовательского класса с набором public переменных»
Лучше не стало.
Честное слово, вы бы хоть немного ознакомились с терминологией ООП и конкретно взятого c#.
Лучше не стало.
Честное слово, вы бы хоть немного ознакомились с терминологией ООП и конкретно взятого c#.
0
Вы бы пример привели, как правильно?
0
«класс с набором публичных полей»
Слово «пользовательский» не нужно, переменная не может быть публичной.
Кстати, за использование в публичном интерфейсе полей (а не свойств) надо бить палкой по пяткам.
Слово «пользовательский» не нужно, переменная не может быть публичной.
Кстати, за использование в публичном интерфейсе полей (а не свойств) надо бить палкой по пяткам.
0
да согласен со всем кроме 2 строки. «пользовательский» можно оставить.
0
А что, вы можете создать какой-то другой класс? И в чем отличие «пользовательского» класса от не-пользовательского?
0
Хороший вопрос, просто это достаточно часто употребляемый термин в литературе. Как бы подразумевается что то что ты пишешь пользовательское, а то что написал Microsoft нет — «системное». С точки зрения самого термина, ясное дело никакой разницы.
0
«это достаточно часто употребляемый термин в литературе»
Да? Покажите мне хотя бы один пример из msdn.
«Как бы подразумевается что то что ты пишешь пользовательское, а то что написал Microsoft нет — «системное».»
А то, что Microsoft написал не в рамках BCL? А то, что написали third-party vendors?
Да? Покажите мне хотя бы один пример из msdn.
«Как бы подразумевается что то что ты пишешь пользовательское, а то что написал Microsoft нет — «системное».»
А то, что Microsoft написал не в рамках BCL? А то, что написали third-party vendors?
0
Я не уточнил, это в наших переводных изданиях (книгах) по .NET.
Вообще, конечно, я понимаю, что может это и звучит обидно, но все же от части все программисты пользователи, той же VS.
Так что это слово в данном контексте только подчеркивет суть и не более того.
Вообще, конечно, я понимаю, что может это и звучит обидно, но все же от части все программисты пользователи, той же VS.
Так что это слово в данном контексте только подчеркивет суть и не более того.
0
«Я не уточнил, это в наших переводных изданиях (книгах) по .NET. „
Лишний раз много говорит о качестве переводных изданий.
“Вообще, конечно, я понимаю, что может это и звучит обидно, но все же от части все программисты пользователи, той же VS.»
Программист — пользователь VS, но порожденный им код — не пользовательский. Более того, порождаемый программистом код вполне может быть «системным» для следующего программиста, который пишет к нему «пользовательский». И что в этом случае делать?
Просто обратите внимание, что в msdn такое словоупотребление не встречается вовсе. Там просто пишут «your class».
Лишний раз много говорит о качестве переводных изданий.
“Вообще, конечно, я понимаю, что может это и звучит обидно, но все же от части все программисты пользователи, той же VS.»
Программист — пользователь VS, но порожденный им код — не пользовательский. Более того, порождаемый программистом код вполне может быть «системным» для следующего программиста, который пишет к нему «пользовательский». И что в этом случае делать?
Просто обратите внимание, что в msdn такое словоупотребление не встречается вовсе. Там просто пишут «your class».
0
Да тут унас уже получается место для философии :) ок обязательно.
0
Рекомендую ещё ознакомиться вот с такой штукой. Идеология совершенно иная (построено на колбэках), но тоже весьма юзабельно. Пример кода:
В данном примере распознаётся строка вида file=filename.jpg, а так же указана возможность восприятия синонимов (v|verbose).
Тут лежит документация, всё достаточно подробно описано.
string data = null;
bool help = false;
int verbose = 0;
var p = new OptionSet () {
{ "file=", v => data = v },
{ "v|verbose", v => { ++verbose } },
{ "h|?|help", v => help = v != null },
};
List<string> extra = p.Parse (args);
В данном примере распознаётся строка вида file=filename.jpg, а так же указана возможность восприятия синонимов (v|verbose).
Тут лежит документация, всё достаточно подробно описано.
+2
0
Я не говорил что они не подошли, они все по своему классные, моей идей было просто осветить эту тему. Да нужно наверно просто дописать кусочек.
0
Все вроде бы хорошо, но чем больше параметров, тем больше появляется строк типа
int num = int.Parse(args[Х]);
где Х это номер параметра.
Я бы просто использовал циклы.
0
чем больше параметров, тем больше появляется строк
Откуда в программе вообще строки берутся? Вроде не должно быть.
Когда параметров сильно меньше, чем 100500 (всегда), можно просмотреть свитчем параметры, что там оно передалося, и что из этого нужно взять. Да, появится много немного строк, но мне нравится — когда параметры прибиты гвоздями к программе и к документации.
Вот, как простой пример к осуждению экспертами:
private static string switch_on { get; set; } = "";
private static int timeOut { get; set; }
private static int interVal { get; set; }
private static bool isDebug { get; set; } = false;
private static IReadOnlyCollection<string> ProfileInfo { get; set; }
Switch by arguments
private static void Main(string[] margs)
{
if (margs.Length > 0)
{
Console.WriteLine("This app startet with parameter/s");
for (int i = 0; i < margs.Length; i++)
{
switch_on = margs[i];
switch (switch_on)
{
case "-d":
Console.WriteLine("Case Debug");
isDebug = true;
break;
case "-t":
Console.WriteLine("Case Timeout");
timeOut = int.Parse(margs[++i]);
break;
case "-p":
Console.WriteLine("Case Profile");
// profile info write with starts and ands " char`s, whitespace char - is a separator of profile info items
ProfileInfo = new List<string>(margs[++i].Trim(new char[] { '"' }).Split(new char[] { ' ' }));
break;
case "-i":
Console.WriteLine("Case Interval");
interVal= int.Parse(margs[++i]);
break;
default: Console.WriteLine("Case Default"); break;
}
Console.WriteLine($"Arg {i} = {margs[i]}");
}
}
Console.WriteLine($"Args length = {margs.Length}");
Console.WriteLine($"Debug = {isDebug}");
Console.WriteLine($"Timeout = {timeOut}");
Console.WriteLine($"Interval = {interVal}");
Console.WriteLine($"Profile info = {SummaryProfileInfo(ProfileInfo)}");
Console.ReadLine();
}
Теперь я могу передать параметры "-d -p "Юра Морозов" -i 555 -t 3600", в любом порядке, в любом наборе, и всё пройдёт гладко. Нет?
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Работа с Command Line в .Net