一、前言
学习一门编程语言时,最开始接触到的往往不是复杂算法,而是一个个名字。
变量要有名字,函数要有名字,类要有名字,文件里各种声明也会不断出现名字。与此同时,我们还会遇到class、void、if、return这些看起来像单词,但又不能随便拿来当名字的内容。
这篇文章就把 Dart 中两个非常基础、但很容易混在一起的概念讲清楚:标识符与关键字。
如果把一段代码看成一篇文章,那么标识符就是我们自己起的名字,关键字就是 Dart 语言提前规定好的固定词汇。一个负责表达业务含义,一个负责组成语言语法。
二、一句话理解
标识符是开发者给变量、函数、类等程序元素起的名字;关键字是 Dart 语言保留的、有固定语法含义的单词。
简单说:
- 标识符:我们能起的名字。
- 关键字:语言已经占用的词。
- 写代码时:名字要清楚,关键字不能乱用。
三、什么是标识符
标识符就是代码中的“名字”。
在 Dart 中,变量名、函数名、类名、参数名等都属于标识符。它们的作用不是让编译器觉得好看,而是帮助我们区分不同的程序元素。
3.1 变量名
变量名用于标识一份数据。
void main() { String userName = 'Tom'; int userAge = 18; print(userName); print(userAge); }这里的userName和userAge就是标识符。它们分别表示用户名和用户年龄。
好的变量名应该能让人直接看出数据含义,而不是只能靠猜。
3.2 函数名
函数名用于标识一段可以被重复调用的逻辑。
void printUserName(String name) { print('用户名:$name'); }这里的printUserName是函数名,也是标识符。读到这个名字时,我们大致能知道它的作用是打印用户名。
3.3 类名
类名用于标识一类对象的抽象。
class UserInfo { String name; int age; UserInfo(this.name, this.age); }这里的UserInfo是类名,也是标识符。它表示“用户信息”这类数据结构。
类名通常使用大驼峰命名法,也就是每个单词首字母大写。
四、标识符命名规则
标识符不是想怎么写就怎么写,Dart 对它有明确规则。
4.1 可以包含哪些字符
Dart 标识符通常可以由字母、数字、下划线_和美元符号$组成。
void main() { String userName = 'Tom'; int age2 = 20; String _privateName = 'private'; }这些写法都是常见的合法标识符。
不过在实际开发中,$不建议随便用于普通命名。它更多出现在生成代码、框架内部或特殊场景里。
4.2 不能以数字开头
标识符可以包含数字,但不能以数字开头。
void main() { int age1 = 18; // 正确 // int 1age = 18; // 错误 }原因很简单:如果名字可以用数字开头,编译器在识别数字和变量名时就会变得混乱。
4.3 不能使用关键字
关键字已经被 Dart 语言占用,不能直接拿来做普通标识符。
void main() { // String class = 'Dart'; // 错误 String className = 'Dart'; // 正确 }class是 Dart 中用于声明类的关键字,所以不能直接作为变量名。
4.4 区分大小写
Dart 是区分大小写的语言。
void main() { String name = 'Tom'; String Name = 'Jerry'; print(name); print(Name); }name和Name是两个不同的标识符。
虽然语法允许这样写,但实际开发中不建议只靠大小写区分变量,否则阅读成本会很高。
五、Dart 常见命名规范
语法规则解决的是“能不能写”,命名规范解决的是“该不该这样写”。
5.1 变量和函数使用小驼峰
变量名、函数名通常使用小驼峰命名法:第一个单词小写,后续单词首字母大写。
String userName = 'Tom'; void getUserInfo() { print('获取用户信息'); }这种写法在 Dart 和 Flutter 项目中非常常见。
5.2 类名使用大驼峰
类名通常使用大驼峰命名法:每个单词首字母都大写。
class UserPage {} class LoginController {}类名表示的是一种类型,所以命名时要尽量使用名词或名词短语。
5.3 私有成员以下划线开头
Dart 中没有private这个访问修饰符。库级私有通常通过下划线_表示。
class UserService { String _token = ''; void _refreshToken() { print('刷新 token'); } }_token和_refreshToken表示它们只在当前库内可见。
这里要注意:下划线不是装饰,它在 Dart 中有实际访问控制含义。
六、什么是关键字
关键字是 Dart 语言提前定义好的特殊单词。
它们在语法中有固定含义,用来声明变量、定义类型、控制流程、处理异步、表达继承关系等。
6.1 声明相关关键字
声明相关关键字用于告诉 Dart:这里要定义某种程序结构。
class User {} void main() { var name = 'Tom'; final age = 18; const city = 'Shanghai'; }这里的class、void、var、final、const都是关键字。
它们不是普通名字,而是语法的一部分。
6.2 流程控制关键字
流程控制关键字用于控制代码执行路径。
void main() { int score = 90; if (score >= 60) { print('及格'); } else { print('不及格'); } }这里的if和else就是流程控制关键字。
类似的还有for、while、switch、case、break、continue、return等。
6.3 面向对象相关关键字
Dart 是面向对象语言,所以有一组和类、继承、接口相关的关键字。
class Animal { void eat() { print('eat'); } } class Cat extends Animal { @override void eat() { super.eat(); print('cat eat'); } }这里的class、extends、super都和面向对象有关。
@override严格来说是元数据注解,不是关键字,但它经常和重写方法一起出现,学习时可以顺手建立印象。
6.4 异步相关关键字
Dart 中的异步编程会用到async和await。
Future<void> loadData() async { await Future.delayed(Duration(seconds: 1)); print('数据加载完成'); }async表示这个函数中可能存在异步操作,await表示等待一个异步结果完成。
后续学习 Future、Stream、网络请求时,这两个词会频繁出现。
七、标识符和关键字的区别
标识符和关键字最容易混淆,因为它们看起来都是英文单词。
7.1 来源不同
标识符来自开发者命名。
String userName = 'Tom';这里的userName是我们自己起的名字。
关键字来自 Dart 语言定义。
final age = 18;这里的final是 Dart 已经规定好的词。
7.2 作用不同
标识符用于区分程序元素,比如变量、函数、类。
关键字用于表达语法结构,比如声明、判断、循环、返回。
可以这样理解:
- 标识符负责“这是谁”。
- 关键字负责“这里要做什么语法动作”。
7.3 是否能随便修改不同
标识符通常可以在合理范围内重命名。
String userName = 'Tom'; String nickName = 'Tom';只要同步修改引用位置,变量名可以调整。
关键字不能改。
// fin age = 18; // 错误 final age = 18; // 正确final必须写成 Dart 规定的样子,不能自己创造一个类似的词。
八、常见误区
8.1 只要能运行就是好名字
代码能运行,只说明语法没有错,不代表命名质量好。
void main() { int a = 18; String b = 'Tom'; }这段代码语法没问题,但a和b很难表达业务含义。
更好的写法是:
void main() { int userAge = 18; String userName = 'Tom'; }命名不是给机器看的,更多是给未来读代码的人看的。
8.2 用拼音命名更方便
学习阶段偶尔使用拼音可以理解,但长期开发不建议这样做。
String yongHuMing = 'Tom';这类命名会降低代码的统一性,也不利于团队协作。
更推荐:
String userName = 'Tom';技术代码里保持统一的英文命名,会让项目更容易维护。
8.3 关键字记不住就先死背
关键字不建议孤立死背。
更好的方式是把它放回使用场景里理解:
- 看到
class,想到定义类。 - 看到
if,想到条件判断。 - 看到
return,想到返回结果。 - 看到
async和await,想到异步等待。
关键字是随着代码场景不断熟悉的,不需要第一天全部背完。
九、总结
这一篇我们主要理解了 Dart 中的标识符与关键字。
标识符是我们给变量、函数、类等程序元素起的名字,它要符合 Dart 的命名规则,也要尽量表达清楚含义。
关键字是 Dart 语言提前规定好的特殊单词,它们有固定语法作用,不能随便拿来当普通名字使用。
学习 Dart 基础语法时,不要只停留在“这个词能不能写”的层面,还要继续追问:“这个名字是否清楚?”“这个关键字在语法中承担什么作用?”。
当你能分清标识符和关键字,也就开始真正理解代码中哪些部分由我们表达业务,哪些部分由语言规则来组织结构。