Dotnet 6.0,你值得拥有

Dotnet 6.0 就要来了,这会是一个绝对值得拥有的版本。了解一下?

最近在研究 Dotnet 6.0 & C# 10,一个字 - 爽!

下面,分享一下新的一些特性给大家。

一、编程语言方面

编程语言升到 C# 10,新东西不少。

1. 属性的 required

看一个简单的例子:

public class User
{public string name { get; set; }public DateTime dateOfBirth { get; set; }
}

假设,我们希望 dateOfBirth 字段必须输入。在 C# 9.0 之前,其实我们没有更好的办法。比方:

var myUser = new User()
{name = "WangPlus",
}

这样写,编译器是不会给出任何提醒或警告的。因此,我们需要在各个使用的地方,加上字段赋值的检查。

而在最新的语言中,对于这样的需求,增加了一个 required 属性。看代码:

public class User
{public string name { get; set; }public required DateTime dateOfBirth { get; set; }
}

这时候,当你实例化 User,而没有给 dateOfBirth 赋值时,编译器会直接扔出异常。

在我写这个文章的同时,刚刚发现这个特性从最新的 preview 里给移除了,似乎微软想把这个放到 C# 11中。目前论坛上吵翻了。我们静待一下结果。

2. 属性的 field

在大多数情况下,我们定义一个类,会采用这种方式:

public class User
{public string name { get; set; }public DateTime dateOfBirth { get; set; }
}

但有时候,因为一些需要,需要提前实例化,或者实例化时需要进行某些处理。比方上面的类,我们只想要 dateOfBirth 的日期部分,我们会把类做成这个样子:

public class User
{public string name { get; set; }private DateTime _dateOfBirth;public DateTime dateOfBirth { get{return _dateOfBirth;}set{_dateOfBirth = value.Date;}}
}

当然,习惯了也没什么麻烦的。不过我们知道,_dateOfBirth 这个私有属性其实是一个中间数据,对外没有用处,但会占用实例资源。

现在,有了一个中间属性,叫 field。代码会变成这样:

public class User
{public string name { get; set; }public DateTime dateOfBirth { get; set => field = value.Date; }
}

嗯嗯,可读性就高了不少。

3. 匿名对象的 with

匿名对象的出现,给我们带来了相当多的方便。在类中,不需要对外输出的结构化数据,都可以做成匿名对象,而不需要预先定义一个数据对象。

看代码:

var myUser = new { name = "WangPlus", gender = "Male" };

嗯。真的很方便。

不过,也有不方便的地方,就是匿名对象的传递。比方,我们想创建另一个对象 myUser1,属性还是这些,仅仅需要改变几个属性的值,怎么办?在以前,没有别的办法,只能重写一个:

var myUser1 = new { name = "WangPlus1", gender = "Male" };
/** 或者 **/
var myUser1 = new { name = "WangPlus1", gender = myUser.gender };

可以想象,如果这个匿名对象字段很多的话,就会麻烦的不要不要的。

现在有了 with,这个事情就简单了:

var myUser1 = myUser with { name = "WangPlus1" };

注意,这个写法,不是把 myUser 里的属性改了,而是新生成了一个实例,并传递了 myUser 的全部属性和值到新实例 myUser1,然后才是把一些属性的值改成新的值。

4. 非空参数检查

在我们写一个方法时,成熟的程序员,都会做参数的非空检查:

public string FormatName( string name )
{if( string.isNullOrEmpty( name ) )return "ERROR";/** ... **/
}
public string FormatUser( User user )
{if( user == null )return "ERROR";/** ... **/
}

做法很正确,但很麻烦,一个套路性的东西,却要不停的写。

现在,有了一个神参数:!,没错,就是叹号。

写法是这样:

public string FormatName( string name! )
{/** ... **/
}
public string FormatUser( User user! )
{/** ... **/
}

加上 ! 后,执行中,程序会自动检查参数的非空状态,如果出现 null,会抛出 ArgumentNullExceptions。

5. global using

这是最爽的一个特性。

以前我们写代码,每个文件前边,都有无数个 using,而且很多 using 都是重复的。

