Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么C#处理命令行参数不一致?_C#_Visual Studio_Command Line - Fatal编程技术网

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

为什么C#处理命令行参数不一致?,c#,visual-studio,command-line,C#,Visual Studio,Command Line,在C#中,直接从Main()获取命令行参数会忽略exe名称,这与C的传统相反 通过Environment.GetCommandLineArgs获取相同的命令行参数包括它 对于这种明显的不一致性,我缺少一些合理的理由吗 class Program { static void Main(string[] args) { Console.WriteLine(string.Format("args.Length = {0}", args.Length));

在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和C++,程序的名称不被当作第一个命令行参数。


因为它不是C,因此与它的约定无关。需要exe名称几乎是一种边缘情况;我需要这个(与其他args相比)的次数很少,IMO可以证明省略它的决定是正确的

这是规范(ECMA334v4,§10.1)中额外要求的;(剪到相关部分):

10基本概念 10.1应用程序启动

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

•让参数的名称为
args
。如果
args
指定的数组长度大于 零,数组成员
args[0]
args[args.Length-1]
应指字符串, 称为应用程序参数,由主机环境给定实现定义的值 在应用程序启动之前。其目的是向应用程序提供之前确定的信息 从托管环境中的其他位置启动应用程序。如果主机环境无法 为字符串提供大写和小写字母,实现应确保 字符串以小写形式接收。[注:在支持命令行、应用程序、应用程序参数的系统上 与通常所说的命令行参数相对应。结束注释]


对我来说,这两个方法返回不同结果的原因是
上下文

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

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


归根结底,找到两种选择的方法是非常有效的。

首先,它不是c#而是.net Framework。它不是不一致的,只是两种不同的做事方式。前者不返回可执行文件,后者返回。他们有不同的用途。而且有文件记载+他们给了你一个方法来获得它(真的有几个)我认为这个问题仍然有效。为什么要区分args数组和Environment.GetCommandLineArgs()结果。忘记C,为什么这两种方法有区别?@BFree这是关于降低复杂性的。当您通常处理命令行事件时,您不需要排除其他垃圾。思考
foreach(args中的字符串)
for(inti=1;i@drachenstern:我同意可执行文件名很少有用的观点,但为了进一步说明这一点,为什么他们要在环境中包含可执行文件名。GetCommandLineArgs()?他们不应该保持一致吗?如果是我,我会保持一致,并且可能有一个单独的只读属性,如“Environment.ExecutableName”或其他……@BFree~这是Eric Lippert之类的人的问题;)+1我在回答时看到了这些帖子,这就是我要提到的,这完全是callsPeople的透视(上下文)问题,callsPeople用来根据可执行文件的名称来改变执行路径,因为它包含在arglist中。如果文件名为move.exe,默认情况下他们会移动文件,如果是copy.exe,默认情况下复制,等等。愚蠢的编译器技巧,但还是完成了。呃,这些不是编译器技巧,而是运行时,但无论如何,我的观点仍然成立。我的困难不在于它是否被视为命令行参数-我可以接受这两种方式。我的困难在于,在一种情况下它是,而在另一种情况下它不是。有趣的引用,直到一个名为GetCommandLineArgs()的函数将程序名作为第一个命令行参数为止
static void Main() {…} 
static void Main(string[] args) {…} 
static int Main() {…} 
static int Main(string[] args) {…}