2013-12-03 4 views
0

В C#, как мы можем проверить ссылочное равенство для типа, реализующего оператор равенства?Как проверить ссылочное равенство для типа, реализующего оператор равенства?

class C 
{ 
    public int Val{get;set;} 
    public static bool operator ==(C c1, C c2) 
    { 
     return c1.Val == c2.Val; 
    } 
    public static bool operator !=(C c1, C c2) 
    { 
     return c1.Val != c2.Val; 
    } 
} 
class Program 
{ 
    public static void Main(string[] args) 
    { 
     C c1=new C(){Val=1}; 
     C c2=new C(){Val=1}; 
     Console.WriteLine(c1==c2);//True. but they are not same objects. 
            //How can I Check that? 
     Console.Write("Press any key to continue . . . "); 
    } 
} 
+6

Um, 'x == y'? Не совсем понятно, что вы просите ... –

+1

Что такое равенство объектов? Те же данные или одна и та же ссылка? –

+2

Если вы имеете в виду ссылочное равенство (тот же адрес памяти), вы можете использовать 'object.ReferenceEquals (x, y)'. –

ответ

2

Если вы имеете в виду равенство по ссылке, вы можете использовать Object.ReferenceEquals статический метод, даже если оператор == был перегружен для текущего типа работать иначе:

Object.ReferenceEquals(obj1, obj2); 
+1

В этом ответе нет ничего плохого, но я просто хочу упомянуть, что вы можете просто просто перетащить два операнда (или только один, на самом деле) в 'object', поэтому используйте' (object) obj1 == (object) obj2' , В этом случае пользовательский перегруженный 'operator == (C c1, C c2)' не применяется, и используется перегрузка '(object, object)', определяемая самим языком C#. (Ни один из методов не имеет смысла для типов значений; бокс.) –

+1

@JeppeStigNielsen: вот что делает метод 'ReferenceEquals' :), потому что, насколько я знаю, реализация такова: public public bool ReferenceEquals (объект objA, object objB) {return objA == objB; } ' – mcserep

+0

Несомненно, они делают то же самое. Я просто хотел сказать, что есть два способа написать это. –

0

Что делает объект «объект равенства» ?

Если «как мы можем проверить равенство объекта для типа, реализующего оператор равенства?», Вы на самом деле имеете в виду «как мы можем проверить равенство объекта для типа, который реализует IEquatable<T>», короткий ответ ... вы хотите (с некоторыми оговорками).

В документации для IEquatable<T> содержатся некоторые рекомендации. Возможно, вы также захотите реализовать IComparable<T>. И если вы реализуете как IEquatable<T> и IComparable<T>, это имело бы смысл, если ваш метод Equals() возвращает true для всех случаев, когда ваш метод CompareTo() возвращает 0, а для метода Equals() вернуть false для всех случаев, когда ваш метод CompareTo() возвращает не- нулевое значение.

Кроме того, вы можете убедиться, что вы правильно переопределяете == и !=, чтобы обеспечить такое же поведение, как и вызов Equals().

+0

Извините. Я имел в виду ссылочное равенство. Отредактировал вопрос. – Mahmoodvcs

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