Dart空安全的底层原理与适配
一、在空安全推出之前,静态类型系统允许所有类型的表达式中的每一处都可以有 null。
从类型理论的角度来说,Null 类型被看作是所有类型的子类;
类型会定义一些操作对象,包括 getters、setters、方法和操作符,在表达式中使用。
如果是 List 类型,您可以对其调用 .add() 或 []。
如果是 int 类型,您可以对其调用 +。
但是 null 值并没有它们定义的任何一个方法。
所以当 null 传递至其他类型的表达式时,任何操作都有可能失败。
这就是空引用的症结所在—所有错误都来源于尝试在 null 上查找一个不存在的方法或属性。
二、非空和可空类型
空安全通过修改了类型的层级结构,从根源上解决了这个问题。Null 类型仍然存在,但它不再是所有类型的子类。现在的类型层级看起来是这样的:
既然 Null 已不再被看作所有类型的子类,那么除了特殊的 Null 类型允许传递 null 值,其他类型均不允许。
我们已经将所有的类型设置为默认不可空的类型。如果您的变量是 String 类型,它必须包含一个字符串。这样一来,我们就修复了所有的空引用错误。
三、引入空安全后的类型顶层设计
四、空安全的适配
类型默认是非空的,可以添加 ? 变为可空的。
可选参数必须是可空的或者包含默认值的。您可以使用 required 来构建一个非可选命名参数。非空的全局变量和静态字段必须在声明时被初始化。实例的非空字段必须在构造体开始执行前被初始化。
如果接收者为 null,那么在其避空运算符之后的链式方法调用都会被截断。我们引入了新的空判断级联操作符 (?..) 及索引操作符 (?[])。后缀空断言“重点”操作符 (!) 可以将可空的操作对象转换为对应的非空类型。
新的流程分析,让您更安全地将可空的局部变量和参数,转变为可用的非空类型。它同时还对类型提升、遗漏的返回、不可达的代码以及变量的初始化,有着更为智能的规则。
late修饰符以在运行时每次都进行检查的高昂代价,让您在一些原本无法使用的地方,能够使用非空类型和 final。它同时提供了对字段延迟初始化的支持。
List 类现在不再允许包含未初始化的元素。
最新文章
- STL
- CentOS7源码编译安装Postgresql9.5
- 《深入浅出Node.js》第6章 理解 Buffer
- php生成excle
- git在本地仓库直接使用rm彻底删除文件,服务端还是存在
- 运行基准测试hadoop集群中的问题:org.apache.hadoop.ipc.RemoteException: java.io.IOException: File /benchmarks/TestDFSIO/io_data/test_
- JavaScript的My97Date日期工具类的使用
- Web Service 的服务端的引用
- python 字符串(汉语)获得MD5编码
- 前台跨站点获取session
- linux,shell脚本set -x的意思
- python代码格式
- 泊爷带你学go -- redis连接池的操作
- 人生苦短:Python里的17个“超赞操作
- Python和Java编程题(五)
- SURF算法
- iOS性能优化技巧
- window.open 浏览器差异.
- 很赞的idea教程
- 安卓上为什么不能用system.io.file读取streammingAssets目录下的文件
热门文章
- Whitzard OJ Introduce to packing
- 『动善时』JMeter基础 — 55、JMeter非GUI模式运行
- Django基础-002 Models的属性与字段
- 备战-Java 并发
- nacos配置本地多个实例(伪集群)
- react-router 基本使用
- 使用vue-preview报错Cannot read property 'open' of undefined
- python + pytest基本使用方法(运行测试&;测试报告)
- vulnhub-DC:2靶机渗透记录
- 第三篇--如何修改exe文件版本号和文件信息