C# 9.0 新特性预览 - 顶级语句
C# 9.0 新特性预览 - 顶级语句
前言
随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章将向大家展示它们。
目录
[C# 9.0 新特性预览 - 类型推导的 new]
[C# 9.0 新特性预览 - 空参数校验]
[C# 9.0 新特性预览 - 顶级语句]
[C# 9.0 新特性预览 - Record 类型]
[C# 9.0 新特性预览 - 模式匹配的改善]
[C# 9.0 新特性预览 - 源代码生成器]
[C# 9.0 新特性预览 - 其他小的变化]
顶级语句 (Top-level statements)
顶级语句这个名字看起来不是那么直观,或许它的曾用名更好一些:Simple Programs,简单程序。
目的
想必大家都知道,即使是最简单的 C# 程序,也会有一定量的繁文缛节,因为最少也需要一个 Main 方法。这似乎妨碍了语言的学习和程序的清晰度。因此,这个特性的最主要目的就是为了初学者和代码的清晰度,让书写 C# 程序可以变得更轻松。
语法
语法 Spec 如下,允许在命名空间的声明前面,添加一组语句,且只允许有一个编译单元(可以认为是一个源文件)拥有这种语句:
compilation_unit
: extern_alias_directive* using_directive* global_attributes? statement* namespace_member_declaration*
;
Spec 比较难懂,我们直接来看示例:简单来说,就是允许在源文件中直接书写代码语句而不用写 Main 方法:
System.Console.WriteLine("Hi!");
以上代码会被翻译为:
static class $Program
{
static void $Main(string[] args)
{
System.Console.WriteLine("Hi!");
}
}
可以看到,WriteLine语句被自动的包在了一个类和 Main 方法里面。
自动生成的 Main 方法的返回值也会根据是否异步以及是否有返回值来变化,例如:
await System.Threading.Tasks.Task.Delay(1000);
System.Console.WriteLine("Hi!");
return 0;
会被翻译为:
static class $Program
{
static async Task<int> $Main(string[] args)
{
await System.Threading.Tasks.Task.Delay(1000);
System.Console.WriteLine("Hi!");
return 0;
}
}
各种场景
- 支持在 using 语句后面:
using System;
Console.Write("Hi!");
会被翻译为:
using System;
static class $Program
{
static void $Main(string[] args)
{
Console.Write("Hi!");
}
}
- 也可以加上本地函数:
local();
void local() => System.Console.WriteLine(2);
- 可以与其它代码共存,例如类的声明:
Type.M();
static class Type
{
public static void M()
{
System.Console.WriteLine("Hi!");
}
}
稍微复杂一点的:
await using (var x = new C())
{
System.Console.Write("body ");
}
class C : System.IAsyncDisposable, System.IDisposable
{
public System.Threading.Tasks.ValueTask DisposeAsync()
{
System.Console.Write("DisposeAsync");
return new System.Threading.Tasks.ValueTask(System.Threading.Tasks.Task.CompletedTask);
}
public void Dispose()
{
System.Console.Write("IGNORED");
}
}
- 同时兼容了using alias的语法
using alias1 = Test;
string Test() => ""1"";
System.Console.WriteLine(Test());
class Test {}
delegate Test D(alias1 x);
namespace N1
{
using alias2 = Test;
delegate Test D(alias2 x);
}
- 也可以同时与显示的 Main 方法声明在一起,只不过显示的Main方法会被忽略掉并提示一个警告
using System;
using System.Threading.Tasks;
System.Console.Write("Hi!");
class Program
{
static void Main() // warning CS7022: The entry point of the program is global code; ignoring 'Program.Main()' entry point
{
Console.Write("hello");
}
}
限制
- 不支持在多个编译单元下拥有顶级语句:
// file1.cs
System.Console.WriteLine("1"); // error CS9001: Only one compilation unit can have top-level statements.
// file2.cs
System.Console.WriteLine("2"); // error CS9001: Only one compilation unit can have top-level statements.
- 不能放在类的内部
class Test
{
System.Console.WriteLine("Hi!"); // ERROR
}
- 不能放在命名空间的内部
namespace Test
{
System.Console.WriteLine("Hi!"); // ERROR
}
- 要么所有分支都有返回值,要么都没有
System.Console.WriteLine();
if (args.Length == 0)
{
return 10; // error CS0161: 不是所有代码分支都有返回值
}
- 虽然可以可以与类声明一起写,但是在类中是无法调用到 Main 方法 args 入参的,因为编译时会编译为两个类
System.Console.WriteLine(args);
class Test
{
void M()
{
System.Console.WriteLine(args); // ERROR
}
}
- 自然,你也不能用 args 来命名本地函数
args(1);
void args(int x) // ERROR
{}
参考
[Proposal: Simplified Null Argument Checking]
[Unit test: NullCheckedParameterTests.cs]
[LDM-2019-07-10.md]
C# 9.0 新特性预览 - 顶级语句的更多相关文章
- C# 9.0 新特性预览 - init-only 属性
C# 9.0 新特性预览 - init-only 属性 前言 随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章 ...
- C# 9.0 新特性预览 - 类型推导的 new
C# 9.0 新特性预览 - 类型推导的 new 前言 随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章将向大 ...
- C# 9.0 新特性预览 - 空参数校验
C# 9.0 新特性预览 - 空参数校验 前言 随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章将向大家展示它 ...
- Vue.js 3.0 新特性预览
总结起来,Vue 3 以下方面值得我们期待 : 更快 更小 更易于维护 更多的原生支持 更易于开发使用 完整的PPT:docs.google.com/presentatio… Evan 和 Vue 团 ...
- C#9.0新特性之四:顶级程序语句(Top-Level Programs)
1 背景与动机 通常,如果只想用C#在控制台上打印一行"Hello World!",这可不是Console.WriteLine("Hello World!"); ...
- Windows Phone 8.1SDK新特性预览
前言 Windows Phone 8.1的预览版将在近期推送,WP 8.1的SDK也已经进入到RC阶段,可以从这里安装.本次更新的SDK被直接集成到了VS2013Update2里面,不再是单独的 ...
- avalon1.3的新特性预览
avalon1.2的性能优化风暴很快就告一段落,入职也快一个月了,许多乱七八糟的事也少了下来,估计未来一个月会有许多好东呈现给大家. 首先是一个性能检测工具.由于MVVM是将原本由人脑干的事,转到各种 ...
- Office 2016 正式发布——新特性预览
今天微软又发生了一件大事!Windows Office 2016正式发布,这标志着Windows Office 又达到了一个新的里程碑! 全新的Office 发布为Office 365 用户带来了新的 ...
- CSS3_新特性预览
一.强大的CSS选择器 以前我们通常用class. ID 或 tagname 来选择HTML元素,CSS3的选择器强大的难以置信. 它们可以减少在标签中的class和ID的数量更方便的维护样式表.更 ...
随机推荐
- Robotium和Espresso大PK——速度篇
引言 Espresso和Robotium都是android UI自动化测试框架,且都是建立在Android Instrument的基础之上.对于测试人员来说,UI测试应该具备如下三个特点:1. 容易编 ...
- Vue管理系统前端系列五自定义主题
目录 自定义主题 1.安装「主题生成工具」 2.安装白垩主题 3.新建颜色挑选组件 自定义主题 1.安装「主题生成工具」 由于主题工具需要依赖于 node-sass,而node-sass版本兼容性并不 ...
- CSS实现大数据热点波纹图
CSS实现大数据热点波纹图 实现效果: 涉及知识点: 定位 盒子阴影 动画 思想:以3道波纹为例.首先使用一个div盒子作为圆心,然后每道波纹作为一个div.4个盒子均使用定位属性定位到圆心.然后设置 ...
- .NET 设计模式 思维导图
关于.NET 设计模式 思维导图 背景说明 以前都在匆匆忙忙写代码,在无穷无尽的需求中间左冲右突,最近终于有一些闲暇的时间,来总结和思考编程中的一些核心思想,磨刀不误砍柴的功夫,期望通过总结和学习,能 ...
- 【小白学AI】XGBoost推导详解与牛顿法
文章来自微信公众号:[机器学习炼丹术] 目录 1 作者前言 2 树模型概述 3 XGB vs GBDT 3.1 区别1:自带正则项 3.2 区别2:有二阶导数信息 3.3 区别3:列抽样 4 XGB为 ...
- Java数据结构——红黑树
红黑树介绍红黑树(Red-Black Tree),它一种特殊的二叉查找树.执行查找.插入.删除等操作的时间复杂度为O(logn). 红黑树是特殊的二叉查找树,意味着它满足二叉查找树的特征:任意一个节点 ...
- Sign in with Apple 流程总结
流程图 相关说明 UserId 与用户的 Apple Id 一一对应.在同一个开发帐号下的所有 app 里,获取到的值都一样. IdentityToken identityToken 是一个 Json ...
- C++ int与char[]的相互转换
C++ int与char[]的相互转换 一.itoa函数与atio函数①把int类型数字转成char类型,可以使用itoa函数. itoa函数原型: char*itoa(int value,char* ...
- NOR Flash 与 NAND Flash 的区别
闪速存储器 闪速(Flash)存储器是一种电可擦除可多次编程的存储器.工艺上主要有两类:或非(NOR)型阵列和与非(NAND)型阵列. 项目 读取速度 写入速度 擦除速度 特性 其他 NOR Flas ...
- 盒子上下滚动到js 底部触发的事件
//html是用法举列子,js亲测有效(把这段js#scro加到你要滚动的盒子) <div id="scro"> <div>1</div> & ...