Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp_Prog_Guide.doc
Скачиваний:
16
Добавлен:
16.11.2019
Размер:
6.22 Mб
Скачать

Перегрузка операторов для реализации класса комплексных чисел

В следующем примере показано, как использовать перегрузку операторов при определении класса комплексных чисел Complex, в котором реализовано комплексное сложение. Для отображения действительной и мнимой частей чисел и результатов сложения в программе используется переопределенная версия метода ToString.

Пример

---

Guidelines for Overloading Equals() and Operator ==

In C#, there are two different kinds of equality: reference equality and value equality. Value equality is the generally understood meaning of equality: it means that two objects contain the same values. For example, two integers with the value of 2 have value equality. Reference equality means that there are not two objects to compare. Instead, there are two object references and both of them refer to the same object. This can occur through simple assignment, as shown in the following example:

System.Object a = new System.Object();

System.Object b = a;

System.Object.ReferenceEquals(a, b); //returns true

In this code, only one object exists, but there are multiple references to that object: a and b. Because they both refer to the same object, they have reference equality. If two objects have reference equality, they also have value equality, but value equality does not guarantee reference equality.

To check for reference equality, use ReferenceEquals. To check for value equality, use Equals.

Overriding Equals

Because Equals is a virtual method, any class can override its implementation. Any class that represents a value, essentially any value type, or a set of values as a group, such as a complex number class, should override Equals. If the type implements IComparable, it should override Equals.

The new implementation of Equals should follow all the guarantees of Equals:

  • x.Equals(x) returns true.

  • x. Equals (y) returns the same value as y. Equals (x).

  • if (x. Equals (y) && y. Equals (z)) returns true, then x. Equals (z) returns true.

  • Successive invocations of x. Equals (y) return the same value as long as the objects referenced by x and y are not modified.

  • x. Equals (null) returns false (for non-nullable value types only).

Правила переопределения метода Equals и оператора равенства (==)24

В языке C# существует два различных типа равенства: равенство ссылок и равенство значений. Равенство значений – это общее понятие равенства: два объекта содержат одинаковые значения. Например, две целых числа со значением 2 обладают равенством значений. Равенство ссылок означает, что для сравнения имеется не два объекта. Вместо них имеет две ссылки на объект, обе из которых связаны с одним объектом. Это достигается путем одного присвоения, как показано в следующем примере:

---

В этом коде существует только один объект, но на него имеется несколько ссылок: a и b. Так как обе ссылки связаны с одним и тем же объектом, они обладают равенством ссылок. Если два объекта обладают равенством ссылок, то они также имеют равенство значений, но равенство значений не может гарантировать равенство ссылок.

Для проверки равенства ссылок используется ReferenceEquals. Для проверки равенства значений используется Equals.