.NET6系列:C#10新功能预览
2021年4月19日微软发布公告称将于今年夏季发布首款64位的 Visual Studio 2022,2021年5月20日又发布了 Visual Studio 2022 线路图,进一步提升开发生产力。与 Visual Studio 黄金搭档的 C# 语言一直都是秒天秒地秒空气的存在。C#10,今天它来了。

小小的免责声明,这些变化大多数几乎都完成了。由于它仍在积极开发中,我不能保证一切都与 C# 10 发布时完全一样。
他首先谈到的是 record 的当前实现是使用类(reference type)作为基对象的。C#10中即将提供一个 record struct,它的基础类型可以是值类型。不同之处在于,常规 record 将通过引用从一个函数传递到另一个函数,而 record struct 将通过其值进行复制。record struct 也将支持 with 表达式。
同时,还可以向 record 中添加运算符。这两种 record 类型都可以使用。
record Person(string Name, string Email)
{
public static Person operator +(Person first, Person second)
{
// TODO 业务逻辑
}
}
C# 团队关注的目标之一是使对象的初始化更容易。这就是为什么可以根据需要对 class,struct,record 或 record struct 添加 required 特性标记。它强制要求这些属性必须赋值。这可以通过构造函数来完成,或者可以通过对象初始化来完成。下面的两个类定义是等效的。如果用required关键字写的话,不设置Name属性就不能实例化Person 。编译器会抛出错误并且无法编译。
class Person
{
public required string Name { get; set; }
public DateTime DateOfBirth { get; set; }
} class Person
{
public Person(string name) => Name = name; public string Name { get; set; }
public DateTime DateOfBirth { get; set; }
}
为了进一步改善属性(properties),可以完全摆脱 backing field。新的关键字 field 将提供对所述支持字段的访问。它对 setter 和 init only 属性都可以使用。
class Person
{
public string Name { get; init => field = value.Trim(); }
public DateTime DateOfBirth { get; set => field = value.Date; }
}
在下一个版本中也会有一些漂亮的小改进。其中之一就是 with 操作符也将支持匿名类型。
var foo = new
{
Name = "Foo",
Email = "foo@mail.com"
};
var bar = foo with {Name = "Bar"};
现在可以创建一个文件,其中的命名空间导入可以在任何地方使用。例如,如果在几乎每个文件中都使用了一个常用的名称空间,例如Microsoft.Extensions.Logging.ILogger,那么就可以将全局命名空间 using Microsoft.Extensions.Logging.ILogger 添加到任何.cs文件中(我建议使用Program.cs或专用Imports.cs),整个项目中都可以使用 logger 接口。但是,该方法不适用于整个解决方案(solution)。因为没有人能预测哪些地方需要导入,所以它们是按项目分组到每个项目(project)中。


