Dart:判断两个对象是否相等 ==和identical,以及operator的使用

3,122 阅读1分钟

一般我们用==就可以判断两个对象是否是同一个实例

class People {
  String name;
  int age;
  People(this.name, this.age);
}
void main() {
  var p1 = People('w', 18);
  var p2 = p1;
  var p3 = People('w', 18);
  print(p1 == p2); // true
  print(p1 == p3); // false
}

值得注意的是两个使用相同构造函数相同参数值构造的编译时常量是同一个对象:

class People {
  final String name;
  final int age;
  const People(this.name, this.age);
}
void main() {
  var p1 = const People('w', 18);
  var p2 = const People('w', 18);
  var p3 = const People('w', 19);
  print(p1 == p2); // true
  print(p1 == p3); // false
}

但是有时候==是可以被重载的, operator用法

class People {
  String name;
  int age;
  int id;
  People(this.name, this.age, this.id);
  bool operator ==(p) {
    return (p is People) && p.id == id;
  }

  @override
  int get hashCode => id.hashCode;
}

void main() {
  var p1 = People('w', 18, 1);
  var p2 = People('w', 18, 2);
  var p3 = People('w', 19, 1);
  print(p1 == p2); // false
  print(p1 == p3); // true
}

如果我们想知道两个对象到底是不是同一个对象,这个时候要用到identical,identical方法会精确比较两个对象的地址

class People {
  String name;
  int age;
  int id;
  People(this.name, this.age, this.id);
  bool operator ==(p) {
    return (p is People) && p.id == id;
  }

  @override
  int get hashCode => id.hashCode;
}

void main() {
  var p1 = People('w', 18, 1);
  var p2 = People('w', 18, 2);
  var p3 = People('w', 19, 1);
  print(p1 == p2); // false
  print(p1 == p3); // true
  print(identical(p1, p3)); // false
}