C# 9 新特性 —— 补充篇

C# 9 新特性 —— 补充篇

Intro

前面我们分别介绍了一些 C# 9 中的新特性,还有一些我觉得需要了解一下的新特性,写一篇作为补充。

Top-Level Statements

在以往的代码里,一个应用程序必须要有 Main 方法才能运行,从 C# 9 开始,支持没有 Main 方法的程序,实际编译之后还是会有一个 Main 方法的,使用示例如下:

using static System.Console;WriteLine("Hello World!");

实际编译出来的结果如下:

实际会生成一个没有命名空间的 <Program>$ 的类型,类中定义的有一个名称是 <Main>$ 的静态方法

Improved discards in lambda input parameter

从 C# 7.2 开始,我们可以使用 _ 来代表一个不使用的变量,废弃变量,但是在 lambda 表达式里默认不能有同名的参数名,从 C# 9 开始,支持多个参数同时使用 _ 来表示,如下所示:

Func<int, int, int> constant = (_, _) => 42;

Attributes for local function

从 C# 9 开始,我们可以在局部方法(本地方法)上设置 Attribute

public static void MainTest()
{InnerTest();[MethodImpl(MethodImplOptions.Synchronized)]void InnerTest(){Console.WriteLine(nameof(InnerTest));}
}

Partition methods

在 C# 2.0 之后就支持了分部类,通常分部类会出现在动态代码生成的地方,对于想要将一个类型拆分到多个文件里,我们通常也会考虑用到分部类。

C# 3.0 开始支持了分部方法,但是功能比较弱,使用起来有一些限制:

  • 分部类型各部分中的签名必须匹配。

  • 方法必须返回 void。

  • 不允许使用访问修饰符。分部方法是隐式 private 的。

C# 9 增强了分部方法的支持,分部方法的使用,只能在一个地方有方法体,目前主要是为了 Source Generator 引入了这个语言特性,可以在一个地方定义方法,在另外一个地方实现方法体,示例如下:

partial class PartialMethod
{public static partial void MainTest();static partial void Test1();
}partial class PartialMethod
{public static partial void MainTest(){Test1();Console.WriteLine("Partial method works");}
}

符合 C# 3.0 分部方法规则的允许没有方法体,否则必须要有方法体

ModuleInitializer

Source Generator 除了上面的分部方法之外,还引入了一个 ModuleInitializer 的概念,就像它的名字,模块初始化器,当用到某个模块的时候就会调用对应的 ModuleInitializer 方法进行初始化操作

ModuleInitializer 定义如下:

namespace System.Runtime.CompilerServices
{[AttributeUsage(AttributeTargets.Method, Inherited = false)]public sealed class ModuleInitializerAttribute : Attribute{}
}

使用示例如下:

internal static class ModuleInitializerSample
{/// <summary>/// Initializer for specific module/// /// Must be static/// Must be parameter-less/// Must return void/// Must not be a generic method/// Must not be contained in a generic class/// Must be accessible from the containing module/// </summary>[ModuleInitializer]public static void Initialize(){Console.WriteLine($"{nameof(ModuleInitializerAttribute)} works");}
}

ModuleInitlializer 对应的方法有几个要求

  • 必须是静态方法

  • 不能有方法参数,无参数方法

  • 方法没有返回值,返回类型必须是 void

  • 不能是泛型方法

  • 不能在泛型类中

  • 必须能够被所在模块访问的到(至少是 internal)

来看反编译的代码,可以看到有一个 Module 的类,在这个 Module 类的静态构造方法里会去调用声明为 ModuleInitializer 的方法

Function Pointer

C# 9 支持方法指针,对委托进一步的”C++化“,进一步提升性能,属于非安全代码,使用需开启 unsafe,使用示例如下:

public static unsafe void MainTest()
{delegate*<int, int, int> pointer = &Test;var result = pointer(1, 1);Console.WriteLine(result);
}private static int Test(int num1, int num2)
{Console.WriteLine($"Invoke in {nameof(Test)}, {num1}_{num2}");return num1 + num2;
}

Static Anoymouse Method

C# 9 开始支持在匿名方法或者表达式前声明 static,声明 static 之后就不能使用实例变量,只能使用静态变量,如下所示:

