10 分钟内掌握 C# 应用程序中的命令行参数
在构建现代 C# 应用程序时,开发人员往往需要灵活掌握程序的启动和行为方式。 您可以让用户在启动应用程序时传递命令行参数,从而使应用程序充满活力,而不是对每个选项进行硬编码。 这使开发人员和用户都能直接通过命令行提供输入参数,在不更改代码的情况下调整应用程序的运行方式。
在题为"C# 应用程序中的命令行参数 10 分钟或更少"的简明 10 分钟教程中,Tim Corey 清楚地演示了如何启用命令行参数并在控制台应用程序和 Windows 窗体应用程序中有效地处理它们。 本文将按照 Tim 的解释逐步介绍相关概念。
什么是命令行参数?
一开始,蒂姆解释了为什么命令行参数很重要。 他将这些工具与我们启动 Docker 等工具的方式进行了比较,在 Docker 中,我们可以指定加载什么图像或执行什么任务等命令。 同样,在 C# 命令行应用程序中,您可以传递参数来定义程序在运行时的行为。
例如,如果您要运行一个控制台应用程序来处理文件,您可能希望通过命令行输入来指定文件路径或模式,而不是修改代码。
设置控制台项目
Tim 在 Visual Studio 中从一个基本的 .NET 8 控制台应用程序项目开始。 默认代码仅打印类似 "按回车键退出 "的信息,并使用 Console.ReadLine() 语句在关闭前等待用户输入。
现在,为了处理命令行输入,Tim 引入了 args 数组,该数组用于存储执行时传递给应用程序的参数。 尽管现代 C# 控制台应用程序使用顶级语句,但在幕后,它们仍然有一个定义为的入口点:
static void Main(string[] args)static void Main(string[] args)或有时:
static int Main(string[] args)static int Main(string[] args)这些签名代表主方法--执行开始的入口点。 args 参数是一个字符串数组(string[]),包含从命令行提供的所有参数。
Tim 演示了使用 foreach 循环迭代 args 数组:
foreach (var arg in args)
{
Console.WriteLine(arg);
}foreach (var arg in args)
{
Console.WriteLine(arg);
}在这里,var arg 代表 args 数组中的每个字符串参数,程序会将它们显示在控制台输出的不同行中。
Tim 指出,虽然顶层语句隐藏了诸如 Program 类和 Main 方法之类的模板代码,但一切工作原理都是一样的--args 数组始终可用,并可随时捕获命令行参数。
运行控制台应用程序
接下来,Tim 将展示如何测试该功能。 由于没有提供命令行输入,在 Visual Studio 中正常运行程序不会显示任何不同的内容。
为了正确测试,他手动修改了执行过程:打开文件资源管理器,导航到项目的 bin → 调试 → net8.0 文件夹,然后从该路径启动终端窗口。
在此基础上,他使用了以下命令:
ConsoleArgs.exe "hello world" -t timingConsoleArgs.exe "hello world" -t timing该命令演示了几个关键点:
带引号的 "hello world "被视为一个字符串参数,而不是两个独立的单词。
- 标记 -t 和单词 timing 被视为两个附加参数。
执行时,控制台输出显示
hello world
-t
timinghello world
-t
timing每行参数代表 args 数组中的一个元素。 Tim 解释说,这证实了命令行参数的正确用法--控制台应用程序成功接收并显示了执行过程中传递的所有参数。
他提到,开发人员还可以在从项目目录运行时使用 dotnet run 代替可执行路径:
dotnet run -- "hello world" -t timingdotnet run -- "hello world" -t timing双破折号 (--) 会告诉 .NET 将其后的所有内容视为您的程序的 命令行参数,而不是 .NET CLI 本身的 命令行参数。
处理和解析命令行参数
现在我们可以读取参数了,Tim 将讨论如何智能地处理命令行参数。
例如,如果 -t 是一个期望值标志,程序必须知道将下一个字符串参数作为其值。 Tim 演示了可以通过检查 args 数组中的索引来手动解析:
for (int i = 0; i < args.Length; i++)
{
if (args[i] == "-t")
{
var value = args[i + 1];
Console.WriteLine($"Timing parameter: {value}");
}
}for (int i = 0; i < args.Length; i++)
{
if (args[i] == "-t")
{
var value = args[i + 1];
Console.WriteLine($"Timing parameter: {value}");
}
}这种方法可以让您处理命名参数、数字类型,甚至是冗长模式标志。 Tim 指出,开发人员经常使用 switch 语句甚至外部文档和库来进行更高级的参数解析,但 System 命名空间和 args 数组已经提供了基本情况下所需的一切。
扩展到 Windows 窗体应用程序
在演示了控制台应用程序后,Tim 开始演示 Windows 窗体应用程序(WinForms)。
在生成的代码中,Program.cs 文件包含一个静态 void Main() 方法,但它还不接受参数。 为了启用命令行参数,Tim 手动修改了 Main 方法,使其包含 args 参数:
[STAThread]
static void Main(string[] args)
{
ApplicationConfiguration.Initialize();
Application.Run(new Form1(args.FirstOrDefault() ?? "default"));
}[STAThread]
static void Main(string[] args)
{
ApplicationConfiguration.Initialize();
Application.Run(new Form1(args.FirstOrDefault() ?? "default"));
}他解释说,args.FirstOrDefault() 会从 args 数组中检索第一个输入参数(如果没有提供参数,则返回 "默认")。
然后,在 Form1 类中,Tim 更新了构造函数,使其接受一个字符串参数:
public Form1(string name)
{
InitializeComponent();
displayName.Text = name;
}public Form1(string name)
{
InitializeComponent();
displayName.Text = name;
}在这里,displayName 是 Windows 窗体设计器中定义的标签,它现在显示的是通过命令行传递的参数。
当他不带参数运行程序时,标签显示 "默认"。当他使用
WinFormsArgs.exe "Hello World"WinFormsArgs.exe "Hello World"表单窗口显示 "Hello World"。
Tim 解释说,这项技术可以让 Windows 窗体应用程序像控制台应用程序一样支持命令行参数,从而让用户能够动态更改启动行为。
命令行参数的实际用途(7:18)
最后,Tim 讨论了命令行工具如何利用这一功能实现多功能。 开发人员可以使用命令行参数来
在不同模式下启动应用程序(例如,暗模式与亮模式)。
在启动时提供文件路径或配置选项。
使用 -v 或 --debug 等简单的开关启用冗长模式或调试功能。
- 为不同的工作流程创建传递特定参数的快捷方式。
通过设计接受字符串参数的主方法,您可以轻松扩展应用程序的灵活性和适应性,而无需额外的用户输入对话框或配置文件。
结论(8:15)
他以实例为导向的解释表明,在 C# 中处理命令行参数并不复杂--只需理解每个应用程序都有一个入口点(Main),从命令行传递过来的参数会以字符串数组的形式到达该入口点。
无论您使用的是控制台应用程序还是 Windows 窗体应用程序,这一概念都能让您的程序对启动时指定的命令、值和参数做出动态响应。
最终收获
Tim Corey 的视频为 C# 中命令行参数的正确用法提供了清晰实用的指南。 通过了解 Main 方法中 args 参数的工作原理,开发人员可以轻松创建、解析和使用参数,从而开发出更强大、可配置的应用程序。
因此,下一次当您创建 C# 项目时,请记住您的命令行参数不仅仅是技术语法,它们还是您的程序与用户之间的桥梁,让您的代码更强大、更灵活、更实际可用。

