2016-01-20 2 views
0

Я спросил собеседника в интервью, что «разница между Object.Equals (объект, объект) и Object.ReferenceEquals (объект, объект) Объект Object)".Разница между Object.Equals (объект, объект) и Object.ReferenceEquals (объект, объект) в C#

Я пробовал в фрагменте кода, но результат такой же.

Просьба предложить.

A a = new A(), b = new A(); 
MessageBox.Show(""+Object.Equals(a, b)); 
MessageBox.Show("" + Object.ReferenceEquals(a, b)); 
+0

является главной Равно методы? что может иметь значение – slawekwin

+0

Вы пытались прочитать [this] (https://msdn.microsoft.com/en-us/library/system.object.referenceequals (v = vs.110) .aspx) и [this] (https://msdn.microsoft.com/en-us/library/w4hkze5k(v=vs.110).aspx)? –

+0

Или просто посмотрите на источник, чтобы увидеть разницу: http://referencesource.microsoft.com/#mscorlib/system/object.cs,d9262ceecc1719ab –

ответ

0

Как отмечали другие, отличия возникают только в том случае, если метод Equals переопределяется, поскольку базовая реализация в object основана на ReferenceEquals.

Рассмотрим следующий пример:

public class Person { 
    public string Firstname { get; set; } 
    public string Lastname { get; set; } 
    public DateTime Birthdate { get; set; } 

    public override bool Equals(object other) { 
     var otherPerson = other as Person; 
     if (otherPerson == null) { 
      return false; 
     } 
     return Firstname == otherPerson.Firstname 
      && Lastname == otherPerson.Lastname 
      && Birthdate == otherPerson.Birthdate; 
    } 
} 

Теперь мы создаем два человека с таким же именем и Дата рождения. Согласно нашей переопределенной логике Equals, эти два человека считаются одним и тем же Лицом. Но для Системы это два разных объекта, потому что они были созданы дважды, и поэтому ссылки не равны.

var person1 = new Person(Firstname = "John", Lastname = "Doe", Birthdate = new DateTime(1973, 01, 04)); 

var person2 = new Person(Firstname = "John", Lastname = "Doe", Birthdate = new DateTime(1973, 01, 04)); 

bool isSameContent = person1.Equals(person2);   // true 
bool isSameObject = person1.ReferenceEquals(person2); // false 

var person3 = person1; 
bool isSameObject2 = person1.ReferenceEquals(person3); // true 
+0

Спасибо за ваш ответ. –

0

Если класс Способ переопределяет Равно, чем года могут иметь разницу в результатах. Object.Equals (a, b) используют ReferenceEquals в качестве первой части сравнения. Посмотрите здесь https://msdn.microsoft.com/en-us/library/w4hkze5k(v=vs.110).aspx

+0

Класс объекта имеет два перегруженного метода. «Равно» имеет один параметр, а один - метод экземпляра. Но я говорю о другом методе Equals, который принимает два параметра, а также статические, потому что он вызывает с использованием имени класса Object, и из-за статики он не может быть переопределен. –

+0

@MohdIsmailSiddiqui Перегрузка с двумя параметрами 'Equals (object, object)' будет вызывать нестатические перегрузки с одним параметром 'Equals (object)' в большинстве случаев. –

+0

Я написал об исключающем методе Equals в классе ** A **. Не о переопределении статического метода. Посмотрите ссылку в моем ответе. – fryday

1

Object.Equals https://msdn.microsoft.com/en-us/library/w4hkze5k(v=vs.110).aspx

Object.ReferenceEquals https://msdn.microsoft.com/en-us/library/system.object.referenceequals(v=vs.110).aspx

Acording к этому: Object.Equals сравнивает равенство объектов. Под ним вызывается ReferenceEquals и object.Equals (obj).

Object.ReferenceEquals сравнивает только ссылки двух объектов. Это верно, только если оба рефери указывают на один объект в памяти.

2

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

ReferenceEquals представляет собой статический метод, который принимает два параметра, либо/оба из которых может быть нулевым. Поскольку он является статическим (не связанным с экземпляром объекта), он не будет бросать NullReferenceException ни при каких обстоятельствах.

== является оператором, что в этом случае (объекта), ведет себя идентично ReferenceEquals. Он не будет бросать NullReferenceExceptioneither.

В качестве иллюстрации:

object o1 = null; 
object o2 = new object(); 

//Technically, these should read object.ReferenceEquals for clarity, but this is redundant. 
ReferenceEquals(o1, o1); //true 
ReferenceEquals(o1, o2); //false 
ReferenceEquals(o2, o1); //false 
ReferenceEquals(o2, o2); //true 

o1.Equals(o1) //NullReferenceException 
o1.Equals(o2) //NullReferenceException 
o2.Equals(o1) //false 
o2.Equals(o2) //true 
Смежные вопросы