Dart 基础语法
每种编程语言都有自己的一套基本规则,Dart 也不例外。
本章介绍 Dart 程序的基本结构、注释写法、语句与表达式的区别,以及标识符的命名规范。
程序结构与 main() 函数
每个 Dart 程序都必须有一个入口点——main() 函数。
程序从 main() 函数的第一行开始执行,到最后一行的花括号结束。
实例
一个最简 Dart 程序的结构:
void main() {
// 在这里编写你的代码
print('欢迎来到 RUNOOB Dart 教程!');
}
欢迎来到 RUNOOB Dart 教程!
让我们拆解这段代码的每个部分:
| 代码元素 | 说明 |
|---|---|
| void | 返回值类型,void 表示该函数不返回任何值 |
| main | 函数名,这是 Dart 规定的入口函数名,不可更改 |
| () | 参数列表,main() 可以不接收参数,也可以接收命令行参数 |
| { } | 函数体,花括号内的代码是函数执行的内容 |
| print() | 内置函数,用于向控制台输出文本 |
| ; | 语句结束符,Dart 中每条语句必须以分号结尾 |
Dart 严格要求每条语句以分号(;)结尾。忘记分号是初学者最常见的语法错误。好在 VS Code 的 Dart 插件会自动提示缺少分号的位置。
带命令行参数的 main() 函数
main() 函数可以接收一个字符串列表作为命令行参数:
实例
void main(List<String> args) {
// 输出参数个数
print('参数个数:${args.length}');
// 遍历并打印每个参数
for (var i = 0; i < args.length; i++) {
print('参数 $i: ${args[i]}');
}
}
$ dart run hello.dart runoob dart 教程 参数个数:3 参数 0: runoob 参数 1: dart 参数 2: 教程
这里用到了 List 类型和 for 循环,我们会在后续章节详细介绍。
注释写法
注释是对代码的解释说明,编译器会忽略注释内容。
好的注释能让别人(包括几个月后的你自己)更快理解代码的意图。
Dart 支持三种注释方式:
| 类型 | 语法 | 适用场景 |
|---|---|---|
| 单行注释 | // 注释内容 | 简短说明某一行代码的作用 |
| 多行注释 | /* 注释内容 */ | 跨多行的详细说明 |
| 文档注释 | /// 文档注释 | 为函数、类生成 API 文档 |
实例
/// 文档注释可以用 [dart doc] 命令生成 HTML 文档
void main() {
// 单行注释:输出欢迎信息
print('欢迎学习 Dart!'); // 行内注释:这也是合法的
/*
* 多行注释:适合写较长的说明
* 第二行注释
* 第三行注释
*/
print('RUNOOB 教程 - Dart 基础语法');
}
欢迎学习 Dart! RUNOOB 教程 - Dart 基础语法
注释的原则是"解释为什么,而不是做了什么"。代码本身已经说明了做了什么,注释应该解释为什么这样写,或者补充代码无法表达的背景信息。
语句与表达式
在 Dart 中,代码由语句(Statement)和表达式(Expression)组成。
理解两者的区别有助于你更好地组织代码逻辑。
表达式(Expression)
表达式是一段可以被求值的代码,它会产出一个值。
实例
// 以下每行都是一个表达式,它们都产出一个值
42; // 字面量表达式,值为 42
3 + 5; // 算术表达式,值为 8
'Hello'.length; // 属性访问表达式,值为 5
(10 > 5); // 关系表达式,值为 true
}
语句(Statement)
语句是执行某个动作的指令,它不产出值。
实例
// 变量声明语句:声明一个变量并赋值
var name = 'RUNOOB';
// 函数调用语句:调用 print() 执行输出动作
print(name);
// 控制流语句:根据条件决定执行哪段代码
if (name.length > 3) {
print('名称长度大于 3');
}
}
RUNOOB 名称长度大于 3
简单来说:表达式产生值,语句执行动作。
你可以在需要值的地方使用表达式,但不能使用语句。
一个常见的误区是把所有代码都当成"语句"。实际上,Dart 中很多结构(如函数调用、变量赋值)本身就是表达式,这意味着它们可以被嵌套使用。这是 Dart 和其他 C 系语言的共同特点。
标识符命名规范
标识符(Identifier)是你给变量、函数、类等代码元素起的名字。
Dart 对标识符有一些规则和约定:
命名规则(必须遵守)
标识符只能由字母、数字、下划线(_)和美元符号($)组成。
标识符不能以数字开头。
标识符不能是 Dart 的保留关键字(如 class、if、var 等)。
命名约定(推荐遵守)
| 代码元素 | 命名风格 | 示例 |
|---|---|---|
| 类名 | 大驼峰(UpperCamelCase) | StudentInfo、HttpClient |
| 枚举类型 | 大驼峰(UpperCamelCase) | Color、Status |
| 库名、文件名 | 小写 + 下划线(lowercase_with_underscores) | my_utils、user_service |
| 变量名 | 小驼峰(lowerCamelCase) | userName、maxCount |
| 函数名 | 小驼峰(lowerCamelCase) | getUserInfo()、calculateTotal() |
| 常量名 | 小驼峰(lowerCamelCase) | piValue、defaultPort |
| 私有成员 | 下划线前缀 | _internalState、_privateMethod() |
实例
各种命名风格的实际应用:
class UserAccount {
// 公开成员:小驼峰
String userName;
// 私有成员:下划线前缀(只在本文件中可访问)
String _password;
// 构造函数
UserAccount(this.userName, this._password);
// 公开方法:小驼峰
bool verifyPassword(String input) {
return input == _password;
}
// 私有方法:下划线前缀
void _encryptPassword() {
// 加密逻辑...
}
}
// 入口函数:小写
void main() {
// 变量名:小驼峰
var userAccount = UserAccount('runoob', '123456');
// 常量:小驼峰(Dart 风格)
const maxLoginAttempts = 3;
print('用户名: ${userAccount.userName}');
print('最大登录尝试次数: $maxLoginAttempts');
}
用户名: runoob 最大登录尝试次数: 3
Dart 的命名约定中,常量使用小驼峰(lowerCamelCase),而不是其他语言常见的全大写+下划线(UPPER_CASE)。这是 Dart 社区的独特风格,请务必注意。
