在C#的Main方法中,`string[] args`是如何填充的?

9

在C# Main方法中,string[] args参数是如何被填充的?

例如,空格是否会被去除?任何元素是否为空字符串或null?单引号和双引号如何处理?

MSDN没有解释,只是简单地说:

Main方法的参数是表示命令行参数的String数组


3
例如,空格是否被去除了?--- 为什么不试试呢?只需要1分钟。 - zerkms
这里有一些信息,尽管在这份文档中并没有出现空白字符。http://msdn.microsoft.com/en-us/library/acy3edy3.aspx - ta.speot.is
3
关于引号转义的规则(至少是最难的部分),在Environment.GetCommandLineArgs()函数的备注中有说明。请注意,此处仅涉及转换过程的规则说明,不包括其他内容。 - Christian.K
4
我猜你真正想问的是:“将一条长字符串——即命令行——分割成 C# 的 args 数组所使用的算法是什么?”这实际上是一个很好的问题,所以+1来抵消负投票。 - Heinzi
谢谢你,Christian!那篇文章很棒,它有例子和一切。 - Colonel Panic
显示剩余2条评论
3个回答

5
当您启动一个进程时,可以将字符串作为参数传递。如何排列和拆分完全取决于您。
因此,如果使用Windows命令行,则运行以下命令:
myexe.exe "Hello World" Joe Bloggs

你的数组将包含以下内容:
{"Hello World", "Joe", "Bloggs"}

但是它只被以那种特殊的方式分割(注意Hello World周围的引号被移除)是因为.Net框架自动帮你解析了它。

1
这取决于命令行外部?! 好的,这很有趣。 - Colonel Panic
1
我认为在Windows中无法传递字符串数组。您只能传递单个字符串,拆分由被调用进程完成。有关如何拆分的约定存在,但它们仅仅是这样。被调用方可以选择使用不同的规则。| 我相信在类Unix系统上情况会有所不同,但我对这些并不是专家。 - CodesInChaos
我非常确定Windows使用的argc + argv与*nix相同。 - PhonicUK
调用进程没有指定 string[] 作为参数。它只指定了一个 string(请参阅 Win32 CreateProcess API)。.NET 运行时会解释该字符串,以便您获得一个漂亮的 string[] - usr
@PhonicUK,这个有文档吗? - Ryan Griffith

4
我认为传递给Main的参数是Environment.GetCommandLineArgs()返回列表中第一个元素后的其余元素。MSDN描述了关于反斜杠的复杂逻辑,这令人惊讶:

命令行参数由空格分隔。您可以使用双引号(“”)在参数中包含空格。然而,单引号(')不提供此功能。

如果双引号紧随两个或偶数个反斜杠,则每个前进的反斜杠对将被替换为一个反斜杠,并删除双引号。如果双引号紧随奇数个反斜杠(包括一个),则每个前面的一对将被替换为一个反斜杠,并删除剩余的反斜杠;但是,在这种情况下,不会删除双引号。

感谢评论中的Christian.K。


0

传递给您的程序的参数取决于操作系统。

您应该测试参数是否为null,空字符串,去除空格,并在程序中处理单引号/双引号(如有必要)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接