C# Top-level Statements 怎么用?顶级语句在 C# 项目中如何快速入门?

文章导读
Previous Quiz Next 顶级语句 是 C# 中的一项特性,允许我们直接在文件中编写代码,而无需将其包装在 class 或 Main 方法中。此特性在 C# 9.0 中引入,旨在使程序更容易启动。
📋 目录
  1. 顶级语句出现之前的 C# 工作方式
  2. 使用顶级语句
  3. 编译器如何处理
  4. 使用顶级语句的规则
  5. 声明和使用 Functions
  6. 使用异步代码
  7. 使用命名空间和自定义类型
  8. 访问命令行参数
  9. 限制
  10. 使用顶级语句的示例
A A

C# 中的顶级语句



Previous
Quiz
Next

顶级语句 是 C# 中的一项特性,允许我们直接在文件中编写代码,而无需将其包装在 classMain 方法中。此特性在 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!

使用顶级语句

当我们使用 顶级语句 时,可以完全跳过编写 classMain 方法。编译器会在后台自动为我们创建它们,因此我们只需专注于重要的逻辑。

示例

以下是使用顶级语句的相同程序的示例

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语句。
  • 声明其他元素:我们可以在顶级语句下方声明functionsclassesrecordsstructs,但不能在上方。
  • 异步代码:如果我们使用await,编译器会自动将隐藏的Main方法变为异步的。我们无需自己声明它。
  • 命令行参数:这些参数会自动通过变量args可用,即使我们没有看到它的声明。

示例

以下是一个示例,展示了顶级语句的工作方式。程序从第一行开始执行。它打印欢迎消息,计算两个数字的和,并显示结果,所有这些都不需要classMain方法。

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关键字,而无需声明asyncMain方法。

示例

在这个示例中,我们使用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声明之前。
  • 它们不适合依赖于高级设置的大型或复杂应用程序,例如依赖注入或配置系统。

使用顶级语句的示例

这是一个示例,我们使用顶级语句创建一个计算器。程序从第一行直接开始运行,并执行所有计算,而无需任何classMain方法声明。

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的需求来简化代码。程序从第一行直接开始执行。它在小型项目中很有用,但不适合大型或复杂应用程序。