C# 中的顶级语句
顶级语句 是 C# 中的一项特性,允许我们直接在文件中编写代码,而无需将其包装在 class 或 Main 方法中。此特性在 C# 9.0 中引入,旨在使程序更容易启动。
当我们使用 顶级语句 时,代码会从第一行开始执行,而无需任何额外的结构。这种方法消除了不必要的复杂性,帮助我们专注于代码需要完成的任务,而不是其组织方式。
顶级语句出现之前的 C# 工作方式
在 顶级语句 出现之前,每个 C# 程序都必须以 Main 方法开头,该方法充当程序的入口点。Main 方法始终放置在 class 中,通常命名为 Program。这是任何 C# 应用程序的标准结构。
示例
以下是传统方法的示例。即使只是打印 "Hello, World!",我们也必须编写多行代码。虽然这对于大型应用程序效果良好,但对于只需几行的简单脚本来说,感觉过于冗长。
using System;
namespace Example
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
}
}
}
运行上述程序后的输出如下。
Hello, World!
使用顶级语句
当我们使用 顶级语句 时,可以完全跳过编写 class 和 Main 方法。编译器会在后台自动为我们创建它们,因此我们只需专注于重要的逻辑。
示例
以下是使用顶级语句的相同程序的示例。
using System;
Console.WriteLine("Hello, World!");
运行时,编译器会自动处理之前所需的结构,并产生与之前相同的输出。
Hello, World!
编译器如何处理
当我们使用 顶级语句 时,编译器会自动为我们创建一个隐藏的 class 和一个 Main 方法。它将我们的代码放置在该方法中,因此一切仍以常规 C# 程序的相同方式运行。
例如,当我们编写以下代码时 -
Console.WriteLine("Hello");
编译器会将其内部转换为以下代码 -
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello");
}
}
因此,通过这种方式,顶级语句 允许我们编写更少的代码,同时保持程序行为完全相同。
使用顶级语句的规则
以下是我们使用顶级语句需要遵循的重要规则:
- 仅一个文件:项目中只有一个文件可以包含顶级语句。如果多个文件包含它们,编译器将不知道使用哪个作为入口点,并会产生错误。
- 执行顺序:我们的代码按照书写顺序运行,从顶级代码的第一行开始,一直运行到文件末尾。
- using 指令和全局属性:这些必须放在任何顶级语句之前。我们不能在代码行之后放置using语句。
- 声明其他元素:我们可以在顶级语句下方声明functions、classes、records和structs,但不能在上方。
- 异步代码:如果我们使用await,编译器会自动将隐藏的Main方法变为异步的。我们无需自己声明它。
- 命令行参数:这些参数会自动通过变量args可用,即使我们没有看到它的声明。
示例
以下是一个示例,展示了顶级语句的工作方式。程序从第一行开始执行。它打印欢迎消息,计算两个数字的和,并显示结果,所有这些都不需要class或Main方法。
using System;
Console.WriteLine("Welcome to C# top-level statements!");
int a = 5;
int b = 10;
Console.WriteLine("The sum of " + a + " and " + b + " is " + (a + b));
以下是上述程序的输出。
Welcome to C# top-level statements! The sum of 5 and 10 is 15
声明和使用 Functions
我们可以在顶级语句下方声明和使用functions。这些函数会成为自动创建的class的一部分,我们可以在顶级代码的任何位置调用它们。
示例
在这个示例中,GreetUser函数在顶级语句之后声明,但在上方被调用。编译器将其识别为局部函数并正确运行。
using System;
Console.WriteLine("Program started");
GreetUser("Valentine");
void GreetUser(string name)
{
Console.WriteLine("Hello, " + name + ". Nice to meet you!");
}
以下是上述程序的输出:
Program started Hello, Alice. Nice to meet you!
使用异步代码
顶级语句也支持asynchronous programming。我们可以使用await关键字,而无需声明async的Main方法。
示例
在这个示例中,我们使用HttpClient通过await关键字从网站获取数据。编译器自动将隐藏的Main方法变为异步的,因此我们无需手动编写它。
using System;
using System.Net.Http;
HttpClient client = new HttpClient();
string data = await client.GetStringAsync("https://example.com");
Console.WriteLine(data);
以下是上述程序的输出,显示了从给定URL下载的内容。
<!doctype html><html lang="en"><head><title>Example Domain</title><
meta name="viewport" content="width=device-width, initial-scale=1"><
style>body{background:#eee;width:60vw;margin:15vh auto;font-family:system-ui,sans-serif}
h1{font-size:1.5em}div{opacity:0.8}a:link,a:visited{color:#348}</style><body><div><
h1>Example Domain</h1><p>This domain is for use in documentation examples without needing permission.
Avoid use in operations.<p><a href="https://iana.org/domains/example">Learn more</a></div></body></html>
使用命名空间和自定义类型
我们可以使用namespaces并创建自定义类型,同时保持顶级语句的简洁。为了在单个文件中正确工作,顶级代码必须放在最前面,自定义类型必须在其后声明,或者放在单独的文件中。
示例
在这个示例中,顶级代码首先运行,然后它使用来自Utilities命名空间的Helper class。
using System;
// 立即运行的顶级代码
Console.WriteLine("Program running");
// 调用 Helper class 中的方法
Helper.DisplayMessage();
// 在顶级语句下方声明的 Helper class
public static class Helper
{
public static void DisplayMessage()
{
Console.WriteLine("Message from the Helper class");
}
}
以下是上述程序的输出 -
Program running Message from the Helper class
访问命令行参数
我们可以使用自动可用的args变量在顶级语句中访问command-line arguments。它的工作方式与传统 C# 程序相同。
示例
这是一个示例,我们使用顶级语句直接读取命令行参数。程序检查是否传递了任何参数。如果有,它会显示参数数量并打印每个参数。否则,它会显示一条消息,表示没有提供参数。
using System;
if (args.Length > 0)
{
Console.WriteLine($"You provided {args.Length} argument(s):");
foreach (string argument in args)
{
Console.WriteLine(argument);
}
}
else
{
Console.WriteLine("No arguments were provided.");
}
下面是我们运行程序后的输出。
No arguments were provided.
限制
使用顶级语句时,我们需要了解以下一些限制
- 项目中只有一个文件可以有顶级语句。
- 我们不能在同一项目中创建另一个Main方法。
- 顶级语句必须始终位于任何type声明之前。
- 它们不适合依赖于高级设置的大型或复杂应用程序,例如依赖注入或配置系统。
使用顶级语句的示例
这是一个示例,我们使用顶级语句创建一个计算器。程序从第一行直接开始运行,并执行所有计算,而无需任何class或Main方法声明。
using System;
Console.WriteLine("Calculator\n");
double number1 = 12;
double number2 = 4;
Console.WriteLine($"Addition: {number1 + number2}");
Console.WriteLine($"Subtraction: {number1 - number2}");
Console.WriteLine($"Multiplication: {number1 * number2}");
Console.WriteLine($"Division: {number1 / number2}");
以下是上述程序的输出 -
Calculator Addition: 16 Subtraction: 8 Multiplication: 48 Division: 3
结论
在本章中,我们学习了C# 中的顶级语句。这些语句写在文件顶部,通过移除Main方法或class的需求来简化代码。程序从第一行直接开始执行。它在小型项目中很有用,但不适合大型或复杂应用程序。