2009-03-06 4 views
5

Чрезмерная оператор сравнения, как сравнить, если две переменные указывает на тот же объект (т.е.. Не значение)После перегрузки оператора ==, как сравнить, если две переменные указывают на один и тот же объект?

public static bool operator ==(Landscape a, Landscape b) 
{ 
    return a.Width == b.Width && a.Height == b.Height; 
} 

public static bool operator !=(Landscape a, Landscape b) 
{ 
    return !(a.Width == b.Width && a.Height == b.Height); 
} 
+1

Я стараюсь не перегружать этих операторов для ссылочных типов, поскольку большинство людей ожидают, что == проверит равенство объектов. –

ответ

8

Используйте в Object.ReferenceEquals статический метод.

Конечно, для того, чтобы метод == и! = Сохранял свою полную функциональность, вы также должны переопределять Equals и GetHashCode, чтобы они возвращали согласованный набор ответов на вызывающих.

4

Попытка a.ReferenceEquals(b);

+0

'ReferenceEquals (object, object)' является статическим методом класса Object и не может использоваться таким образом, если вы не написали для него метод расширения. Чтобы использовать его, нужно вызвать: 'object.ReferenceEquals (a, b)' –

4

Чтобы проверить, находятся ли обе точки на одном объекте. Вы должны использовать метод Object.ReferenceEquals. Он вернет true, если оба они одинаковы или оба значения равны нулю. Иначе он вернет false

0

Я знаю его старый вопрос, но если вы собираетесь перегрузить метод == или Object.Equals, вы также должны перегрузить обратный оператор! =.

И в этом случае, поскольку вы сравниваете внутренние номера, вы должны перегрузить другие операторы сравнения <,>, < =,> =.

Люди, которые потребляют ваш класс в будущем, будь то сторонние потребители или разработчики, которые используют ваш код, могут использовать что-то вроде CodeRush или Refactor, которые автоматически «перевернут» логику (также называемую реверсивной условный), а затем сгладить его, чтобы вырваться из синдрома 25 вложенных случаев. Если их код делает это, и вы перегрузили оператор ==, не перегружая оператор! =, Он может изменить предполагаемый смысл вашего кода.

Смежные вопросы