在c#中使用参数/参数的正确方法?

时间:2014-02-24 15:14:10

标签: c# parameters arguments

我有一个应用程序,它有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.

我做错了什么?使用参数的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

  

我做错了什么?

您假设始终使用适当数量的参数调用程序。具体来说,那

  • 至少存在一个参数
  • 当初始参数为sumprint时,会出现两个参数
  • 当初始参数为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);
            }
        }
    }
}

肯定有更好的方法可以做到这一点,这绝不是万无一失的,但我只想在这个问题上添加一些细节。