internal class StaticAnonymousMethod
{private readonly int num = 1;public void MainTest(){// anonymous methodAction action = () => { Console.WriteLine(num); };Action action1 = static () => { };// can not access `num`//expressionExpression<Func<int, bool>> expression = i => i > num;Expression<Func<int, bool>> expression1 = static i => i > 1;// can not access `num`}
}

Covariant Return Type

C# 9 开始支持返回类型的 Covariant(协变), 对于 override 方法可返回从重写基方法的返回类型派生的类型。这对于record和其他支持工厂方法的类型会很有用。可以参考下面的使用示例:

internal class CovariantReturnType
{private abstract class Operation{}private abstract class OperationFactory{public abstract Operation GetOperation();}private class AddOperation : Operation{}private class AddOperationFactory : OperationFactory{// 返回类型协变,返回具体的类型而不是抽象类中声明的类型public override AddOperation GetOperation(){return new();}}public static void MainTest(){var factory = new AddOperationFactory();factory.GetOperation();}
}

More

除此之外还有一些小的更新特性,详细可以参考文末给出的官方文档。

Reference

  • https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9

  • https://github.com/WeihanLi/SamplesInPractice/tree/master/CSharp9Sample

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305903.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Popup窗口创建无限级Web页菜单(5)

代码框架在(4)里面已经全部列出来了&#xff0c;现在工作就是按流程把他们完成。本来实现一个prototype的Menu菜单类只需要最多300行代码&#xff0c;可是后来做了一些操作习惯支持和UI显示上的优化后&#xff0c;代码猛增到了1000多行。不过final版本看起来确实比土不拉叽的pr…

【gRPC】ProtoBuf 语言快速学习指南

继上篇【gRPC】 在.Net core中使用gRPC了解了gRPC的使用&#xff0c;gRPC基于HTTP/2和ProtoBuf&#xff0c;ProtoBuf就非常有必要好好了解一下了&#xff0c;那么ProtoBuf究竟是什么&#xff1f;ProtoBuf Google Protocol Buffer是一种语言无关、平台无关、可扩展的序列化结构数…

vspythonqt混合_PYQT5 vscode联合操作qtdesigner的方法

除了使用pycharm外&#xff0c;还可使用vscode来操作pyqt&#xff0c;方法如下&#xff1a;1. 在vscode中配置相关的pyqt的相关根据自己实际情况修改第一项pyqt的路径2. 创建一个文件夹&#xff0c;右键&#xff0c;最后一项可以创建一个新窗口创建的新窗口后缀为 .ui右键中有以…

发现 ASP.Net 的一个关于回车提交的 Bug ? 必须多于一个 Text 域回车提交,Server: ButtonX_Click 才能截获!...

ASP.Net 中: 如果 Text 类型的域只有一个,此时按下回车提交,WebServer 端 ButtonX_Click 竟然截获不到,只能在 WebServer 端 Page_Load 里截获,与传统的 Web Form 提交到 Action CGI 没区别了!假如 Text 类型的域多于一个,此时按下回车提交,在 WebServer 端 ButtonX_Click 可以…

TIOBE 1 月榜单:Python年度语言四连冠,C 语言再次第一

喜欢就关注我们吧&#xff01;TIOBE 公布了 2021 年 1 月的编程语言排行榜。TIOBE 本月公布了 2020 年度编程语言&#xff0c;Python 获得四连冠&#xff0c;是过去一年中最受欢迎的编程语言。Python 在 2020 年实现了 2.01&#xff05; 的正增长&#xff1b;C 紧随其后&#x…

java 验证登陆_java登陆界面验证

展开全部以下代码就是了。详细参照附件import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swin…

A piecture of J2EE Core Patterns

这张图是J2EE Core Patterns里面的一幅图片,在Enterprise Solution Patterns Using Microsoft.Net里面虽然模式的概念与应用大同小异&#xff0c;但是那张表现架构模式整体的图感觉有点不直观,相比之下这幅图显得更清晰一点。 发到这里供大家参考学习&#xff1a;&#xff09…

孙丕恕离开浪潮 仪器厂历时60年成为服务器龙头企业

2020年12月31日浪潮集团有限公司董事会选举邹庆忠为公司董事长&#xff08;法定代表人&#xff09;&#xff1b;孙丕恕不再担任公司董事长&#xff1b;公司不再聘任孙丕恕为首席执行官。另外&#xff0c;经省委研究决定&#xff0c;拟任省直部门&#xff08;单位&#xff09;副…

java 数组 树_java使用顺序数组实现二叉树

顺序数组实现二叉树实现原理对于下标为index的节点其满足1.左孩子节点的下标为2index12.右孩子节点的下标为2index2代码实现package tree;public class ArrayBinaryTree {private int[] arr;public ArrayBinaryTree(int[] arr){this.arrarr;}public void preOrder(int index){i…

hack 入侵 142 主机的过程

时间 2005 3 29 iis 日志文件显示有黑客痕迹 常用的iis 分析软件的介绍 使用 find 命令 入侵检测的常用方法参考 http://www.xfocus.net/articles/200208/440.html 编写日志脚本参考 http://www.blueidea.com/bbs/archivecontent.asp?id1304500 sql 注入方法介绍和预防 http:/…

【Docker】Asp.net core在docker容器中的端口问题

还记得【One by one系列】一步步学习docker&#xff08;三&#xff09;——实战部署dotnetcore中遇到的问题么&#xff1f;容器内部启动始终是80端口&#xff0c;并不由命令左右。docker run --name container-name -p 81:5000 mywebapi所谓知其然就要知其所以然&#xff0c;浅…

新华字典java_新华字典查询示例代码

package api.binstd.zidian;import java.net.URLEncoder;import api.util.HttpUtil;import net.sf.json.JSONArray;import net.sf.json.JSONObject;public class Word {public static final String APPKEY "your_appkey_here";// 你的appkeypublic static final Str…

.net 5.0 中的 JsonConsole

asp.net core 5.0 中的 JsonConsoleIntroasp.net core 5.0 中日志新增了 JsonConsole&#xff0c;还是输出日志到 Console&#xff0c;但是会应用 Json 格式的一个 Formatter 把日志格式化成 json 再输出到控制台Sample一起来看一个示例&#xff0c;以我的一个小项目为例子来演…

采用开源软件搭建WebGIS系统(6)数据格式

[本文版权由xiaotievip.sina.com所有&#xff0c;转载需得到作者同意。] 在国家基础地理信息中心下载到的数据格式是Shape file数据。Shape file数据由3个文件构成&#xff0c;*.shp&#xff0c;*.dbf和*.shx&#xff0c;分别存储空间数据、属性数据和两者间的关系。*.shp得专门…

java 按符号分割字符串_JAVA字符串按分隔符号字符串分割

在处理有规律的字符串的时候.有些字符串分割需要注意了..如下例子:public class Split {public static void main(String[] args) {String str1 "1,2,3,4,5";String str2 "1,2,3,4,";String str3 "1,,2,3,";String str4",,,,";System.…

.NET Core 使用Topshelf方式创建Windows服务

Topshelf是一个.NET Standard库&#xff0c;它消除了在.NET Framework和.NET Core中创建Windows服务的那些麻烦。安装Install-Package Topshelf代码using System; using System.Collections.Generic; using System.Text; using Topshelf;namespace ConsoleApp2222 {public clas…

用VC++修改注册表----让我们踏出第一步(适合初学者)

用VC修改注册表----让我们踏出第一步(适合初学者)转载自&#xff1a;www.csdn.net 开场白 你是不是非常期待通过自己的双手&#xff0c;写出一个有模有样的&#xff02;系统修改&#xff08;维护&#xff09;工具软件&#xff02;&#xff1f;我想答案应该是肯定的&…

Repeater分页

//ASP.NET中的DataList和Repeater提供了简单快速的方法來显示,其间&#xff0c;我们可以使用<ItemTemplate>更是使我们能随心所欲的控制数据的排放样式&#xff01;//.可惜的是它们不像Datagrid那样&#xff0c;有内置的分页功能。////如何解决呢&#xff1f;////其实我们…

单一职责在.NET中

单一职责是降低耦合度的指导思想&#xff0c;适用于一个微服务&#xff0c;一个类型&#xff0c;一个方法。微服务层&#xff1a;微服务一般按业务的领域来进行拆分&#xff1a;药房微服务就是药房的业务&#xff0c;护士站微服务就是护士站的业务&#xff0c;广义上没有什么问…

PDG转PDF的方法

下面是我在“小文论坛”发的关于PDG转PDF的办法转贴请注明出自“小文论坛”.点击链接访问小文论坛前些天在坛子里看到一位朋友发的通过代理登录教育网超星的办法,试了试,还不错,下下来了几本吉他方面和计算机方面的书。但下下来的书是加密保存的&#xff0c;当该用户过期后又怎…