现在,C# 10 提供了一个 global 关键字。从此,using 变成了:

global using System;
global using System.Collections.Generic;
global using System.Threading.Tasks;

系统会识别 global using 后边的内容会应用于整个项目。因此,在其它文件中,如果需要使用时,可以不写对应的 using ,直接写代码即可。

再因此,可以把所有的 global using 放到一个单独的文件中,而在其它文件中,不需要再做 using 引用。

同时,如果已经存在 global using,而你的文件中又写了同样库的 using,系统会扔出一个警告。

6. 文件级的命名空间 namespace

这个特性好像没有省了多少事。不过,也算是一个变化。

以前我们做代码时,是这样:

namespace MyNamespace
{public class User{public void User()  {//...Method implementation}}
}

外部调用时,就这么写:

var obj = new MyNamespace.User();
/** 或者 **/
using MyNamespace;
var obj = new User();

现在,命令空间的定义改成了:

namespace MyNamespace;
public class User
{public void User()    {//...Method implementation}
}

这样写,清爽了一些,缩进的层次也少了一层。当然,调用还是一样的。

二、API方面

API 方面就更多了。在社区里,不停的会有新的 API 爆出来。我就选一些自己感觉有用的来说。

1. 非流式读写文件

流式读写,经常会涉及到中间流,资源浪费不说,写起来也麻烦。

现在可以直接用底层 IO 来读写。方法加到了 File 类中。

var handler = File.OpenHandle("abc.txt");
var length = RandomAccess.GetLength(handler);

2. 强随机数

我们知道,以前的随机数 Random 类是弱随机数,来自于一个算法,并不能做到真正的随机。生成的随机数序列取决于种子,相同的种子会产生相同的随机数序列。

所以,为了取到不同的随机数序列,我们一般这么写:

var rand = new Random( (int)DateTime.Now.Ticks );

当然,一般这样也就够了。但总有特殊的,需要真正的随机数,即强随机数。Dotnet  6.0 里,提供了一个 RandomNumberGenerator 的类。

byte[] bytes = RandomNumberGenerator.GetBytes(200);
int randomInt = RandomNumberGenerator.GetInt32(0, 10000);

另外需要注意一下,这个类不在 System 空间下,而在 System.Security.Cryptography 里。

3. 多任务的异步 Parallel.ForEachAsync

在多任务中,以前只有一个 Parallel.ForEach 的方法,用来同步执行。这回终于把异步方法 Parallel.ForEachAsync 加进来了,足以可见微软在异步方面的深化决心。

写法还是我们很熟悉的方式,这个切换很容易:

var urls = new []
{"https://test1.com","https://test2.com"
};
var client = new HttpClient();
await Parallel.ForEachAsync(urls, async (url, token) =>
{HttpResponseMessage response = await client.GetAsync(url);
});

4. 定时中止异步

这也是个不错的 API。

以前当 await 异步进程时,如果这个进程长时间结束不了,我们只能通过 CancellationToken 来结束。现在,我们有了另一个方式,可以设置一个时间,以 Timeout 的方式结束这个异步进程。

Task someTask = SomeLongRunningTaskAsync();
await someTask.WaitAsync(TimeSpan.FromSeconds(10));

如果你写过 CancellationToken 结束异步的代码,就知道这个 WaitAsync 有多好。

5. ThrowIfNull

这个东西,其实跟上面判断参数是否为空是一件事。当我们在参数据后面加 !来进行为空判断时,实际就是执行的这一句:

public string FormatUser( User user )
{ArgumentNullException.ThrowIfNull( user );
}

如果对象为空,就抛出一个 ArgumentNullException。

6. 使用直接内存

在以前,使用 unsafe 内存 malloc 时,都是在堆上分配空间。现在有了一个在直接内存分配空间的方法:

using System.Runtime.InteropServices;
unsafe
{byte* buffer = (byte*)NativeMemory.Alloc(128);NativeMemory.Free(buffer);
}

做嵌入式开发,有福了。

另外,通常使用非托管内容,需要进行大小对齐。所谓对齐就是分配的空间的大小需要是 2 的整指数。通常大家就是算好直接硬写,现在也有了更灵活的方式:

using System.Numerics;uint bufferSize = 211;
if (!BitOperations.IsPow2(bufferSize))
{bufferSize = BitOperations.RoundUpToPowerOf2(bufferSize);
}

给一个空间,如果空间大小不是 2 的整指数,就找比这个数大的 2 的整指数。又省事了。

7. 新的计时器

好多文章都把这个计时器称为 Modern Timer,足以可见它的好。

好在哪?这是一个异步的计时器。

以前的计时器 Timer,不管是 System.Timers 下的,还是 System.Threading 下的,或是 System.Windows.Forms 下的,都是同步的计时器,需要用 Tick 的事件绑定来实现回调。这个方式让这个计时器十分依赖上级对象的生命周期,以至于在 UI 编程中,需要用 Invoke 来引入回调响应。

现在这个就简单很多了:

var timer = new PeriodicTimer(TimeSpan.FromSeconds(1));
while (await timer.WaitForNextTickAsync())
{/** ... **/
}

这个写法,看着就舒服。

写了很多,但实际上,也只是冰山的一小角。

想了解全部的内容,可以没事去泡泡 Dotnet 的社区,每天都有新东西,每天都有惊喜。

喜欢就来个三连,让更多人因你而受益

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

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

相关文章

在C#2.0中使用Nullable可空类型

在C#1.x的版本中,一个值类型变量是不可以被赋予null值的,否则会产生异常。在C#2.0中,微软提供了Nullable类型,允许用它定义包含null值(即空值)的数据类型,这对处理数据库中包含可选字段以及很多…

python版本差异_python的版本的差别 2,3

第一种 识别python语法执行python代码 x 上 python2 如果不指定文件头 中文没法存储 那是因为python2解释器识别语法存储数据的时候默认使用的是ASCII 如果指定了文件头 python2解释器识别语法存储数据的时候使用文件头指定的编码 python2中通常都会在中文的字符串前面加一个u…

豆瓣9.7,这些舍不得看完的神剧,看一集少一集!我刷了一晚上……

全世界只有3.14 % 的人关注了爆炸吧知识今天给大家介绍一位好朋友——小樱,小樱,作为资深美剧迷英语博主,收藏了很多经典美剧、动画资源,每天还会和大家分享新鲜有趣的英语知识。喜欢看美剧追动画和立志学好英语的小伙伴千万别错过…

C#编码规范

1、连接数据库并返回DataTable View Code public DataTable GetDataByTable() { DataSet dataset new DataSet(); DataTable datatable null; SqlConnection sqlConnection new SqlConnection("Data Source.;Initial CatalogCalamity_Dat…

12-15

12月14日晚9点才到无锡,棉袄都湿透了,到公寓那已经无力,天黑什么都看不清,到一个摆摊的阿姨买了根火腿肠,问了下路。买了点日用品,打扫了宿舍,折腾的很晚。12月15日,6点多就醒了&…

api中文文档 mws_中英文排版规范化 API

此文章对开放数据接口 API 之「中英文排版规范化 API」进行了功能介绍、使用场景介绍以及调用方法的说明,供用户在使用数据接口时参考之用。 1. 产品功能此次开放了中英文排版规范化在线接口,用于自动中英文排版、标点符号格式化,中英混排格式…

计算机管理无法连接虚拟磁盘服务,虚拟磁盘服务错误怎么操作【图文教程】

虚拟磁盘我们大家都可以看到但实际上是不存在的,虚拟的就是假的。虚拟磁盘是通过将一些网络文件或是内存利用科技手段伪造成磁盘,我们通常称它为虚拟磁盘。虚拟磁盘可以给内存增加容量,可以加快磁盘数据交换,提高计算机运行速度。…

记一次 .NET 某机械臂智能机器人控制系统MRS CPU爆高分析

一:背景 1. 讲故事这是6月中旬一位朋友加wx求助dump的故事,他的程序 cpu爆高➕UI卡死,问如何解决,截图如下:在拿到这个dump后,我发现这是一个关于机械臂的MRS程序,哈哈,在机械臂这种…

linux 信号_Linux中的信号处理机制 [四]

信号与线程Unix的信号机制在诞生之初,生活在只有进程(process)的相对单纯的环境中。自从Unix世界有了线程(thread)的概念,信号就被赋予了发往进程中某个特定线程的能力,当然,这也增加了整个信号机制实现的复杂度。本系列的前面三篇…

HP NIC Teaming技术探讨

NIC Teaming技术将2个或更多个网卡(HP NIC Teaming最多可达8个)捆绑在一起使用,以达到增加总的带宽(Load Balance,负载均衡)或者线路容错(Fault Tolerance)的目的。由2个或多个网卡组成一个逻辑网络端口Teamport,IP地址和网络设置绑定在这个逻…

仙居(一)

仙居(一) 仙居——仙人居住的地方。 景星岩全景 (看大图请点击) 其他图片在整理中,待我慢慢把图片和故事都理出来。转载于:https://www.cnblogs.com/hzy5901/archive/2011/03/31/5871611.html

我的电脑不联网,很安全!黑客:你还有风扇呢

全世界只有3.14 % 的人关注了爆炸吧知识转自:机器之心参与:张倩、蛋酱、杜伟从1988年第一个网络蠕虫病毒诞生以来,「互联网危机四伏」的观念就已经深入人心。如果只是这样,不给电脑联网、禁止使用任何可移动储存介质,数…

移动终端测试进化论

2019独角兽企业重金招聘Python工程师标准>>> 移动终端测试进化论 本案例主要以5年的现身经历,阐述针对移动互联网终端测试,从最基础的原始时代如何进入到现代化时代;从单一到多点密集;从对产品的质量保障进化到对产品信…

计算机视觉领域还有那些坑,深度学习/计算机视觉常见的8个错误总结及避坑指南...

人类并不是完美的,我们经常在编写软件的时候犯错误。有时这些错误很容易找到:你的代码根本不工作,你的应用程序会崩溃。但有些 bug 是隐藏的,很难发现,这使它们更加危险。在处理深度学习问题时,由于某些不确…

MySQL从原理到实践,一篇从头到尾讲清楚

前两天,我跟一个面试官聊天,发现一个普遍现象,不少候选人,对数据库的认知,还处在比较基础的阶段,以为会写“增删改查”、做表关联就足够了,那些工作中经常出现的问题,却支支吾吾答不…

库卡机器人是s7编程_「西门子1200PLC教程」19.S7-1200入门实例

头条号私信回复1,可免费获取海量资源下载链接本文任务:电动机启保停控制练习按下瞬时启动按钮I0.6,电动机Q0.0启动;按下瞬时停止按钮I0.7,电动机Q0.0停止。目录1.组态设备2.编写程序3.下载项目4.监视运行情况1.组态设备…

戴尔新版bios设置中文_戴尔电脑装机过程

戴尔电脑装机过程U盘制作过程:一:启动盘安装 win 101、准备工具:一块空的 8G 以上的 U 盘、一套官网下载的 win 10 操作系统 2、制作启动盘:将下载好的操作系统直接解压到U盘里面就完成了 二:pe 盘安装 win 101、准备工…

云计算

一 云计算 1 定义1)新兴的互联网服务,该服务即是由成千上万的超级计算机构成的超强的计算机处理能力。2)用户可以通过购买这种服务来满足本地对计算机运算能力需求。3)互联网服务商一般会通过与某些需要计算机运算能力的软件的集成…

一组超炫酷的动图,感受那让人窒息的数学之美!

全世界只有3.14 % 的人关注了爆炸吧知识在蒋迅博客上看到的一组图片,转自imgur。本文来源:蒋迅的博客原文连接:http://blog.sciencenet.cn/blog-420554-923731.html

《飞机大战》安卓游戏开发源码(三)

为什么80%的码农都做不了架构师?>>> 本文章属于原创性文章,珍惜他人劳动成果,转载请注明出处:http://www.pm-road.com/index.php/2014/11/06/161/ 前言:最 近闲来无事,而且也是因为刚接触安卓不…