Сравнение типов в C #: Type.Equals vs operator == - PullRequest
38 голосов
/ 10 февраля 2012

Решарпер предлагает изменить следующее:

Type foo = typeof( Foo );
Type bar = typeof( Bar );

if( foo.Equals( bar ) ) { ... }

Кому:

if( foo == bar ) { ... }

оператор ==

// Summary:
//     Indicates whether two System.Type objects are equal.
//
// Parameters:
//   left:
//     The first object to compare.
//
//   right:
//     The second object to compare.
//
// Returns:
//     true if left is equal to right; otherwise, false.
public static bool operator ==( Type left, Type right );

равно (тип o)

// Summary:
//     Determines if the underlying system type of the current System.Type is the
//     same as the underlying system type of the specified System.Type.
//
// Parameters:
//   o:
//     The System.Type whose underlying system type is to be compared with the underlying
//     system type of the current System.Type.
//
// Returns:
//     true if the underlying system type of o is the same as the underlying system
//     type of the current System.Type; otherwise, false.
public virtual bool Equals( Type o );

Вопрос
Почему operator == рекомендуется сравнивать с Equals( Type o ) при сравнении типов?

Ответы [ 3 ]

35 голосов
/ 13 февраля 2012

Предлагаю вам прочитать превосходное , когда тип не тип? сообщение в блоге Брэда Уилсона. Подводя итог: тип времени выполнения (представленный внутренним типом RuntimeType), управляемый CLR, не всегда совпадает с Type, который может быть расширен. Equals проверит базовый тип системы , тогда как == проверит сам тип.

Простой пример:

Type type = new TypeDelegator(typeof(int));
Console.WriteLine(type.Equals(typeof(int))); // Prints True
Console.WriteLine(type == typeof(int));      // Prints False
4 голосов
/ 10 февраля 2012

Причина проста: в этом случае они функционально эквивалентны, а последний более читабелен.

1 голос
/ 11 февраля 2012

С http://blogs.msdn.com/b/csharpfaq/archive/2004/03/29/when-should-i-use-and-when-should-i-use-equals.aspx

Метод Equals является только виртуальным, определенным в System.Object, и переопределяются теми классами, которые захотят это сделать. Оператор == является оператор, который может быть перегружен классами, но который обычно имеет личностное поведение.

Для справочных типов, где == не был перегружен, он сравнивает ссылаются ли две ссылки на один и тот же объект - что точно что делает реализация Equals в System.Object.

Типы значений не предоставляют перегрузку для == по умолчанию. Тем не мение, большинство типов значений, предоставляемых платформой, предоставляют свои собственные перегрузки. Реализация по умолчанию Equals для типа значения предоставляется ValueType и использует отражение для сравнения, что делает его значительно медленнее, чем для конкретного типа реализация обычно была бы. Эта реализация также вызывает Равно для пар ссылок в двух сравниваемых значениях.

Однако основное различие между двумя типами сравнения в обычное использование (где вы вряд ли будете определять свои собственные типы значений очень часто) это полиморфизм. Операторы перегружены, а не переопределены, это означает, что если компилятор не знает, чтобы вызвать более конкретный версия, она будет называться только идентификационной версией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...