C# 9: 迈向支持脚本编程的第一步
云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!
不需要任何样板代码是脚本语言的一个显著特征,你可以直接在文件的第一行编写声明和语句,就像在函数内部一样。相反,诸如 VB,C#或者 Java 之类的非脚本语言,在类文件中就必须包含类似“main”方法的样板代码。
微软的 C#开发经理 Mads Torgersen 在 3117 提案中建议 C# 9 支持顶层语句和函数的功能。该提案允许在文件中直接编写语句和函数,而无需使用类(Class)进行包装。Torgersen 声称该提案的初衷是:
C#编译器目前支持一种可用于各种脚本开发和交互目的的语言方言,使用该方言,可以直接在顶层编写语句和非虚成员,而不需要使用成员体或类型进行包装。
虽然脚本方言很少被使用,且在某些方面上,它还没有跟上“主流”的 C #语言,但是通过 Try.NET 和其他技术的使用场景却在快速增加,因此我担心 C#未来会出现两种不兼容的脚本方言。
虽然当前版本的 C#脚本还没有被广泛使用,但 Torgersen 预测未来这个局面会被打破:
除了 Try.NET 之外,C#脚本在数据科学和机器学习的使用场景也在增加,而且使用者可以直接从实时数据交互这种模式中受益。
那么为什么不将交互 / C#脚本分开呢?因为我认为使代码能够在“实验”和“软件研发”之间来回切换是非常有价值的。
Torgersen 认为以下三种方案, 都可以实现顶层语句 / 函数的功能:
方案 1
如果采纳该方案,那么执行语言将被允许出现在命名空间声明之前。这些执行语句将被编译到一个主函数内,然后该主函数会被放到一个程序(Program)类中,该主函数可支持异步操作。
如果多个文件都在命名空间的外部声明了执行语句,那么编译器会报错,除非你希望拥有多个包含主函数的程序类。
译者注:
方案 1 中,顶层语句最终会被编译成如下代码:
static class Program
{
static async Task Main(string[] args)
{
// 这里是你定义在命名空间外部的语句
}
}
方案 2
方案 2 是实现顶层函数,该方案允许在命名空间内或者全局定义函数,尽管公开函数也是允许的,但这些函数将被默认当作内部函数。从调用者角度来看,这些函数将直接属于该命名空间(这也是 VB 模块中函数的工作原理)。
方案 2 可能的实现思路是,生成一个局部类,将这些成员包装成静态成员。这个局部类的名称不是特定某个名字,可能是在确保不同程序集的相同命名空间中,通过某种方式生成的不重复的名称。只要顶层成员中有一个是公共的,那么这个局部类就是公共的,通过这种方式,可以让程序集知道那些成员是可以直接对外暴露的。
方案 3
虽然现有的 C#脚本方言和 C#本身是 2 种不同的语言,但方案 3 目的不是消除脚本方言,而是为了让这 2 种语言结合的更加紧密。Torgersen 说到:
如果在 C#中添加对顶层语句和函数的支持,那么我们不希望顶层语句和函数的执行和其在脚本中执行有冲突。相反,在保持语义功能一致的前提下,我们希望在必要的时候,以某种方式对它们进行必要的编译。这并不会完全消除脚本语言,因为我们仍然需要处理它们所依赖的特殊指令和“魔法命令”。但至少我们可以避免相同的语法表达不同的逻辑。
目前,Mads 建议 C#只关注方案 1,他说到:
你可以大胆的想象下,要实现一个满足所有方案功能,将会是怎样。那将需要进行大量的设计, 考虑大量的细节,因此我不建议这样做,相反,我认为我们应该关注在方案 1 的实现上。因为本质上,方案 1 其实已经基本包含了其他方案。
同时他提到,在使用方案 1 实现任何功能的时候,将来都不会给实现方案 2 和方案 3 带来困扰。
设计细则
顶层语句的第一条规则是,项目中只允许一个文件存在顶层语句。就像只能有一个“Main”函数一样,如果在一个文件中包含多个 naked 语句,那么编译器会报错。
语句的内容决定了最终编译产生的代码形式。无论语句是否使用了 await 关键字或者是否有 return 表达式(例如:return 5),编译输出的代码形式只会是以下四种:
static void Main(string[] args) static int Main(string[] args) static Task Main(string[] args) static Task<int> Main(string[] args)
支持相同的语法,就像普通方法中使用本地函数一样。
【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/zhibo立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK
原文发布时间:2020-06-11
本文作者:Jonathan Allen
本文来自:“InfoQ ”,了解相关信息可以关注“InfoQ”
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java构造器,一文带你了解
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 前言 理解构造器之前,首先我们需要了解Java中为什么要引入构造器,以及构造器的作用。 在很久之前,程序员们编写C程序总会忘记初始化变量(这真的是一件琐碎但必须的事),C++引入了 构造器(constructor) 的概念,这是一个在创建对象时被自动调用的特殊方法。Java也采用了构造器。 一、构造器的引入 引入构造器帮助我们解决了哪些问题呢?假设我们每定义一个类都必须定义一个initialize()方法,该方法提醒你,每次使用对象之前都要执行一次该方法,这意味着用户每次都必须记得自己去调用此方法,这和上文提到的C程序员一样,很容易就忘记了。Java构造器的出现很好的规避掉了这种问题,创建对象时,java会在使用对象之前调用相应的构造器,保证对象正确初始化。 我们来看一个简单实例: public class TestMain { TestMain() { //默认构造器 System.out.println("默认构造器"); } public static void main(Stri...
- 下一篇
让美团、京东、搜狐都说好的数据仓库,牛在哪?
守着金山讨饭吃,乍听有些不可思议,但不少企业正遭遇这样的窘况。 数据被誉为“新石油”,如何管理并洞悉数据的价值,是企业未来发展的核心竞争力。进入大数据时代,数据规模与日俱增,如果没有一款性能强大的数据仓库,企业不仅难以抵挡海量数据带来的各种挑战,还会在瞬息万变的市场环境中迷失方向。 而有些企业在面对海量数据时却能从容应对,他们又有哪些制胜法宝?今天,就让我们一起回顾下,美团、京东、搜狐等企业,如何应对大数据带来的各种挑战。 美团——节约计算资源,提升开发效率 作为国内领先的生活服务电子商务平台,美团每时每刻都需要处理大量的订单及商品信息。而在2017年年底,美团已经维护了Kylin和Druid两个开源系统,Kylin主要满足离线固化多维分析的需求,Druid主要满足实时多维分析的需求。 但由于Kylin和Druid都是基于预计算的系统,没有保留明细数据,无法进行明细查询。为此,美团于2018年初,开始调研当时开源的ROLAP系统,并进行落地。 美团当初主要调研了SQL on Hadoop、TiDB、SnappyData、ClickHouse和Doris等系统,这些都是优秀的开源系统,且...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境