zoukankan      html  css  js  c++  java
  • Dart空安全的底层原理与适配

    一、在空安全推出之前,静态类型系统允许所有类型的表达式中的每一处都可以有 null。

    从类型理论的角度来说,Null 类型被看作是所有类型的子类;


    类型会定义一些操作对象,包括 getters、setters、方法和操作符,在表达式中使用。

    如果是 List 类型,您可以对其调用 .add() 或 []。

    如果是 int 类型,您可以对其调用 +。

    但是 null 值并没有它们定义的任何一个方法。

    所以当 null 传递至其他类型的表达式时,任何操作都有可能失败。

    这就是空引用的症结所在—所有错误都来源于尝试在 null 上查找一个不存在的方法或属性

    二、非空和可空类型

    空安全通过修改了类型的层级结构,从根源上解决了这个问题。Null 类型仍然存在,但它不再是所有类型的子类。现在的类型层级看起来是这样的:


    既然 Null 已不再被看作所有类型的子类,那么除了特殊的 Null 类型允许传递 null 值,其他类型均不允许。

    我们已经将所有的类型设置为默认不可空的类型。如果您的变量是 String 类型,它必须包含一个字符串。这样一来,我们就修复了所有的空引用错误。

    三、引入空安全后的类型顶层设计

    四、空安全的适配

    类型默认是非空的,可以添加 ? 变为可空的。

    可选参数必须是可空的或者包含默认值的。您可以使用 required 来构建一个非可选命名参数。非空的全局变量和静态字段必须在声明时被初始化。实例的非空字段必须在构造体开始执行前被初始化。

    如果接收者为 null,那么在其避空运算符之后的链式方法调用都会被截断。我们引入了新的空判断级联操作符 (?..) 及索引操作符 (?[])。后缀空断言“重点”操作符 (!) 可以将可空的操作对象转换为对应的非空类型。

    新的流程分析,让您更安全地将可空的局部变量和参数,转变为可用的非空类型。它同时还对类型提升、遗漏的返回、不可达的代码以及变量的初始化,有着更为智能的规则。

    late修饰符以在运行时每次都进行检查的高昂代价,让您在一些原本无法使用的地方,能够使用非空类型和 final。它同时提供了对字段延迟初始化的支持。

    List 类现在不再允许包含未初始化的元素。

  • 相关阅读:
    The xp_cmdshell proxy account information cannot be retrieved or is invalid. Verify that the '##xp_cmdshell_proxy_account##' credential exists and contains valid information.
    SQL SERVER-创建Alwayson
    Powershell-远程操作
    powershell-将powershell脚本排到JOB
    powershell-脚本运行权限政策
    Winserver-默认以管理员运行程序
    Powershell-创建Module
    SQL SERVER-查询爆破sa密码的主机
    power-virus
    141.Linked List Cycle 快慢指针
  • 原文地址:https://www.cnblogs.com/jukaiit/p/15008963.html
Copyright © 2011-2022 走看看