与其他的本地方法不同,静态的本地方法无法捕获任何本地状态量。

直接看例子:

这段代码里有两个本地方法,他们分别对实例的一个字段和方法里的一个本地变量进行了修改操作,也就是捕获并更新了本地的状态。

其运行结果是:

可以看到类的成员字段和方法本地变量的状态都被这两个本地方法修改了。。

但是很多情况下,你并不希望类的实例字段和方法本地变量的值被捕获或修改。在C# 8里面,你可以使用静态本地方法来达到这个目的。

其做法很简单,就是在原来这两个本地方法前面加上static关键字即可:

可以看到程序报错了,这是因为静态本地方法是不可以访问和捕获实例的状态的,包括实例成员和方法本地变量。

针对第一个本地方法,我直接把更新本地变量的语句去掉:

而针对第二个本地方法,如果你真的想修改实例成员的状态,那么就需要把成员改为静态的:

其运行结果是:

优点

C# 8的这个特性对可读性其实没有特别大的帮助,但是它却可以防止本地方法捕获实例状态,在一些情况下,这对性能有很大的帮助。

Disposable ref Structs

C# 7.2 里面出现了ref struct,但是它的缺点就是不可以实现接口。

看这个例子:

这个struct里面包含了一个不安全(unsafe)资源,当我用完之后,这个资源是需要被清理掉的。

在C# 8之前,我们无法针对这个struct使用using语句,因为这个struct无法实现IDisposable接口。

但是从C# 8开始,ref struct无需实现IDisposable接口也可以使用using语句或者using声明,只要它提供了适当的方法即可。如下图:

然后我们就可以使用using语句了:

或者using声明:

 
 

只读struct成员

从C# 8开始,我们可以在struct的成员上使用readonly修饰符。

为struct的成员添加readonly修饰符就表示告诉编译器和开发者该成员不可以修改struct的状态。

看下面这个例子:

这里的ToString()方法不会修改Point这个struct的状态,所以我们可以在该方法上添加readonly修饰符来表示其只读:

但是这里会出现警告,因为 ToString 访问了未标记为 readonly 的 Distance 属性。也就是需要创建防御性副本时,编译器会发出警告。

由于Distance属性不会修改状态,所以可以在它前边加上readonly修饰符以修复此警告:

请注意,readonly 修饰符对于只读属性是必须要添加的。 编译器会假设 get 访问器可以修改状态;所以必须显式声明 readonly。

但是自动实现的属性则是一个例外;编译器将所有自动实现的 Getter 视为 readonly,因此,此处无需向 X 和 Y 属性添加 readonly 修饰符。

如果我在该struct里面再添加一个修改状态的方法:

由于该方法确实修改了struct的状态,所以如果在该方法上再加上readonly修饰符的话,编译器就会报错。

而如果我把readonly修饰符去掉的话,那么就不会报错了:

 
非托管构造类型

在C#里面,类型可以分为托管类型和非托管类型。在之前的.NET版本中,只有内置的值类型、枚举类型和仅包含非托管类型成员的struct等这些类型才可以是非托管类型。其中内置的值类型有:

  • byte

  • int

  • char

  • float

  • bool

而构造类型(指包含至少一个类型参数的类型)不能为非托管类型。

看下面这个泛型struct:

在C# 7里,无论这里的T是int还是object,该类型都不可以是非托管类型,即使T是一个非托管类型。

而在C# 8里,如果构造类型的所有类型参数都是非托管类型的,那么这个构造类型就是非托管的。

所以Coords<int> 类型在 C# 8.0 及更高版本中是非托管类型。但是Coords<object>仍然是托管的。

Null 合并赋值

看例子。

在C# 8之前,我们可以通过如下代码来保证numbers被初始化:

但是从C# 8开始,我们可以更简单的表达我们的意思:

这个特性带来的好处是,在变量名不是特别短小精悍的情况下,会少打很多字符。

内插逐字字符串的增强功能

C# 8里,针对内插逐字字符串的功能做了一点点增强。

在C# 8之前,这样写是没毛病的:

但是这样写就不行:

但是从C# 8开始,两种写法都是正确的:

都不会报错了。

