为什么C#处理命令行参数不一致?

mic*_*ica 8 c# command-line visual-studio

在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));
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 15

因为它不是C,因此不依赖于它的惯例.需要exe名称几乎是一个边缘案例; 我需要这么少次(与其他args相比)IMO证明了省略它的决定.

这在规范中另外要求(ECMA334v4,§10.1); (剪切到相关部分):

10.基本概念

10.1应用程序启动

...

此入口点方法始终命名Main,并且应具有以下签名之一:

static void Main() {…} 
static void Main(string[] args) {…} 
static int Main() {…} 
static int Main(string[] args) {…} 
Run Code Online (Sandbox Code Playgroud)

...

args设为参数的名称.如果指定的数组的长度args大于零,则数组成员args[0]through args[args.Length-1](包括)应引用称为应用程序参数的字符串,这些字符串在应用程序启动之前由主机环境给出实现定义的值.目的是从应用程序启动之前从托管环境中的其他地方向应用程序提供确定的信息.如果主机环境不能提供大写和小写字母的字符串,则实现应确保以小写形式接收字符串.[ 注意:在支持命令行的系统上,应用程序,应用程序参数对应于通常称为命令行参数的内容.结束说明 ]

  • +他们给你一个获得它的方法(几个真的) (2认同)

jco*_*and 8

[status-by-design] - http://msdn.microsoft.com/en-us/library/acy3edy3(v=VS.100).aspx

与C和C++不同,程序的名称不被视为第一个命令行参数.


Wal*_*shi 5

对我来说,两种方法返回不同结果的原因是由于Context.

  • Environment类用于操作当前的环境和进程,Environment.GetCommandLineArgs();返回可执行文件名称是有意义的,因为它是进程的一部分.

  • 至于args数组,对我来说排除可执行文件名是有意义的.我知道我正在调用可执行文件,在运行我的应用程序的上下文中,我想知道发送给它的参数是什么.

在一天结束时,有一种方法可以获得两种选择.