Dart语言-数据类型

Dart 语言详解

Dart 是 Google 开发的面向对象、强类型的编程语言,专为 跨平台应用开发 设计(如 Flutter 框架)。其语法简洁高效,支持 JIT(即时编译)AOT(预先编译),兼具开发灵活性与运行性能。

Dart语言类型

Dart语言中是强引用类型,主要体现在以下几个方面:

1.类型系统特性
  • Dart是静态强类型语言,变量类型在编译时确定且不可随意变更
  • 支持类型推断,声明时可省略显式类型(如var),但实际仍会推导为具体类型
  • 默认非空安全,变量未初始化时为null,通过?显式声明可空类型
2.内存管理机制
  • Dart采用自动垃圾回收机制,所有对象默认都是强引用
  • 基本类型(如intString)按值传递,对象类型按引用传递
  • 提供WeakReference处理特殊场景的弱引用需求
3.与动态类型的对比
  • 虽然支持dynamic类型实现动态特性,但会失去编译时类型检查
  • 强类型设计可提高运行时性能,AOT编译能生成高效本地代码
  • 类型系统在编译时捕获错误,比动态语言更安全
4.开发实践建议
  • 推荐优先使用显式类型声明增强代码可读性
  • 避免滥用dynamic,仅在需要禁用静态检查时使用
  • 利用泛型(如List<int>)强化集合类型安全

Dart的常用数据类型

1.数值类型
  • int:表示整数值(如42
  • double:表示双精度浮点数(如3.14
  • numintdouble的父类,可存储任意数值
2.布尔类型
  • bool:仅包含truefalse两个值
3.字符串类型
  • String:支持单引号、双引号和三引号表示法,支持插值表达式(如'Hello $name'
4.集合类型

列表(List):有序集合,类似其他语言的数组(如[1, 2, 3]

映射(Map):键值对集合(如{'name': 'Alice', 'age': 20}

集合(Set):无序且元素唯一的集合(如{1, 2, 3}

5.特殊类型

Runes:表示UTF-32编码的字符,用于处理特殊符号或表情(如\u{1f600}

Symbol:表示程序中的标识符,通过#前缀创建(如#mySymbol

Null:表示空值,所有未初始化变量的默认值

注:所有类型均为对象,继承自Object,默认值为null

Dart中变量声明

  1. 非空类型变量
    • 所有声明为非空类型(如intString等未加?修饰的类型)的变量必须立即初始化
    • 例外:函数内部的局部变量允许先声明后赋值,但使用前必须确保已赋值
  2. final/const修饰的变量
    • final声明的变量必须在声明时或构造函数中初始化,且只能赋值一次
    • const声明的编译时常量必须在声明时初始化(函数内部也必须初始化),且值必须是编译时可确定的常量
  3. 集合类型(List/Map/Set)

    • 若声明为不可空类型(如List<int>),必须立即初始化或赋予默认值[]
    • 可空类型(如List<int>?)可不初始化,默认值为null

注意:所有未显式初始化的变量默认值为null(包括未启用空安全的情况),启用空安全后,非空类型变量若未初始化会导致编译错误。

Dart中的变量类型推断

Dart语言兼具动态类型和静态类型特性,其类型系统设计如下:

类型推断机制
  • 使用var声明变量时自动推断类型(如var name = "Dart"推断为String
  • 未显式声明类型的变量在debug模式下默认为dynamic类型
dynamic类型
  • 允许运行时改变变量类型:

    dynamic value = 42;  // 初始为int
    value = "Now a string";  // 运行时切换为String
    
  • 会失去静态类型检查的安全性

Dart中的变量关键字

late:延迟初始化:允许非空变量稍后初始化,但使用前必须赋值

late String description; // 声明时不初始化
void main() {
  description = "Hello"; // 使用前必须赋值
}

dynamic

  • 动态类型:关闭静态类型检查,允许运行时改变类型
  • Object区别:dynamic允许调用任意方法(可能引发运行时错误)

Object:所有Dart对象的基类:可存储任意类型值,但需显式类型转换才能调用方法

var:根据初始值自动推断类型,后续不可更改类型

final

  • 运行时常量:值在运行时确定后不可变
  • 允许在构造函数中初始化:
class test{
 final String name;
 test({required this.name}){}// 构造函数中初始化
} 

const:编译时常量:值必须在编译时确定

?/??

  • 声明可空变量:String? name表示可能为null的字符串
  • 安全访问:obj?.method()在obj为null时不会抛出异常
  • 提供默认值:value ?? defaultValue当value为null时使用后者
  • 链式操作:a ?? b ?? c返回第一个非null值
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容