Skip to content

类型

Dart 是一种强类型语言,具有灵活的类型系统。

基本类型

Dart 提供了多种内置类型,用于处理常见的数据和功能。

常见内置类型

数值类型

  • int:表示整数。
  • double:表示浮点数。
dart
int age = 30;
double price = 19.99;

字符串类型

  • String:用于表示文本。
dart
String name = 'Dart';

布尔类型

  • bool:值为 truefalse
dart
bool isActive = true;

空类型

  • Null:表示没有值,常用于表示空状态。
  • void:表示函数没有返回值。
dart
void sayHello() {
print('Hello');
}

动态类型

  • dynamic

dynamic 是一种特殊类型,它禁用静态类型检查。当你将一个变量声明为动态变量时,你可以给它赋任何类型的值,编译器不会检查类型错误。

它允许更大的灵活性,但牺牲了类型安全性。这意味着使用 dynamic 时,类型检查是在运行时进行的。如果你在编译时没有捕获到类型错误,这些错误可能会在运行时抛出。

  • Object

Object 是 Dart 中所有对象的基类,它是所有 Dart 类的超类。Object 类型的变量可以存储任何类型的值。

使用 Object 类型时,类型检查会更加严格。例如,如果你将一个 String 赋值给一个 Object 类型的变量,但试图将其作为 int 使用,会在运行时抛出异常。

dart
void exampleWithObject() {
  Object obj = 'Hello, World!';
  // obj = 123; // 编译时不会报错,但如果你试图将其作为 int 使用,会运行时报错
}

void exampleWithDynamic() {
  dynamic dyn = 'Hello, World!';
  dyn = 123; // 编译时不会报错,运行时也不会报错
}

void main() {
  exampleWithObject();
  exampleWithDynamic();
}

记录

记录是一种轻量级的数据结构,用于存储一组字段,类似于 Python 中的元组。

要求 Dart 版本至少为 3.0。

定义记录

  • 使用圆括号 () 定义记录。
  • 字段可以是位置字段或命名字段。
dart
var record1 = (10, 'Dart'); // 位置字段
var record2 = (name: 'Alice', age: 25); // 命名字段

访问记录字段

  • 使用 .$n 访问位置字段。
  • 使用 .fieldName 访问命名字段。
dart
print(record1.$1); // 输出: 10
print(record2.name); // 输出: Alice

解构赋值

记录支持解构赋值:

dart
var (id, language) = record1;
print(id); // 输出: 10

集合

Dart 提供三种主要的集合类型:ListSetMap

列表

  • 用于存储有序元素集合。
  • 支持固定长度和动态长度两种形式。
dart
List<int> numbers = [1, 2, 3];
numbers.add(4); // 添加元素
print(numbers[0]); // 访问第一个元素

集合

  • 用于存储唯一元素的集合。
dart
Set<String> names = {'Alice', 'Bob', 'Alice'}; // 自动去重
print(names); // 输出: {Alice, Bob}

映射

  • 键值对集合。
dart
Map<String, int> scores = {'Alice': 90, 'Bob': 80};
print(scores['Alice']); // 输出: 90

泛型

泛型允许在类、方法或集合中使用占位类型,以提高代码的灵活性和类型安全性。

泛型类

dart
class Box<T> {
  T value;
  Box(this.value);
}

void main() {
  var intBox = Box<int>(42);
  print(intBox.value); // 输出: 42
}

泛型方法

dart
T getFirst<T>(List<T> items) {
  return items.first;
}

void main() {
  print(getFirst<int>([1, 2, 3])); // 输出: 1
}

别名

typedef 用于定义函数类型的别名或更具可读性的类型名称。

函数类型别名

dart
typedef IntOperation = int Function(int a, int b);

int add(int a, int b) => a + b;

void main() {
  IntOperation operation = add;
  print(operation(2, 3)); // 输出: 5
}

泛型别名

dart
typedef ItemProcessor<T> = T Function(T item);

T processItem<T>(T item, ItemProcessor<T> processor) {
  return processor(item);
}

void main() {
  print(processItem<int>(5, (item) => item * 2)); // 输出: 10
}

类型系统

Dart 使用强类型和静态类型检查的类型系统,支持空安全和类型推断。

空安全

  • 默认情况下,变量不能为 null
  • 如果需要允许 null,使用 ? 表示可空类型。
dart
int? age = null;

fun?.call(); // 如果 fun 不为 null,则调用
  • 使用 ! 断言操作符表示非空断言。即一个变量你可以确定它不为空,但编译器无法确定时,可以使用 ! 断言操作符。
dart
int? age = 0;
int newAge = age!; // 断言 age 不为空

类型检查和转换

  • 类型检查:使用 is
  • 类型转换:使用 as
dart
Object value = 'Hello';
if (value is String) {
  print(value.length); // 类型检查后可以访问 String 的属性
}

类型推断

  • 使用 varfinal 自动推断类型。
dart
var number = 42; // 推断为 int
final name = 'Dart'; // 推断为 String
编程洪同学服务平台是一个广泛收集编程相关内容和资源,旨在满足编程爱好者和专业开发人员的需求的网站。无论您是初学者还是经验丰富的开发者,都可以在这里找到有用的信息和资料,我们将助您提升编程技能和知识。
专业开发
高端定制
售后无忧
站内资源均为本站制作或收集于互联网等平台,如有侵权,请第一时间联系本站,敬请谅解!本站资源仅限于学习与参考,严禁用于各种非法活动,否则后果自行负责,本站概不承担!