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