为什么C#处理命令行参数不一致?
在C#中,直接从Main()获取命令行参数会忽略exe名称,这与C的传统相反 通过Environment.GetCommandLineArgs获取相同的命令行参数包括它 对于这种明显的不一致性,我缺少一些合理的理由吗为什么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));
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) {…}