C# 8 - 其它新特性的更多相关文章

  1. SQL Server 2014 新特性——内存数据库

    SQL Server 2014 新特性——内存数据库 目录 SQL Server 2014 新特性——内存数据库 简介: 设计目的和原因: 专业名词 In-Memory OLTP不同之处 内存优化表 ...

  2. ElasticSearch 5学习(10)——结构化查询(包括新特性)

    之前我们所有的查询都属于命令行查询,但是不利于复杂的查询,而且一般在项目开发中不使用命令行查询方式,只有在调试测试时使用简单命令行查询,但是,如果想要善用搜索,我们必须使用请求体查询(request ...

  3. [干货来袭]C#6.0新特性

    微软昨天发布了新的VS 2015 ..随之而来的还有很多很多东西... .NET新版本 ASP.NET新版本...等等..太多..实在没消化.. 分享一下也是昨天发布的新的C#6.0的部分新特性吧.. ...

  4. CSS3新特性应用之结构与布局

    一.自适应内部元素 利用width的新特性min-content实现 width新特性值介绍: fill-available,自动填充盒子模型中剩余的宽度,包含margin.padding.borde ...

  5. 【译】Meteor 新手教程:在排行榜上添加新特性

    原文:http://danneu.com/posts/6-meteor-tutorial-for-fellow-noobs-adding-features-to-the-leaderboard-dem ...

  6. 跨平台的 .NET 运行环境 Mono 3.2 新特性

    Mono 3.2 发布了,对 Mono 3.0 和 2.10 版本的支持不再继续,而且这两个分支也不再提供 bug 修复更新. Mono 3.2 主要新特性: LLVM 更新到 3.2 版本,带来更多 ...

  7. Atitit opencv版本新特性attilax总结

    Atitit opencv版本新特性attilax总结 1.1. :OpenCV 3.0 发布,史上功能最全,速度最快的版1 1.2. 应用领域2 1.3. OPENCV2.4.3改进 2.4.2就有 ...

  8. es6 新特性2

    es6其他几个非常有用的新特性. import export 这两个家伙对应的就是es6自己的module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成 ...

  9. ES6 新特性

    ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015. 也就是说,ES6就是ES2015. ...

  10. 谈谈我的微软特约稿:《SQL Server 2014 新特性:IO资源调控》

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 撰写经历(Experience) 特约稿正文(Content-body) 第一部分:生活中资源 ...

随机推荐

  1. springboot 整合ehcache缓存

    1.CacheManager Spring Boot默认集成CacheManager,如下包所示: 可以看出springboot自动配置了 JcacheCacheConfiguration. EhCa ...

  2. 利用百度云接口实现车牌识别·python

    一个小需求---实现车牌识别. 目前有两个想法 1. 调云在线的接口或者使用SDK做开发(配置环境和变异第三方库麻烦,当然使用python可以避免这些问题) 2. 自己实现车牌识别算法(复杂) 一开始 ...

  3. python线程实现异步任务

    了解异步编程 楼主在工作中遇到了以下问题,开发接口爬取数据代码完成之后要写入redis缓存,但是在写入缓存的过程花费2-3s,进行这样就大大影响了接口的性能,于是想到了使用异步存储. 传统的同步编程是 ...

  4. H5刮刮卡效果

    效果图: 核心就是使用ctx.globalCompositeOperation = 'destination-out'; 全部代码: <!DOCTYPE html> <html> ...

  5. 开发电商平台用PHP语言和JAVA语言有什么区别?哪种语言更好?

    现在很多行业都通过电子商务拓展业务,所以商城系统开发成为很多企业的刚性需求.一般有一点技术基础的客户应该知道目前商城系统开发主流语言有两个,PHP和Java.那么很多客户朋友会纠结是选择哪个语言开发好 ...

  6. css 实现图片灰度

    先看效果鼠标移入图片中摁下向左移动 图片由灰度变为原图   向右移动原图变灰度 ​ 代码如下:尚未做优化 <style> *{ margin:0; padding:0; } #img{ w ...

  7. 利用C++实现模块隐藏(R3层断链)

    一.模块隐藏的实现原理 普通API查找模块实现思路:其通过查询在R3中的PEB(Process Environment Block 进程环境块)与TEB(Thread Environment Bloc ...

  8. 关于Git的使用方法

    1.查看Git的使用方法 : git 2.把当前文件夹变为一个git仓库 创建git仓库:git init 3.查看当前仓库文件变化情况:git status 4.添加修改:git add (可使用g ...

  9. 编程杂谈——std::vector与List<T>的性能比较

    昨天在比较完C++中std::vector的两个方法的性能差异并留下记录后--编程杂谈--使用emplace_back取代push_back,今日尝试在C#中测试对应功能的性能. C#中对应std:: ...

  10. python 安装pyqt

    ---恢复内容开始--- 一.安装 1.官网:www.riverbankcomputing.com 2.使用命令安装,可以自动去官网查找与Python版本号相同的程序进行下载,比较方便,如果不是这样也 ...