Equals и ReferenceEquals
В классе Object поддерживаются две версии Equals — общая и обычная. Общая версия имеет следующий синтаксис:
Overloads Public Shared Function Equals(0bject. Object) As Boolean
Пример использования:
Equals(a. b)
Синтаксис обычной версии:
Overloads Over-ridable Public Function Equals(Object) As Boolean
Пример использования:
a.Equals(b)
Обе версии метода Equal s проверяют, обладают ли два объекта одинаковыми данными, но вы должны быть готовы переопределить Equals, если этого требует специфика вашего класса. Не забывайте, что общие члены класса не переопределяются, поэтому переопределение допускается лишь для обычной (не общей) версии Equal s.
Например, если в вашей программе предусмотрены два способа представления некоторого структурного типа, позаботьтесь о том, чтобы это обстоятельство учитывалось методом Equals (именно так разработчики VB .NET поступили с классом String, хотя, строго говоря, этот класс не относится к структурным типам).
В классе Object также предусмотрен общий (и потому не переопределяемый) метод ReferenceEquals. Метод ReferenceEquals проверяет, представляют ли две переменные один экземпляр. Например, как показывает следующий фрагмент, для двух строк а и b выражение a.Equals(b) может быть истинным, а выражение Reference-Equals (a. b) — ложным:
Sub Main()
Dim a As String = "hello"
Dim b As String = "Hello"
Mid(b.l.D= "h"
Console.Writeline("Is a.Equals(b)true?" & a.Equals(b))
Console.WriteLine("Is ReferenceEquals(a.b)true?" & _
ReferenceEquals(a.b))
Console. ReadLine()
End Sub
Результат показан на рис. 5.4.
Рис. 5.4. Различия между методами Equals и ReferenceEquals