Какова наилучшая практика в С#, начиная с версии 4.0 при написании класса сравнения:
а. Должны ли мы наследовать от абстрактного класса Comparer? или
б. Должны ли мы реализовать интерфейс IComparer.
Каковы плюсы и минусы?
Какова наилучшая практика в С#, начиная с версии 4.0 при написании класса сравнения:
а. Должны ли мы наследовать от абстрактного класса Comparer? или
б. Должны ли мы реализовать интерфейс IComparer.
Каковы плюсы и минусы?
Я бы рекомендовал расширить класс Comparer<T>
вместо реализации интерфейса IComparer<T>
, как и Microsoft (см. Первую ссылку ниже).
Теперь, если вы хотите, чтобы ваш объект (независимо от того, что T) мог сравнивать с самим собой, он может реализовать интерфейс IComparable
(см. Вторую ссылку ниже).
От: http://msdn.microsoft.com/en-us/library/8ehhxeaf(v=vs.110).aspx (IComparer<T>
)
Мы рекомендуем, чтобы вы вышли из класса
Comparer<T>
вместо реализации интерфейса IComparer, потому что классComparer<T>
предоставляет явную реализацию интерфейса методаIComparer.Compare
и свойствоDefault
которое получаетIComparer.Compare
по умолчанию для объекта.
От: http://msdn.microsoft.com/en-us/library/cfttsh47(v=vs.110).aspx (Comparer<T>
)
Выведите этот класс, чтобы обеспечить пользовательскую реализацию интерфейса
IComparer<T>
для использования с классами коллекций, такими как классыSortedList<TKey, TValue>
иSortedDictionary<TKey, TValue>
. Разница между выводом класса Comparer и внедрением интерфейсаSystem.IComparable
выглядит следующим образом:
- Чтобы указать, как по умолчанию сопоставлять два объекта, реализуйте интерфейс
System.IComparable
в своем классе. Это гарантирует, что операции сортировки будут использовать код сравнения по умолчанию, который вы предоставили.- Чтобы определить сравнитель для использования вместо сравнения по умолчанию, выведите его из класса Comparer. Затем вы можете использовать этот компаратор в операциях сортировки, которые принимают сравнительный параметр в качестве параметра.
Мы рекомендуем, чтобы вы вышли из класса Comparer вместо реализации интерфейса IComparer, поскольку класс Comparer предоставляет явную реализацию интерфейса метода IComparer.Compare и свойство Default, которое получает сопоставитель по умолчанию для объекта.