Я провел еще несколько исследований и, наконец, смог найти что-то конкретное на основе комментария Майка З. Воспроизведение соответствующих частей этот блог, в котором рассказывается об очень важном поведении ReferenceEquals
в случае structs
, которые являются типами значений. Здесь вместо структуры он взял целочисленное значение, которое также является типом значения. Результат остается прежним.
TL;DR; Object.ReferenceEquals(valueVar, valueVar) всегда возвращает false для структуры, будь то одна и та же переменная или разные переменные.
Подробности. Метод ReferenceEquals обычно используется для определения того, являются ли два объекта одним и тем же экземпляром. Но вам нужно быть немного осторожным, когда вы используете его с типами значений. Рассмотрим следующий код:
static void Main(string[] args)
{
int valueVar = 15;
if (Object.ReferenceEquals(valueVar, valueVar))
Console.WriteLine("Reference Equal");
else
Console.WriteLine("Reference Not Equal");
Console.ReadLine();
} // Will always print "Reference Not Equal"
Этот код всегда будет печатать «Reference Not Equal», если valueVar является переменной типа значения (которая также включает структуру). Если вы исследуете Object.ReferenceEquals
, он предназначен для использования двух объектов в качестве входных параметров. Поэтому, когда вы передаете ему типы значений, .NET идет дальше и «упаковывает» параметры. Вот соответствующий MSIL, созданный для приведенного выше кода.
![введите здесь описание изображения](https://i.stack.imgur.com/28W18.jpg)
Это «боксирование» приводит к созданию двух разных объектов в куче, которые теперь будут использоваться для сравнения. Вы можете использовать SOS, чтобы убедиться в этом.
![введите здесь описание изображения](https://i.stack.imgur.com/6nayO.jpg)
Таким образом, мы в конечном итоге делаем ReferenceEquals
между объектами по адресам 0x01d917e0 (адрес одного объекта) и 0x01d917ec (адрес другого объекта), что, очевидно, не удастся (помните, что теперь это объекты ссылочного типа, поэтому адреса сравниваются) и вернет false.
В заключение, несмотря на то, что Object.ReferenceEquals(valueVar, valueVar)
передает ту же переменную, что и оба параметра, он всегда будет возвращать false.
person
RBT
schedule
16.06.2018
object.ReferenceEquals
, который вызывает всю магию. Таким образом, до момента, когда методReferenceEquals
вызывается в оператореif
,myref
иmyref2
указывали на одно и то же место в памяти. Правильный? - person RBT   schedule 16.06.2018