空安全简介
本课属于 Coddy Dart 学习旅程的“面向对象编程”单元。第 23 课,共 110 课。
编程中最常见的错误来源之一,是尝试使用不存在的值。在 Dart 中,这种特殊的“值缺失”用 null 表示。Dart 的空安全功能可以帮助你在代码运行之前就发现这些错误。
如果没有空安全,任何变量都可能是 null,因此当你尝试使用它时,可能会导致运行时崩溃:
// 在旧版 Dart 中(没有空安全机制)
String name; // 可能是 null!
print(name.length); // 如果 name 是 null,程序会崩溃启用空安全(Dart 2.12+)后,编译器会区分可以存储 null 的变量和不能存储 null 的变量。默认情况下,变量是不可为空的,也就是说,它们必须始终包含有效值:
String name = 'Alice'; // 必须有值
print(name.length); // 这样是安全的,因为 name 永远不会是 null如果一个不可空变量可能为 null,编译器就会拒绝编译这段代码。这样一来,错误检测就从运行时提前到了编译时,让你的程序更加可靠。在接下来的课中,你会学习如何在确实需要时声明可空类型,以及 Dart 提供了哪些运算符来安全地处理可能为 null 的值。
挑战
简单让我们构建一个简单的联系人卡片系统,展示非空变量的重要性。你将创建一个系统,确保每个联系人都有有效且可靠的信息。
你需要将代码分成两个文件:
contact.dart:定义一个表示个人联系信息的Contact类。由于我们要使用空安全,每个字段都必须有有效值,不允许缺少数据!你的类应包含:- 一个
String firstName,用于存储联系人的名字 - 一个
String lastName,用于存储联系人的姓氏 - 一个
String email,用于存储联系人的电子邮件地址 - 一个
int phoneDigits,用于存储联系人电话号码的位数 - 一个接收全部四个值的构造函数
- 一个
fullNamegetter,返回由名字和姓氏组成的全名,两者之间用空格隔开 - 一个用于打印联系人信息的
displayCard()方法
- 一个
main.dart:导入联系人类,并创建两个联系人,以展示所有字段都能保证有值:- 创建一个联系人,名字为
'Emma',姓氏为'Wilson',电子邮件为'emma@mail.com',电话号码位数为10 - 创建一个联系人,名字为
'James',姓氏为'Brown',电子邮件为'james@work.com',电话号码位数为11 - 按照上面列出的顺序,对每个联系人调用
displayCard()
- 创建一个联系人,名字为
displayCard() 方法应按以下确切格式打印:
--- Contact Card ---
Name: [fullName]
Email: [email]
Phone digits: [phoneDigits]注意,每个变量都必须用实际值初始化,这就是空安全的实际应用!编译器会确保你访问 fullName、email 或任何其他字段时,其中始终包含有效数据。
预期输出:
--- Contact Card ---
Name: Emma Wilson
Email: emma@mail.com
Phone digits: 10
--- Contact Card ---
Name: James Brown
Email: james@work.com
Phone digits: 11亲手试试
import 'contact.dart';
void main() {
// TODO:创建第一个联系人,信息如下:
// 名字:'Emma'
// 姓氏:'Wilson'
// 邮箱:'emma@mail.com'
// 电话号码位数:10
// TODO:创建第二个联系人,信息如下:
// 名字:'James'
// 姓氏:'Brown'
// 邮箱:'james@work.com'
// 电话号码位数:11
// TODO:按顺序对每个联系人调用 displayCard() 方法
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Dart 在线编译器