Учитывая текущее заявление Microsoft о операторов равенства ==
и !=
, вывод: ==
должен быть просто синтаксический сахар для Object.Equals()
:
УБЕДИТЕСЬ, что Object.Equals и операторы равенства имеют точно такой же семантика
из http://msdn.microsoft.com/en-us/library/vstudio/7h9bszxx(v=vs.110).aspx
То, что они отличные, а не только сахар, задним числом, кажется Ошибка в их дизайне.
Если вы хотите быть уверены, что получаете IDENTITY сравнение (при сравнении ссылок), тогда используйте ReferenceEquals
.
К сожалению, обработка ==
настолько противоречива, что я обычно избежать при манипулировании чужих пользовательских классов, а просто использовать менее читаемый Equals(a, b)
или ReferenceEquals(a, b)
, в зависимости от смысла я хочу.
ИМХО, было бы лучше, если бы люди не реализовали ==
и !=
вообще. Просто дайте .Net по умолчанию Equals
и ! Equals
, а затем примените Equals
.
Если у кого-то разные рассуждения, я бы хотел его услышать.
(И да, это действительно запутанно, учитывая, что Java существовала в первую очередь и использует ==
, что означает ReferenceEquals
.Но уже слишком поздно изменять .Net вести себя таким образом. И у нас есть собственное заявление Microsoft об этом, в приведенной выше ссылке.)
Как кто-то попадает в дженерики, различия могут быть огромными, когда вы вызываете их на любом типе T слепо. – 2008-09-22 00:26:59
«Слепо» - это плохая практика для всего. если вы знаете ответ на свой вопрос, зачем спрашивать? – aku 2008-09-22 00:28:27
Даже если бы я знал конкретный ответ (чего у меня нет), возможно, по той же причине люди задают вопросы и сами отвечают? Кроме того, как вы можете сделать что-либо еще для универсального типа T? Если вы начинаете делать такие вещи, как if (typeof (T) == typeof (int)), в чем смысл? – 2008-09-22 00:31:45