前言
标识符用于命名变量、函数、类、库和其他编程元素。Dart的标识符遵循特定的规则和约定,以确保代码的可读性和一致性。
关键字用于定义语法结构、控制流程和声明类型等。
操千曲而后晓声,观千剑而后识器。虐它千百遍方能通晓其真意。
一、标识符
1.1、命名规则
1.1.1、字母或下划线开头
- 标识符必须以
字母(a-z或A-Z)或下划线(_)开头。
1.1.2、后续字符
- 后续字符可以是
字母、数字(0-9)或下划线。
1.1.3、区分大小写
name和Name是两个不同的标识符。
1.1.4、不能使用关键字
- 标识符
不能与Dart的保留关键字相同。
示例代码:
// 合法的标识符
int myVariable = 42;
String _privateVariable = "This is private";
void calculateSum() {}
class MyClass {}
enum Color { red, green, blue }
// 非法的标识符
int 1variable = 42; // 不能以数字开头
int class = 42; // 'class' 是关键字
int @symbol = 42; // '@' 不是合法字
1.2、命名约定
虽然Dart没有强制性的命名约定,但遵循社区推荐的命名约定可以使代码更易读和维护。
1.2.1、驼峰命名法(Camel Case)
- 变量和方法:首字母小写,后续单词首字母大写。
int myVariable = 42;
void calculateSum() {}
1.2.2、帕斯卡命名法(Pascal Case)
- 类、枚举、类型别名:每个单词首字母大写。
class MyClass {}
enum Color { Red, Green, Blue }
1.2.3、全小写加下划线
- 常量和全局变量:全部小写字母,单词之间用下划线连接。
const int max_value = 100;
final String app_name = "My App";
1.2.4、私有成员
- 以下划线开头:表示该成员是私有的,仅在定义它的库中可见。
int _privateVariable = 42;
void _privateMethod() {}
1.2.5、特殊标识符
- 下划线(_):单个下划线 _ 可以用作占位符,表示不需要使用的变量或参数。
void ignoreValue(_) {
// 忽略传入的值
}
// 调用时忽略返回值
ignoreValue(42);
1.2.6、内置标识符
Dart 有一些内置的标识符,它们具有特殊的含义或用途:
this:引用当前实例。super:引用父类实例。new:创建对象实例(Dart 2.0 之后可选)。null:表示空值。true和false:布尔常量。
示例代码:
// 使用不同的命名约定
int myVariable = 42;
String _privateVariable = "This is private";
void calculateSum(int a, int b) => print(a + b);
class MyClass {
String name;
MyClass(this.name);
void sayHello() {
print("Hello, my name is $name.");
}
// 私有方法
void _privateMethod() {
print("This is a private method.");
}
}
// 常量和全局变量
const int MAX_VALUE = 100;
final String APP_NAME = "My App";
// 枚举
enum Color { Red, Green, Blue }
void main() {
MyClass myObject = MyClass("Alice");
myObject.sayHello();
// 使用枚举
Color favoriteColor = Color.Red;
print(favoriteColor);
// 忽略值
ignoreValue(42);
}
void ignoreValue(_) {
// 忽略传入的值
}
二、关键字
2.1、基本类型关键字
用于定义基本的数据类型。
num:数值类型。int:整数类型。double:浮点数类型。String:字符串类型。bool:布尔类型(true或false)。dynamic:动态类型,表示可以是任何类型。void:无返回值类型。
2.2、变量声明关键字
用于声明变量和常量。
var:声明一个类型推断的变量。final:声明一个只能赋值一次的变量(编译时常量或运行时常量)。const:声明一个编译时常量,其值在编译时确定且不可改变。
2.3、控制流关键字
用于控制程序的执行流程。
if和else:条件语句。switch和case:多分支选择语句。for和while:循环语句。do:先执行后判断的循环语句。break:跳出当前循环或switch语句。ontinue:跳过当前循环的剩余部分,继续下一次循环。return:从函数中返回值并结束函数执行。
2.4、函数和方法关键字
用于定义函数、方法和匿名函数。
function:定义函数(通常省略不写)。=>:箭头函数语法,用于单行表达式函数体。async和await:用于异步编程。sync和async:用于生成同步和异步流(Stream)。
2.5、类和对象关键字
用于定义类、接口、枚举和扩展类。
class:定义一个类。extends:用于继承父类。implements:实现接口。with:混入(mixin)其他类的功能。enum:定义枚举类型。typedef:定义类型别名。external:声明外部实现的方法或变量。abstract:定义抽象类或方法。factory:定义工厂构造函数。get和set:定义属性的getter和setter方法。operator:重载操作符。
2.6、异常处理关键字
用于处理程序中的异常。
try:尝试执行可能抛出异常的代码块。catch:捕获异常。finally:无论是否抛出异常都会执行的代码块。throw:抛出异常。
2.7、库和导入关键字
用于管理库和导入模块。
library:定义一个库。import:导入其他库或模块。export:导出库中的成员供其他库使用。part和part of:用于分拆大型库为多个文件。
2.8、元数据关键字
用于为声明附加额外信息。
@:用于元数据注释,如@override、@deprecated等。metadata:定义元数据。
2.9、其他关键字
用于特定用途。
covariant:用于参数协变,允许子类覆盖父类方法时使用更具体的参数类型。late:延迟初始化变量,在首次访问时才进行初始化。rethrow:重新抛出捕获到的异常。
示例代码:
// 基本类型
int age = 30;
double height = 1.75;
String name = "Alice";
bool isStudent = true;
// 变量声明
var message = "Hello, World!";
final pi = 3.14;
const gravity = 9.8;
// 控制流
if (age >= 18) {
print("Adult");
} else {
print("Minor");
}
// 函数和方法
void greet(String name) => print("Hello, $name");
// 类和对象
class Person {
String name;
int age;
Person(this.name, this.age);
void sayHello() {
print("Hello, my name is $name and I am $age years old.");
}
}
// 异常处理
try {
// 可能抛出异常的代码
} catch (e) {
// 捕获异常
} finally {
// 总是执行的代码
}
// 库和导入
import 'dart:math';
// 元数据
class Calculator {
@override
String toString() => '这是一个计算器';
}
三、总结
理解 Dart 的标识符规则和命名约定对于编写清晰、一致且易于维护的代码至关重要。通过遵循这些规则和约定,可以确保代码的可读性和可靠性。
通过分类整理 Dart 的关键字,可以更好地理解每个关键字的作用和适用场景。合理使用这些关键字可以编写出更加清晰、简洁和高效的代码。
码字不易,记得 关注 + 点赞 + 收藏 + 评论