带你读《深入浅出Dart》二十、空安全

简介: 带你读《深入浅出Dart》二十、空安全

二十、空安全

更强的类型系统,更少的错误

近些年来,编程语言的类型安全性已经成为软件开发社区的一个主要焦点。通过利用类型安全,开发人员可以更好地预防错误,简化代码,并提高程序的整体性能和可靠性。Dart是一个被设计为安全、可扩展和高效的现代化编程语言,近期其发布了一项重要的更新:空安全。

1.空安全是什么?

空安全是指编程语言的类型系统能够区分可为空的类型和不能为空的类型。这种区别可以防止空引用错误(Null Reference Errors),也称为 "null pointer exceptions" 或 "the billion-dollar mistake"。空引全错误是软件开发中最常见的错误之一,它们在运行时发生,常常会导致程序的崩溃或其他严重的问题。

2.Dart 的空安全

Dart 2.12 版本引入了空安全。在引入空安全之前,Dart 任何对象都可以为空。然而,这种设计虽然看起来灵活,但实际上会引起很多问题,尤其是当开发者假设某个值不会为空,但实际上它为空时。由于这样的错误通常在运行时才会被检测到,所以它们通常很难发现和修复。

 

空安全通过在类型系统级别防止这种错误的发生。Dart 的空安全类型系统区分了可空类型和非空类型。例如,String 类型的对象不能为 null,而 String? 类型的对象可以为 null。Dart 会在编译时检查代码,确保所有的非空类型的变量在使用之前都已经被初始化,并且不会被赋值为 null。

3.如何在Dart中使用空安全?

使用Dart空安全主要涉及到两个方面:理解可空和非空类型,以及如何处理可能为空的值。

可空和非空类型

在空安全中,所有类型默认都是非空的。例如,如果你声明一个 String 类型的变量,Dart会假设它永远不会为空。如果你想声明一个可以为空的 String,你需要在类型后面加上 ?,如 String?

 

String nonNullableString = 'Hello, Dart!'; // 非空类型String? nullableString = null; // 可空类型

处理可空值

当你处理一个可能为空的值时,Dart 提供了几种方式来帮助你。例如,你可以使用 ?? 操作符来提供一个默认值,当变量为空时,将会使用这个默认值。

 

String? nullableString = null;String nonNullableString = nullableString ?? 'Default String'; // 如果nullableString为null,那么将使用'Default String'

 

另外,Dart 也提供了 ?. 操作符,允许你在对象为空时跳过方法调用或属性访问,避免抛出空引用错误。

String? nullableString = null;
int? length = nullableString?.length; // 如果nullableString为null,那么length也将为null

4.结论

Dart 的空安全特性为开发者提供了一个强大的工具,可以在编译时就捕获和修复可能的空引用错误。

 

相关文章
|
算法 前端开发 Java
在字节当了几个月的牛马,醒悟了。
以前也分享过不少实习体验,比如去年就分享了一位师弟的美团实习体验:美团实习三个月,我受益良多,今天来分享一下一位学习圈中学弟的字节实习体验。
636 0
|
XML Dubbo fastjson
FastJson - 设置默认参数,全局配置方式及爬坑
FastJson - 设置默认参数,全局配置方式及爬坑
2491 0
|
5月前
|
人工智能 自然语言处理 安全
OpenClaw是什么?2026年OpenClaw(Clawdbot)一键部署图文步骤流程
在AI自动化工具快速发展的当下,OpenClaw(曾用名Clawdbot、Moltbot)作为开源AI代理与自动化平台,凭借能通过自然语言控制设备、处理各类自动化任务,且兼容Qwen、Claude、GPT等主流大语言模型的特性,成为很多人搭建专属智能助手的优质选择。以往这类工具部署常需复杂的环境配置,对非专业用户不够友好。2026年,阿里云针对OpenClaw推出适配轻量服务器的一键部署方案,通过预置专属镜像简化了绝大部分操作流程。本文将详细拆解该部署的完整步骤,同时涵盖前置准备、参数配置、功能验证及常见问题排查,助力不同基础的用户顺利完成部署。
2301 3
|
10月前
|
安全 Java API
Java SE 与 Java EE 区别解析及应用场景对比
在Java编程世界中,Java SE(Java Standard Edition)和Java EE(Java Enterprise Edition)是两个重要的平台版本,它们各自有着独特的定位和应用场景。理解它们之间的差异,对于开发者选择合适的技术栈进行项目开发至关重要。
1539 1
|
资源调度 JavaScript API
vue-element-admin 综合开发五:引入 echarts,封装echarts 组件
这篇文章介绍了如何在vue-element-admin项目中引入并封装ECharts组件,以及如何实现折线图、柱状图和饼图的展示。
1800 4
vue-element-admin 综合开发五:引入 echarts,封装echarts 组件
|
数据采集 搜索推荐 API
LLM 联网搜索,到底是咋回事?
本文展示从零开始搭建一个本地聊天助手的过程,涵盖了模型部署、搜索逻辑设计、内容提取与整合等关键步骤,特别介绍了如何让模型具备联网搜索能力。
LLM 联网搜索,到底是咋回事?
|
安全 Java 测试技术
详解Spring Profiles:在Spring Boot中实现环境配置管理
详解Spring Profiles:在Spring Boot中实现环境配置管理
1822 10
|
XML JSON Java
springboot文件上传,单文件上传和多文件上传,以及数据遍历和回显
本文介绍了在Spring Boot中如何实现文件上传,包括单文件和多文件上传的实现,文件上传的表单页面创建,接收上传文件的Controller层代码编写,以及上传成功后如何在页面上遍历并显示上传的文件。同时,还涉及了`MultipartFile`类的使用和`@RequestPart`注解,以及在`application.properties`中配置文件上传的相关参数。
springboot文件上传,单文件上传和多文件上传,以及数据遍历和回显
|
机器学习/深度学习 数据采集 人工智能
【机器学习】非线性回归与线性回归有何不同?
【5月更文挑战第19天】【机器学习】非线性回归与线性回归有何不同?
Flutter笔记:Opacity、Offstage和Visibility可见性的比较
Flutter笔记:Opacity、Offstage和Visibility可见性的比较
909 0