常量 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,值不同

常量构造函数

实例化常量构造函数时,在多个地方创建这个对象,如果传入的值相同,只会保留一个对象:

  1. 常量构造函数需以 const 关键字修饰;
  2. const 构造函数必须用于成员变量都是 final 的类;
  3. 如果实例化时不加 const 修饰符,即使调用的是常量构造函数,实例化的对象也不是常量实例;
  4. 实例化常量构造函数的时候,多个地方创建这个对象,如果传入的值相同,只会保留一个对象;
  5. 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,实例化时传入的值不一致,也不是同一个实例化对象(不共享存储空间)

}

共享存储空间条件:

  1. 常量
  2. 值相等
posted @ 2025-10-18 19:42  505donkey  阅读(26)  评论(0)    收藏  举报