一、前言学习一门编程语言时最开始接触到的往往不是复杂算法而是一个个名字。变量要有名字函数要有名字类要有名字文件里各种声明也会不断出现名字。与此同时我们还会遇到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。Futurevoid 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 基础语法时不要只停留在“这个词能不能写”的层面还要继续追问“这个名字是否清楚”“这个关键字在语法中承担什么作用”。当你能分清标识符和关键字也就开始真正理解代码中哪些部分由我们表达业务哪些部分由语言规则来组织结构。