常量 identical函数 常量构造函数
常量
dart 常量主要指 final 和 const 修饰符:
- const 声明的常量是在编译时确定的,永远不会改变;
- final 声明的常量允许声明后再赋值,赋值后不可改变,final 声明的变量是在运行时确定的;
- final 不仅有 const 的编译时常量特性,最重要的它是运行时常量,并且 final 是惰性初始化;
// const常量
const PI=3.14; // 定义好后,过程中间无法再修改PI的值
print(PI);
// final常量
final a; // final既可以声明时赋值,也可以先声明再赋值,且赋值后值不可改变
a=3.14;
print(a);
final d=new DateTime.now(); // 利用了final可以运行时赋值的特性
identical 函数
dart:core 库中的 identical 函数,主要用于检查两个引用是否指向同一个对象,通俗地讲,即检查两个实例是否共享同个存储空间(同个内存地址)。
用法:
bool identical(
Object? a,
Object? b
)
示例:
var o1=Object();
var o2=Object();
print(identical(o1,o2)); // false
print(identical(o1,o1)); // true
const 其他特性
通过 const 关键字在多个地方创建相同对象的时候,实际内存中只保存了一个对象,即通过 const 声明的常量如果值相同,则它们共享同一个存储空间。
// 声明同一个对象
var o1=const Object();
var o2=const Object();
print(identical(o1,o2)); // true
print(identical(o1,o1)); // true
// 声明的值相同
const a=[2];
const b=[2];
const c=[3];
print(identical(a,b)); // true,值相同
print(identical(a,c)); // false,值不同
常量构造函数
实例化常量构造函数时,在多个地方创建这个对象,如果传入的值相同,只会保留一个对象:
- 常量构造函数需以 const 关键字修饰;
- const 构造函数必须用于成员变量都是 final 的类;
- 如果实例化时不加 const 修饰符,即使调用的是常量构造函数,实例化的对象也不是常量实例;
- 实例化常量构造函数的时候,多个地方创建这个对象,如果传入的值相同,只会保留一个对象;
- Flutter 中的 const 修饰不仅仅是节省组件构建时的内存开销,Flutter 在需要重新构建这个组件的时候,不会重新构建 const 组件;
// 声明对象
class Container{
final int width; // 使用final修饰成员变量,因为该成员变量是先声明再赋值,所以使用final而不是const
final int height;
const Container({required this.width,required this.height}); // 使用const修饰构造函数
}
// 实例化对象
void main() {
var c1=Conntainer(width:100,height:100);
var c2=Conntainer(width:100,height:100);
print(identical(c1,c2)); // false,虽然是常量构造函数,但在实例化时未使用const进行修饰
var c3=const Conntainer(width:100,height:100);
var c4=const Conntainer(width:100,height:100);
print(identical(c3,c4)); // true
var c5=const Conntainer(width:100,height:110);
var c6=const Conntainer(width:100,height:100);
print(identical(c5,c6)); // false,实例化时传入的值不一致,也不是同一个实例化对象(不共享存储空间)
}
共享存储空间条件:
- 常量
- 值相等

浙公网安备 33010602011771号