Каково поведение == по умолчанию для объектов Dart?

У меня следующий класс дартс...

class Color {
  final int value;
  const Color._internal(this.value);

  static const Color WHITE = const Color._internal(0);
  static const Color BLACK = const Color._internal(1);

  int get hashCode => value;
  String toString() => (this == WHITE) ? 'W' : 'B';
}

Я не реализовал оператор ==.

Что произойдет, если я использую оператор == для двух экземпляров этих объектов?

1
0
276
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Он проверит, ссылаются ли экземпляры на один и тот же объект.

Color._internal(0) == Color._internal(0); // false
const Color._internal(0) == const Color._internal(0); // true

final foo = Color._internal(1);
foo == Color._internal(2); // false
foo == Color._internal(1); // false
foo == foo; // true

Таким образом, это будет верно только для одной и той же переменной (или при передаче этой ссылки) или для ссылок const.

Object.==

Реализация == по умолчанию — Object.==, потому что ваш класс Color по своей сути является подклассом Object (или Object?, когда null).

Если вы посмотрите на реализацию Object.==), вы увидите, что это просто:

external bool operator ==(Object other);

Вот краткий обзор того, как это работает: два объекта должны быть одним и тем же объектом.

identical

Я почти уверен, что идентичная функция ведет себя точно так же, хотя формулировка в документации немного отличается:

Проверьте, относятся ли две ссылки к одному и тому же объекту.

hashCode

Переопределение hashCode не влияет на реализацию == по умолчанию, поскольку она всегда будет использовать identityHashCode.

Узнайте больше о Object.hashCode.

Другие вопросы по теме