Как ReferenceEquals может понять, что ссылки принадлежат одному и тому же объекту? - PullRequest
2 голосов
/ 03 августа 2010

Я просто любопытный фон некоторых классов и методов в .NET, поэтому мне просто интересно, как метод ReferenceEquals может понять, 2 ссылки принадлежат одному и тому же объекту или нет?

Ответы [ 5 ]

4 голосов
/ 03 августа 2010

Поскольку «тот же объект» означает «то же место в памяти», и операция может просто проверить значение «адреса» ссылки.

Не то, чтобы вы могли легко получить это значение , но тогда вам никогда не нужно.

2 голосов
/ 03 августа 2010

Ссылка - это, в основном, 32-разрядное целое число, которое указывает на место в куче, где хранится объект, поэтому ReferenceEquals может просто сравнить два целых значения и проверить, совпадают ли они.

Обратите внимание на типы значений, ReferenceEqual ВСЕГДА потерпит неудачу! ValueType переопределяет виртуальный метод Object.Equals для сравнения всех переменных-членов в производном типе, а не в справочнике.

Без знания имен и типов среды выполненияПеременные-члены, реализация по умолчанию ValueType.Equals опирается на использование отражения и отражения, как мы все знаем, медленно.Как общее практическое правило, рекомендуется ВСЕГДА переопределять метод ValueType.Equals при создании своего пользовательского типа значения, и вам следует настоятельно рекомендовать перегрузить операторы == и! =, Пока вы на нем! *

1 голос
/ 03 августа 2010

ReferenceEqulas проверяет, совпадает ли ячейка памяти или нет

 class MyClass {

       static void Main() {
          object o = null;
          object p = null;
          object q = new Object();

          //Here o and p not referring to any location.so result true
          Console.WriteLine(Object.ReferenceEquals(o, p));
          p = q; // here p's memory location is mapping to q.So both referring to same memory    location. so result is true.
          Console.WriteLine(Object.ReferenceEquals(p, q));
            //Here the p and o are in different memory location so the result is false
          Console.WriteLine(Object.ReferenceEquals(o, p));
       }
    }
1 голос
/ 03 августа 2010

Потому что они имеют одинаковое значение. Как два указателя в неуправляемом приложении указывают на один и тот же объект, если они имеют одинаковое значение.

0 голосов
/ 03 августа 2010

Я подозреваю, что он проверяет, указывают ли ссылки на один и тот же объект в памяти, т.е. на один и тот же адрес, на который ссылаются оба объекта.

...