在C#中,直接从Main()获取命令行参数会忽略exe名称,这与C的传统相反。

通过Environment.GetCommandLineArgs获取那些相同的命令行参数。

对于这种明显的不一致,我是否缺少一些合理的逻辑原因?

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(string.Format("args.Length = {0}", args.Length));

        foreach(string arg in args)
        {
            Console.WriteLine(string.Format("args = {0}", arg));
        }

        Console.WriteLine("");

        string[] Eargs = Environment.GetCommandLineArgs();
        Console.WriteLine(string.Format("Eargs.Length = {0}", Eargs.Length));
        foreach (string arg in Eargs)
        {
            Console.WriteLine(string.Format("Eargs = {0}", arg));
        }

    }
}

输出:
C:\\ConsoleApplication1\ConsoleApplication1\bin\Debug>consoleapplication1 xx zz aa
args.Length = 3
args = xx
args = zz
args = aa
Eargs.Length = 4
Eargs = consoleapplication1
Eargs = xx
Eargs = zz
Eargs = aa

最佳答案

因为它不是C,因此与它的约定无关。需要exe名称几乎是一个极端情况。与其他args相比,我需要这样做的次数很少(与其他args相比),IMO证明了忽略它的决定是合理的。

规范(ECMA334v4,§10.1)对此有额外要求; (剪到相关部分):



...


static void Main() {…}
static void Main(string[] args) {…}
static int Main() {…}
static int Main(string[] args) {…}

...

10-05 17:51