equals c что делает
Type. Equals Метод
Определение
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Определяет, совпадает ли базовый системный тип текущего объекта Type с базовым системным типом указанного объекта Object или Type.
Перегрузки
Позволяет определить, совпадает ли базовый системный тип текущего объекта Type с базовым системным типом указанного объекта Type.
Определяет, совпадает ли базовый системный тип текущего объекта Type с базовым системным типом указанного объекта Object.
Equals(Type)
Позволяет определить, совпадает ли базовый системный тип текущего объекта Type с базовым системным типом указанного объекта Type.
Параметры
Объект, базовый системный тип которого сравнивается с базовым системным типом текущего типа Type.
Возвращаемое значение
Реализации
Примеры
В следующем примере используется Equals для сравнения двух типов.
См. также раздел
Применяется к
Equals(Object)
Определяет, совпадает ли базовый системный тип текущего объекта Type с базовым системным типом указанного объекта Object.
Параметры
Объект, базовый системный тип которого сравнивается с базовым системным типом текущего типа Type. Для успешного сравнения необходимо, чтобы параметр o можно было привести к объекту типа Type или преобразовать в объект такого типа.
Возвращаемое значение
o невозможно привести к объекту или преобразовать в объект Type.
Реализации
Примеры
В следующем примере используется Equals(Object) для сравнения различных Type экземпляров объектов с различными Object экземплярами.
В примере следует обратить внимание на две вещи:
Equals() и как работает сравнение типов в C#
Сравнение типов через Equals() и == в Reference Type
Как работает Equals() в C#
В классе System.Object есть все несколько методов, один из них ReferenceEquals
Стоить отметить, что == и RefefenceEquals работает идентично, сравнивая ссылки на объекты в heap’е, а значит при выполнении данного кода
На консоль будет выведено:
По сути за этим для стандартной реализации object.Equals скрывается вызов ReferenceEquals под капотом.
При этом определение того, какой метод Equals вызвать определяется на динамическом типе левого аргумента.
Например, перепишем наш старый пример, где переопределим метод Equals :
На экране мы увидим:
У типа Object есть еще один статический метод static bool Equals(Object objA, Object objB)
Его исходный код выглядит следующим образом:
Этот является оберткой виртуального метода Equals, но перед его вызовом, делает проверку равенства ссылок путем == и проверку на null каждого из объектов проверки.
Сравнение Value типов через Equals
Давайте разберемся как этот метод сравнивает value типы:
Совет:
Сравнение с помощью вспомогательных классов и интерфейсов
IEqualityComparer
IComparable
IStructuralEquatable
Пример реализации этого интерфейса можно подсмотреть в System.Array :
Алгоритм реализации такого интерфейса в System.Array прост:
Правила реализации метода Equals и оператора равенства (==)
При реализации метода Equals и оператора равенства (==) следует руководствоваться следующим:
Object. Equals Метод
Определение
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Определяет, равны ли два экземпляра объекта.
Перегрузки
Определяет, равен ли указанный объект текущему объекту.
Определяет, считаются ли равными указанные экземпляры объектов.
Equals(Object)
Определяет, равен ли указанный объект текущему объекту.
Параметры
Объект, который требуется сравнить с текущим объектом.
Возвращаемое значение
Примеры
некоторые языки, такие как C# и Visual Basic, поддерживают перегрузку операторов. Если тип перегружает оператор равенства, он также должен переопределять Equals(Object) метод, чтобы обеспечить ту же функциональность. Обычно это достигается путем написания Equals(Object) метода с точки зрения перегруженного оператора равенства, как показано в следующем примере.
Поскольку Complex является типом значения, он не может быть производным от. поэтому Equals(Object) методу переопределения метода не требуется вызывать GetType для определения точного типа времени выполнения каждого объекта, но вместо этого можно использовать is оператор в C# или TypeOf оператор в Visual Basic для проверки типа obj параметра.
Комментарии
Тип сравнения текущего экземпляра и obj параметра зависит от того, является ли текущий экземпляр ссылочным типом или типом значения.
Если текущий экземпляр является типом значения, Equals(Object) метод проверяет равенство значений. Равенство значений означает следующее:
Два объекта имеют один и тот же тип. Как показано в следующем примере, Byte объект со значением 12 не равен Int32 объекту со значением 12, поскольку два объекта имеют разные типы времени выполнения.
примечания для среда выполнения Windows
Windows классы среды выполнения, написанные на языке C# или Visual Basic, могут переопределять Equals(Object) перегрузку метода.
Примечания для вызывающих объектов
Производные классы часто переопределяют Object.Equals(Object) метод для реализации равенства значений. Кроме того, типы часто предоставляют дополнительный строго типизированную перегрузку для Equals метода, обычно реализуя IEquatable интерфейс. При вызове Equals метода для проверки на равенство следует знать, переопределяются ли текущий экземпляр Object.Equals и понимаете, как Equals разрешается определенный вызов метода. В противном случае вы можете выполнить проверку на равенство, отличное от предполагаемого, и метод может вернуть непредвиденное значение.
Примечания для наследников
В следующем примере показано, как переопределить Object.Equals(Object) метод для проверки на равенство значений. Он переопределяет Equals метод для Person класса. Если он Person принял реализацию равенства базового класса, два Person объекта будут равны, только если они ссылались на один объект. Однако в этом случае два Person объекта равны, если они имеют одинаковое значение для Person.Id Свойства.
Следующие инструкции должны быть истинными для всех реализаций Equals(Object) метода. В списке,, x y и z представляют ссылки на объекты, которые не равны null.
Типы, переопределяющие, Equals(Object) также должны переопределяться GetHashCode ; в противном случае хэш-таблицы могут работать неправильно.
Рекомендации по ссылочным типам
Следующие рекомендации применяются для переопределения Equals(Object) ссылочного типа.
Рассмотрите возможность переопределения, Equals Если семантика типа основана на том, что тип представляет некоторые значения.
Рекомендации по типам значений
Ниже приведены рекомендации по переопределению Equals(Object) для типа значения.
Если вы переопределяете Equals и язык разработки поддерживает перегрузку операторов, необходимо перегрузить оператор равенства.
Object. Equals Method
Definition
Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.
Determines whether two object instances are equal.
Overloads
Determines whether the specified object is equal to the current object.
Determines whether the specified object instances are considered equal.
Equals(Object)
Determines whether the specified object is equal to the current object.
Parameters
The object to compare with the current object.
Returns
Examples
The following example defines a Rectangle class that internally implements a rectangle as two Point objects. The Rectangle class also overrides Object.Equals(Object) to provide for value equality.
Some languages such as C# and Visual Basic support operator overloading. When a type overloads the equality operator, it must also override the Equals(Object) method to provide the same functionality. This is typically accomplished by writing the Equals(Object) method in terms of the overloaded equality operator, as in the following example.
Because Complex is a value type, it cannot be derived from. Therefore, the override to Equals(Object) method need not call GetType to determine the precise run-time type of each object, but can instead use the is operator in C# or the TypeOf operator in Visual Basic to check the type of the obj parameter.
Remarks
The type of comparison between the current instance and the obj parameter depends on whether the current instance is a reference type or a value type.
If the current instance is a value type, the Equals(Object) method tests for value equality. Value equality means the following:
The two objects are of the same type. As the following example shows, a Byte object that has a value of 12 does not equal an Int32 object that has a value of 12, because the two objects have different run-time types.
Notes for the Windows Runtime
Windows Runtime classes that are written in C# or Visual Basic can override the Equals(Object) method overload.
Notes for Callers
Derived classes frequently override the Object.Equals(Object) method to implement value equality. In addition, types also frequently provide an additional strongly typed overload to the Equals method, typically by implementing the IEquatable interface. When you call the Equals method to test for equality, you should know whether the current instance overrides Object.Equals and understand how a particular call to an Equals method is resolved. Otherwise, you may be performing a test for equality that is different from what you intended, and the method may return an unexpected value.
Notes for Inheritors
Type category | Equality defined by | Comments |
---|---|---|
Class derived directly from Object | Object.Equals(Object) | Reference equality; equivalent to calling Object.ReferenceEquals. |
Structure | ValueType.Equals | Value equality; either direct byte-by-byte comparison or field-by-field comparison using reflection. |
Enumeration | Enum.Equals | Values must have the same enumeration type and the same underlying value. |
Delegate | MulticastDelegate.Equals | Delegates must have the same type with identical invocation lists. |
Interface | Object.Equals(Object) | Reference equality. |
For a value type, you should always override Equals, because tests for equality that rely on reflection offer poor performance. You can also override the default implementation of Equals for reference types to test for value equality instead of reference equality and to define the precise meaning of value equality. Such implementations of Equals return true if the two objects have the same value, even if they are not the same instance. The type’s implementer decides what constitutes an object’s value, but it is typically some or all the data stored in the instance variables of the object. For example, the value of a String object is based on the characters of the string; the String.Equals(Object) method overrides the Object.Equals(Object) method to return true for any two string instances that contain the same characters in the same order.
The following example shows how to override the Object.Equals(Object) method to test for value equality. It overrides the Equals method for the Person class. If Person accepted its base class implementation of equality, two Person objects would be equal only if they referenced a single object. However, in this case, two Person objects are equal if they have the same value for the Person.Id property.
In addition to overriding Equals, you can implement the IEquatable interface to provide a strongly typed test for equality.
Successive calls to x.Equals(y) return the same value as long as the objects referenced by x and y are not modified.
Follow these guidelines when overriding Equals(Object):
Types that implement IComparable must override Equals(Object).
Types that override Equals(Object) must also override GetHashCode; otherwise, hash tables might not work correctly.
If your programming language supports operator overloading and you overload the equality operator for a given type, you must also override the Equals(Object) method to return the same result as the equality operator. This helps ensure that class library code that uses Equals (such as ArrayList and Hashtable) behaves in a manner that is consistent with the way the equality operator is used by application code.
Guidelines for Reference Types
The following guidelines apply to overriding Equals(Object) for a reference type:
Consider overriding Equals if the semantics of the type are based on the fact that the type represents some value(s).
Most reference types must not overload the equality operator, even if they override Equals. However, if you are implementing a reference type that is intended to have value semantics, such as a complex number type, you must override the equality operator.
You should not override Equals on a mutable reference type. This is because overriding Equals requires that you also override the GetHashCode method, as discussed in the previous section. This means that the hash code of an instance of a mutable reference type can change during its lifetime, which can cause the object to be lost in a hash table.
Guidelines for Value Types
The following guidelines apply to overriding Equals(Object) for a value type:
If you are defining a value type that includes one or more fields whose values are reference types, you should override Equals(Object). The Equals(Object) implementation provided by ValueType performs a byte-by-byte comparison for value types whose fields are all value types, but it uses reflection to perform a field-by-field comparison of value types whose fields include reference types.
If you override Equals and your development language supports operator overloading, you must overload the equality operator.
Как определить равенство значений для класса или структуры (руководство по программированию на C#)
При определении класса или структуры необходимо решить, имеет ли смысл создавать пользовательское определение равенства значений (или эквивалентности) для этого типа. Обычно равенство значений реализуется, если объекты этого типа будут добавляться в коллекции или если они предназначены в первую очередь для хранения набора полей или свойств. В основу определения равенства значений можно положить сравнение всех полей и свойств в типе или только их части.
Последовательные вызовы x.Equals(y) возвращают одно и то же значение до тех пор, пока не будут изменены объекты, на которые ссылаются x и y.
Любая определяемая вами структура имеет заданную по умолчанию реализацию равенства значений, которая наследуется от переопределения System.ValueType метода Object.Equals(Object). Эта реализация использует отражение для проверки всех полей и свойств в типе. Хотя эта реализация возвращает верный результат, она отличается невысокой скоростью по сравнению с пользовательской реализацией, которую можно написать специально для конкретного типа.
Детали реализации равенства значений для классов и структур различаются. Однако для реализации равенства как для классов, так и для структур, необходимо выполнить одни и те же базовые действия.
Переопределите Object.GetHashCode таким образом, чтобы два объекта с равными значениями создавали одинаковый хэш-код.
Начиная с версии C# 9.0 можно использовать записи для получения семантики равенства значений без ненужного стандартного кода.
Пример класса
В следующем примере показана реализация равенства значений в классе (ссылочный тип).
В классах (ссылочных типах) реализация по умолчанию обоих методов Object.Equals(Object) выполняет проверку равенства ссылок, а не значений. Когда разработчик переопределяет виртуальный метод, его задача заключается в том, чтобы реализовать семантику равенства значений.
Приведенный выше код может не поддерживать все сценарии наследования, как ожидается. Рассмотрим следующий код.
Пример структуры
В следующем примере показана реализация равенства значений в структуре (тип значения).
Для структур реализация по умолчанию Object.Equals(Object) (представляет собой переопределенную версию в System.ValueType) выполняет проверку равенства значений посредством отражения, сравнивая значения каждого поля в типе. Когда разработчик переопределяет виртуальный метод Equals в структуре, его задача состоит в том, чтобы найти более эффективный способ проверки равенства значений и, если это возможно, реализовать сравнение только на основании части полей или свойств структуры.