.NET 6.0 C# "new console template" - 如何读取CLI参数?

89
现在.NET 6.0已经发布,CLI默认项目模板似乎进行了根本性更新,其中一个熟悉的样板代码被简化为以下内容:
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

目前并没有找到文档说明,我不清楚的是如何访问传递给可执行文件入口类的命令行参数。


仅仅因为现在不需要显式指定 Main 方法(因为它会自动添加),并不意味着不允许这样做... - derpirscher
只需按照评论中的链接,它会详细说明在需要Main()时该怎么做。 - Hans Passant
1
问题的目的是帮助那些希望采用这种项目模板的新工作方式的人,因为由于它处于“前沿”阶段,文档缺乏清晰度。使用原始模板基本上意味着“不要使用新模板”,这是一种倒退的方法。 - djtubig-malicex
3
@HansPassant 这个链接没有记录使用新模板访问CLI参数的替代方法。我的问题并不是在问如何使用 Main()。请您帮我翻译这段话,使之更加通俗易懂但不要改变原来的意思。 - djtubig-malicex
2
微软团队的举动令人匪夷所思,破坏了C#的美感,使事情变得不那么明显——命名空间在哪里?这是一个普通的main()还是async main()等等。 - joedotnot
说实话,我会质疑是否需要一个 async Main(),因为大多数可执行进程入口点都在主进程线程上。谁会去等待呢? - djtubig-malicex
5个回答

114
您可以使用Environment类从代码的任何位置访问命令行参数。

特别地,您可以使用Environment.GetCommandLineArgs:

string name = Environment.GetCommandLineArgs()[1];
Console.WriteLine($"Hello, {name}!");

请注意,数组中的第一个元素包含可执行文件的路径,传递给程序的参数从第二个元素开始,即索引为1。


10
我正在检查,这个也可以:Console.WriteLine($"你好,世界!{args[1]}"); - Peres
2
@Peres 是的,那是 Guru Stron 的答案。 - Codo

69
新的项目模板正在使用C# 9的功能,称为顶级语句
对于顶级语句文件,编译器将生成string[] args参数(实际上它会生成包含Main方法的整个类),因此您可以直接使用它(就像以前使用Main(string[] args)一样):
Console.WriteLine(args.Length);
Console.WriteLine(args.FirstOrDefault());

有关生成模式的更多信息可以在顶级语句功能规范中找到。还可以参阅无主方法的顶级语句 - 程序文档

1
因为args未定义,所以无法编译。 - djtubig-malicex
6
@djtubig-malicex 我已经在我的机器上编译了它,在 shraplab.io(答案中的链接之一)和这里是 [dotnetfiddle](https://dotnetfiddle.net/9kbG56)。 - Guru Stron
3
为什么这感觉很“Pythonic”? - IAbstract
1
即使在Python中,您仍然需要明确地“导入sys”才能访问“sys.argv”。 - djtubig-malicex
1
对我来说运行良好,谢谢 :) args.ToList().ForEach(x => Console.WriteLine($"{x}!")); - Toby Simmerling
1
谢谢Guru,作为一条注释,args参数的技术规范可以在这里找到(https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/program-structure/top-level-statements#args)。 - IcyBrk

4

虽然有点晚了,但在.NET 6中已经有了默认设置。使用内置的“args”即可。这基本上就是完全的老派做法。

public static void Main(string[] args)

只是将“args”作为一个变量给你,这个变量可以被重复使用。我实际上是偶然发现它出现在VS 2022的“locals”中。

如果我想要调试测试控制台应用程序,只需使用profiles>ConsoleApp>commandLineArgs下的“launchSettings.json”即可。

因此,如果我在启动时有:

{
  "profiles": {
    "ConsoleApp": {
      "commandName": "Project",
      "commandLineArgs": "Brett Robel"
    }
  }
}

在我的.NET 6命令行应用程序中:

var firstName = args.First();
var lastName = args.Last();
Console.WriteLine($"Hello {firstName} and Last {lastName}");

我应该看到:

enter image description here


2
哇,通过“偶然发现看到‘本地人’弹出”来学习如何使用新功能,这不是微软提供新功能的一个经过深思熟虑的方式!微软需要做得更好。 - Jason Doyle
在JSON文件中,如何从控制台获取"commandName"的值? - dr.Xis

2
在Program.cs中,你可以直接从args[]数组中获取参数。

-3
你在提到C#语言版本9中引入的顶级语句,以模仿Python的简洁语法,力图与其吸引力特别是对于初学者程序员而言进行竞争。
顶级语句可以像这样接受输入参数:
using System;

string[] args = new string[1];

Console.WriteLine($"Hello {args[0]}");

如果你将上述的C#代码编译成Program.exe并导航到它所在的文件夹,然后你可以简单地通过命令行调用它并传递一个输入参数,就像这样:
Program.exe world

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