我有一个应用程序,它有3个主要参数:sum,substract,print。如果给出了其中一个参数,app会调用方法:sum为sum,substract为substract,print为print。
使用参数调用所有示例:
myapp.exe sum 1 2
myapp.exe substract 3
myapp.exe print whatever
这是我的实际代码不起作用
static void Main(string[] args)
{
Program package = new Program();
if (args[0] == @"sum")
{
package.sum(args[1], args[2]);
}
else if (args[0] == @"substract")
{
package.substract(args[1]);
}
else if (args[0] == @"print")
{
package.print(args[1]);
}
else
Console.Write("Invalid Parameters");
}
但这是我在调试时遇到的错误:
A first chance exception of type 'System.IndexOutOfRangeException' occurred in myapp.exe
An unhandled exception of type 'System.IndexOutOfRangeException' occurred in myapp.exe
Additional information: Index was outside the bounds of the array.
我做错了什么?使用参数的最佳方法是什么?
答案 0 :(得分:1)
我做错了什么?
您假设始终使用适当数量的参数调用程序。具体来说,那
sum
或print
时,会出现两个参数add
时,存在三个参数这并不总是正确的,具体取决于用户输入的内容。在引用其元素之前,您需要添加代码检查args
数组的长度:
if (args.Length < 2) {
Console.Error.Write("Invalid Parameters");
return;
}
if (args[0] == @"sum" && args.Length == 3) {
...
}
... // The rest of your code can assume that there's at least two args
答案 1 :(得分:1)
上面的答案很好,但我觉得这个答案还有一点,而不仅仅是变量的数量。
我发现当需要一个有点强大的参数解决方案时,以下类型的解决方案最适合我:
if (args.Length > 0)
{
if (args.Contains<string>("--help"))
{
Console.WriteLine("appname [--debug] [--bootstrap <bootstrap name>]");
Console.WriteLine(" --debug Runs \"appname\" in debug mode.")
Console.WriteLine(" --bootstrap If no bootstrap name is provided the default \"AppName v1.2\" will be used.")
Console.WriteLine("")
}
//simple single argument passed to application
if (args.Contains<string>("--debug"))
{
DEBUG_ON = true;
Console.WriteLine("Found argument: --debug");
}
//more complex relational argument passed to application
if (args.Contains<string>("--bootstrap"))
{
int bootstrapLoc = Array.IndexOf<string>(args, "--bootstrap");
//always check that there is one more argument in the array
if(args.Length > bootstrapLoc + 1)
{
string bootstrapArg = args[bootstrapLoc + 1];
//this is where you would do your error checking against the second argument, ex: determine that it is what is expected
if (bootstrapArg != null && bootstrapArg != "")
{
this.MongoDBInstallName = bootstrapArg;
Console.WriteLine("Using the passed bootstrap arg: " + bootstrapArg);
}
}
}
}
肯定有更好的方法可以做到这一点,这绝不是万无一失的,但我只想在这个问题上添加一些细节。