Menu
CoddyTech

空安全简介

本课属于 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 的值。

challenge icon

挑战

简单

让我们构建一个简单的联系人卡片系统,展示非空变量的重要性。你将创建一个系统,确保每个联系人都有有效且可靠的信息。

你需要将代码分成两个文件:

  • contact.dart:定义一个表示个人联系信息的 Contact 类。由于我们要使用空安全,每个字段都必须有有效值,不允许缺少数据!你的类应包含:
    • 一个 String firstName,用于存储联系人的名字
    • 一个 String lastName,用于存储联系人的姓氏
    • 一个 String email,用于存储联系人的电子邮件地址
    • 一个 int phoneDigits,用于存储联系人电话号码的位数
    • 一个接收全部四个值的构造函数
    • 一个 fullName getter,返回由名字和姓氏组成的全名,两者之间用空格隔开
    • 一个用于打印联系人信息的 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() 方法
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Dart 在线编译器