【问题标题】:How exactly is `string[] args` populated in a C# Main method?`string[] args` 究竟是如何填充在 C# Main 方法中的?
【发布时间】:2015-02-28 00:45:28
【问题描述】:

string[] args 如何准确填充到 C# Main 方法中?

例如,是否去除了空白?是否有任何元素曾经为空字符串或 null?单引号和双引号是如何处理的?

MSDN doesn't explain how 只是说

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

【问题讨论】:

标签: c# .net


【解决方案1】:

当你启动一个进程时,你可以传递一个字符串作为你的参数。如何安排和拆分这些完全取决于您。

所以如果使用 Windows 命令行,你运行:

myexe.exe "Hello World" Joe Bloggs

您的数组将包含:

{"Hello World", "Joe", "Bloggs"}

但它只是以这种特定方式拆分(注意 Hello World 周围的引号已被删除),因为 .Net 框架会自动为您解析它。

【讨论】:

  • 依赖外面的命令行?!好的,这很有趣。
  • 我认为您不能在 windows 中传入字符串数组。您可以传入单个字符串,拆分取决于被调用的进程。关于如何拆分它有一些约定,但它们就是这样。被调用者可以选择使用不同的规则。 |我相信这在 unixoid 系统上有所不同,但我不是这方面的专家。
  • 我很确定 Windows 使用 argc + argv 和 *nix 一样。
  • 调用进程没有指定string[] 作为参数。它只指定了一个 string(参见 Win32 CreateProcess API)。 .NET 运行时正在解释该字符串,以便您得到一个不错的 string[]
  • @PhonicUK,这方面的文档在哪里?
【解决方案2】:

我相信给 Main 的 args 是 Environment.GetCommandLineArgs() 在删除列表的第一个之后返回的那些。 MSDN 描述了关于反斜杠的异常复杂的逻辑:

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

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

感谢 cmets 中的 Christian.K。

【讨论】:

    【解决方案3】:

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

    您应该在程序中测试空参数、空字符串、去除空格和处理单引号/双引号(根据需要)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-14
      • 2015-10-18
      • 2014-02-22
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 2021-12-27
      • 2011-08-25
      相关资源
      最近更新 更多