Ниже приведены два способа чтения параметров командной строки. Во-первых, я привык использовать параметр в файле main. На второе я наткнулся при просмотре кода. Я заметил, что второй назначает первый элемент в массиве пути и приложению, но первый пропускает это.
Это просто предпочтение или второй способ сейчас лучше?
Sub Main(ByVal args() As String)
For i As Integer = 0 To args.Length - 1
Console.WriteLine("Arg: " & i & " is " & args(i))
Next
Console.ReadKey()
End Sub
Sub Main()
Dim args() As String = System.Environment.GetCommandLineArgs()
For i As Integer = 0 To args.Length - 1
Console.WriteLine("Arg: " & i & " is " & args(i))
Next
Console.ReadKey()
End Sub
Я думаю, что то же самое можно сделать и в C#, так что это не обязательно вопрос vb.net.





Второй способ лучше, потому что его можно использовать вне main (), поэтому, когда вы проводите рефакторинг, думать о нем меньше.
Также мне не нравится "магия", которая первым образом помещает аргументы в параметр метода.
Да, его можно использовать вне метода main (). Но что происходит, когда вы хотите создать экземпляр класса и вызвать его? Вы должны вызывать его через командную строку, или он игнорирует ваши параметры, верно? не было бы лучше иметь несколько подписей, одну с переданными аргументами, а другую без; где один без извлечет их из System.CommandLine и передаст другому?
@michael, конечно, я бы не стал размещать вызов этого метода в сборке "Core", только в консольном проекте. Я больше думал о том, чтобы иметь что-то вроде класса Settings или эквивалента, который позаботился бы о синтаксическом анализе аргументов таким образом, чтобы его можно было использовать для остальной части приложения.
Первый способ лучше, потому что он проще.
Вы знаете, что такое getopt? На codeplex есть порт для C#: http://www.codeplex.com/getopt
Мне первый способ кажется более интуитивным, потому что именно так я делаю это с тех пор, как я работал над C / C++.
Если в вашей командной строке слишком много переключателей, обратите внимание на команду getopt, которую рекомендует Томас. Это очень полезно. Однако я не смотрел на порт C# того же самого.
С уважением,
кгр
+1 к принципу единой ответственности