如何在C#9 中使用顶级程序 (top-level)
作者:码农读书 发布时间:2023-08-20 04:13:24
目录
顶级程序
顶级程序中的方法
顶级程序中的类
顶级程序的原理分析
当我们用 C# 进行编码的时候,总需要写很多的模板代码,即使是最简单的 console 程序,想象一下,如果去测试一个 类库 或者 API 的功能,通常你会用 Console 程序去实现,在开始工作的时候会发现你受到了 C# 标准模板的限制,业务逻辑必须要写在 Main 里,如下代码所示:
class Program
{
static void Main(string[] args)
{
//todo
}
}
顶级程序 是 C#9 中引入的一个新概念,允许你直接写自己的业务逻辑而不必受到模板代码的限制,顶级程序 是一个非常🐂👃的特性,可以让代码更加的干净,简短和可读,你可以通过顶级程序去探索新的 idea,这篇文章将会讨论如何在 C#9 中使用顶级程序。
顶级程序
在 C# 9.0 之前,下面的写法在 Console 程序中已经是最小化的了。
using System;
namespace IDG_Top_Level_Programs_Demo
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
在 C# 9.0 时代,可以祭出 顶级程序 来消除那些烦人的模板代码,让代码的逻辑意图更明显,改造后的代码如下:
using System;
Console.WriteLine("Hello World!");
顶级程序中的方法
你也可以在顶级程序中使用方法,如下例子所示:
System.Console.WriteLine(DisplayMessage("Joydip!"));
System.Console.Read();
static string DisplayMessage(string name)
{
return "Hello, " + name;
}
程序跑起来后,控制台将会输出:Hello, Joydip!
顶级程序中的类
你也可以在顶级程序中使用类,结构体,枚举,下面的代码展示了如何使用。
System.Console.WriteLine(new Author().DisplayMessage("Joydip!"));
System.Console.Read();
public class Author
{
public string DisplayMessage(string name)
{
return "Hello, " + name;
}
}
顶级程序的原理分析
现在我们来分析一下,顶级程序的底层逻辑到底是怎么样的,它本质上是一种语法糖,一种编译器的特性,也就是说你没有写模板代码的时候,编译器会帮你生成,替你负重前行,参考下面的代码段。
using System;
Console.WriteLine("Hello World!");
然后用在线工具 SharpLab https://sharplab.io/ 看一下编译器替你补齐的代码。
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;
using System.Security.Permissions;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[module: UnverifiableCode]
[CompilerGenerated]
internal static class <Program>$
{
private static void <Main>$(string[] args)
{
Console.WriteLine("Hello World!");
}
}
总的来说,顶级程序 非常适合那些想 快速试错,验证想法 的场景,有一点要特别注意,应用程序中只能仅有一个文件使用 顶级程序,如果存在多个,编译器会抛出错误的,还有一点,如果你是 C# 新手,你可能不理解顶级程序的底层逻辑,更好的方式就是老老实实的使用原生模板代码,当你主宰了 Main 后,你将会理解 顶级程序 是多么的短小精悍!
来源:https://mp.weixin.qq.com/s/DhL8CG9SpzNKSn1zVALozQ


猜你喜欢
- 1.屏幕是否亮屏:PowerManager powerManager = (PowerManager) context.getS
- 本文示例实现了Android退出时关闭所有Activity的功能,分享给大家供大家参考之用。具体方法如下:一般来说,在Android退出时,
- String boot 部署SpringBoot部署也是非常简单,首先,需要把打包输出的包由jar改为war,即修改pom.xml中pack
- 大家好,今天我们继续来学习Android 8.0系统的适配。之前我们已经讲到了,Android 8.0系统最主要需要进行适配的地方有两处:应
- 前言:1.最近项目上在测试人员压测过程中发现了OOM问题,项目使用springboot搭建项目工程,通过查看日志中包含信息:unable t
- 微服务启动时报错2021-05-18 21:25:44.644 WARN 5452 — [tbeatExecutor-0
- 一、多线程的sleep方法1.Thread.sleep(毫秒)2.sleep方法是一个静态方法3.该方法的作用:阻塞当前线程,腾出CPU,让
- 前言对于联表查询的四个注解 @OneToOne、@OneToMany、@ManyToOne 和 @ManyToMany,他们有几个用得比较多
- 最近回顾了一下java继承中的问题,下面贴代码:public class Base {protected String temp = &qu
- 我有一个文本输入对话框,当我点击对话框上的“是”按钮,它会验证输入,然后关闭对话框。但是,如果输入错误,我想停留在同一个对话框中.。每一次,
- 前言纸上得来终觉浅,绝知此事要躬行一.会话引入什么是会话?会话用来识别不同的客户端,客户端和服务器之间发生的一系列连续的请求和响应的过程,当
- 1 读取操作系统和CLR的版本OperatingSystem os = System.Environment.OSVersion; Cons
- 一、示例代码访问 localhost:8080/jsonTest —— 返回 json 格式的数据@
- 题意Description相信大家都做过"A+B Problem"了吧,这道题是它的加强版。输入两个整数 A , B ,
- 简单几步,实现SpringMVC+servlet3.0文件上传功能:第一步:配置web.xml文件中的servlet,添加multipart
- 一、ConcurrentLinkedQueue介绍并编程中,一般需要用到安全的队列,如果要自己实现安全队列,可以使用2种方式:方式1:加锁,
- 一般启动一个新的Activity都默认有切换的动画效果,比如界面从右至左的移动。但是有些时候我们不需要这个动画,怎么办?操作方法比较麻烦,这
- 前沿页面通用Loading组件是一个App必不可少的基础功能,之前只开发过Android原生的页面Loading,这次就按原生的逻辑再开发一
- 本文实例讲述了Java构造代码块,静态代码块原理与用法。分享给大家供大家参考,具体如下:本文内容:局部代码块构造代码块静态代码块补充&nbs
- Maven setting中私有仓库配置浅析最近遇到过不少这样那样的问题,曾经做过maven的分享,但是发现当时部分内容还是太想当然了,下面