随后,还会对 namespace 进行优化。现在 namespace 需要花括号 {} 来对代码进行分组,这意味着所有代码至少要缩进一次。为了节省 tab(或四个空格)和屏幕空间,在文件中的任何位置添加一个 namespace,将使所有代码都属于该namespace。有相关研究表明绝大多数情况下,一个文件中的几乎所有代码都属于同一个 namespace。使用该方案优化后,文件大小会减小,这对于一个解决方案(即使它包含数千个文件)来说可能并不重要,但在 GitHub/GitLab/BitBucket/...的规模上,我认为这将为他们节省一些空间。如果有人仍想在一个文件中包含多个命名空间,则仍然可以选择使用大括号。
// 传统方式 LegacyNamespace.cs
namespace LegacyNamespace
{
class Foo
{
// ToDo 业务逻辑
}
} // 简化后的方式 SimplifiedNamespace.cs
namespace SimplifiedNamespace;
class Bar
{
// ToDo 业务逻辑
}
lambda 语句也有一些很酷的更新。编译器将更好地支持推断 lambda 签名,并且还可以添加属性。可以指定显式返回类型以帮助编译器理解 lambda。
var f = Console.WriteLine;
var f = x => x; // 推断返回类型
var f = (string x) => x; // 推断签名
var f = [NotNull] x => x; // 在属性上添加特性
var f = [NotNull] (int x) => x;
var f = [return: NotNull] static x => x; // 为返回类型添加特性
var f = T () => default; // 显示返回类型
var f = ref int (ref int x) => ref x; // 在 struct 上使用 ref 关键字
var f = int (x) => x; // 显式指定隐式输入的返回类型
var f = static void (_) => Console.Write("Help");
最后,可以在接口上指定静态方法和属性。我知道这将是一个有争议的话题,就像向接口添加默认实现一样。虽然我不喜欢它,然而这可能非常有趣。想象一下,您可以指定接口的默认值或指定创建方法。
interface IFoo
{
static IFoo Empty { get; }
static operator +(IFoo first, IFoo second);
}
class Foo : IFoo
{
public static IFoo Empty => new Foo();
public static operator +(IFoo first, IFoo second) => /* 在此做逻辑计算 */;
}
就个人而言,我喜欢这些变化。尤其是 namespace 和 interface 的变化和改进。不管怎样,C#的未来是光明的。
参考文献:
- https://kenbonny.net/introducing-csharp-10
.NET6系列:C#10新功能预览的更多相关文章
- (转)Visual Studio 2013新功能预览:增代码的透明度和可追溯性
微软打破了Visual Studio两年升级一次的传统,Visual Studio 2012发布还不足一年,微软就计划发布了Visual Studio 2013了.在今天的TechEd大会上,微软宣布 ...
- ArcGIS 10.5新功能预览
ArcGIS for Server产品线被重命名为ArcGIS Enterprise. 带来更多丰富的时空GIS功能. 分析地理大数据 捕捉和分析实时传感器数据 快速地理影像分析 ArcGIS Ent ...
- Android Studio 2.2新功能预览
升级SDK可用Background 多加了个按钮,可用一边写代码一边下载SDK Instant Run 修改代码一秒启动 APK analyzer 分析任何的APK 查看APK下载包的大小,解压后的实 ...
- 点触科技安全验证新模式与逐浪CMS3.9.3新功能预览
是颠覆传统字符验证码的新一代验证码系统.用户通过点击.拖动等有趣方式即可完成验证,防止机器攻击, 应用在注册.登录.数据访问保护.黄牛刷单等场景. 只要在逐浪CMS后台-系统-配置 ,进行简单的配置, ...
- SLAM+语音机器人DIY系列:(二)ROS入门——10.在实际机器人上运行ROS高级功能预览
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- Windows 10 开发人员预览版中的新增功能(转自 IT之家)
Windows 10 开发人员预览版中的新增功能 在Win10预览版中安装工具与SDK后,即可着手创建Windows通用应用或先浏览目前的环境与此前相比都发生了什么变化. 应用建模 文件资源管理器: ...
- 原创:MVC 5 实例教程(MvcMovieStore 新概念版:mvc5.0,EF6.01) - 2、数据框架 和 功能预览
说明:MvcMovieStore项目已经发布上线,想了解最新版本功能请登录 MVC 影视(MvcMovie.cn) 进行查阅.如需转载,请注明出处:http://www.cnblogs.com/Dod ...
- C# 9.0 新特性预览 - 顶级语句
C# 9.0 新特性预览 - 顶级语句 前言 随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章将向大家展示它们 ...
- Kafka Eagle 3.0.1功能预览
1.概述 最近有同学留言,关于Kafka Eagle的一些使用问题.今天笔者就为大家来详细介绍Kafka Eagle 3.0.1的功能以及使用方法. 2.内容 在3.0.1版本中,EFAK优化了分布式 ...
随机推荐
- 从中国加入WTO来看Java设计模式:中介者模式
目录 应用场景 中介者模式 定义 意图 主要解决问题 何时使用 优缺点 世界贸易组织WTO 应用场景 系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象 想通过一个 ...
- JAVAEE_Servlet_23_路径编写总结和url_pattern的编写方式
路径编写总结和url_pattern的编写方式 路径的编写 超链接 form表单的action属性 重定向 response.sendRedirect("/项目名/资源路径"): ...
- ArrayList扩容机制以及底层实现
简介 来源:博客园 作者:吾王彦 博客链接:https://www.cnblogs.com/qinjunlin/p/13724987.html ArrayList动态数组,是 java 中比较常 ...
- Solon Cloud 分布式开发套件清单与快速概览
Solon Cloud 是一系列的接口标准和配置规范.Solon Cloud 为常见的分布式系统模式提供了一种简单且方便的编程模式,帮助开发人员构建有弹性的.可靠的.协调的应用程序.Solon Clo ...
- hdu2899 三分
题意: 给你个函数,F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x ,给你一个y,x的范围是0--100 问你最小的 F(x) 思路: 本人推数学公式啥 ...
- URL分发器(视图层)
目录 视图 URL映射 path函数 URL中传入参数 普通传入参数 变量形式传入参数 URL中包含另一个urls模块 URL命名.URL反转.应用命名空间 视图 视图一般都写在 app 的 vi ...
- IDEA 这样设置,好看到爆炸!!!
Hello,大家好,我是楼下小黑哥. 今天这篇文章是次条视频的文案,这里推荐大家直接看视频学习. IDEA 这样设置,好看到爆炸!!!#01 今天这期我们来分享几个美化 IDEA 设置技巧,让你的 I ...
- jquery中定义数组并给数组赋值后转为json格式为[]问题的解决
一.问题描述:jquery定义一个空数组,并赋值,结果转为json格式后打印值为空 我原本是这样写的,但是show_data值一直为[] var export_data = [];export_dat ...
- Mongodb安装配置以及在thinkphp中的使用
1.Mongodb安装 Mongodb安装参照此文档: https://www.runoob.com/mongodb/mongodb-window-install.html php的mongodb扩展 ...
- HelloGitHub 小程序上线了,蛋只有一个搜索功能
作者:HelloGitHub-卤蛋 我是...蛋蛋啊,本文是我从零开发「HelloGitHub 小程序」的开发日记,不要把这个系列当作技术文章来读,你将会收获更多的乐趣.♂️ 我只是个 Python ...