Является ли этот способ использования ReferenceEquals правильным

Я делаю некоторый обзор кода, и я остановился на следующей конструкции. Правильный ли это способ использования ReferenceEquals проверить, возвращает ли метод фактически тот же объект, который был передан в качестве аргумента, или новый?

int x = 5;
Foo f = new Foo()

Foo DoSomething(Foo f)
{
    if(x > 5)
    {
         return f;
    }
    else
    {
        return new Foo();
    }
}

Foo ff = DoSomething(f);

if(Object.ReferenceEquals(ff, f))
{
    //do something
}

2 ответа

Да для справочных типов. Типы значений немного сложнее, так как они упакованы перед передачей в метод.

При сравнении типов значений. Если objA и objB являются типами значений, они помещаются в квадрат перед передачей в метод ReferenceEquals. Это означает, что если и objA, и objB представляют один и тот же экземпляр типа значения, метод ReferenceEquals, тем не менее, возвращает false,

Подробнее читайте здесь

Ссылочное равенство типов значений

Метод ReferenceEquals - MSDN

В отличие от метода Equals и оператора равенства, метод ReferenceEquals не может быть переопределен. По этой причине, если вы хотите проверить две ссылки на объекты на равенство и не уверены в реализации метода Equals, вы можете вызвать метод ReferenceEquals. Однако обратите внимание, что если objA и objB являются типами значений, они помещаются в квадрат перед передачей в метод ReferenceEquals.

Другие вопросы по тегам