现在位置: 首页 > Dart 教程 > 正文

Dart 基础语法

每种编程语言都有自己的一套基本规则,Dart 也不例外。

本章介绍 Dart 程序的基本结构、注释写法、语句与表达式的区别,以及标识符的命名规范。


程序结构与 main() 函数

每个 Dart 程序都必须有一个入口点——main() 函数。

程序从 main() 函数的第一行开始执行,到最后一行的花括号结束。

实例

一个最简 Dart 程序的结构:

// 程序入口:main() 函数是 Dart 程序的起点
void main() {
  // 在这里编写你的代码
  print('欢迎来到 RUNOOB Dart 教程!');
}
欢迎来到 RUNOOB Dart 教程!

让我们拆解这段代码的每个部分:

代码元素说明
void返回值类型,void 表示该函数不返回任何值
main函数名,这是 Dart 规定的入口函数名,不可更改
()参数列表,main() 可以不接收参数,也可以接收命令行参数
{ }函数体,花括号内的代码是函数执行的内容
print()内置函数,用于向控制台输出文本
;语句结束符,Dart 中每条语句必须以分号结尾

Dart 严格要求每条语句以分号(;)结尾。忘记分号是初学者最常见的语法错误。好在 VS Code 的 Dart 插件会自动提示缺少分号的位置。

带命令行参数的 main() 函数

main() 函数可以接收一个字符串列表作为命令行参数:

实例

// List<String> args 接收命令行传入的参数列表
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)

表达式是一段可以被求值的代码,它会产出一个值。

实例

void main() {
  // 以下每行都是一个表达式,它们都产出一个值
  42;              // 字面量表达式,值为 42
  3 + 5;           // 算术表达式,值为 8
  'Hello'.length;  // 属性访问表达式,值为 5
  (10 > 5);        // 关系表达式,值为 true
}

语句(Statement)

语句是执行某个动作的指令,它不产出值。

实例

void main() {
  // 变量声明语句:声明一个变量并赋值
  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 社区的独特风格,请务必注意。