Я использую стороннюю библиотеку, содержащую класс, в котором отсутствуют как operator == (), так и Equals (). Я бы хотел реализовать один сам, но не знаю, как его назвать и куда поставить. Я попытался добавить оба оператора в качестве метода расширения, но оба потерпели неудачу. Я написал функцию IsEqualTo (), но это приводит к довольно запутанному клиентскому коду. Кто-нибудь знает более изящное решение?
Где разместить функцию равенства для класса в сторонней библиотеке?
Ответы (2)
Будет ли это вариант унаследовать от стороннего класса или обернуть его?
person
Daniel Hilgarth
schedule
18.02.2011
Хм, я сомневаюсь, что это сделало бы клиентский код более понятным, поскольку мне всегда приходилось не забывать обертывать экземпляр перед вызовом функции сравнения, точно так же, как теперь мне нужно не забыть вызвать мою собственную функцию IsEqualTo () вместо функций сравнения по умолчанию .
- person Dimitri C.; 18.02.2011
Я имел в виду: не используйте сторонний класс в своем коде. Всегда используйте свою обертку.
- person Daniel Hilgarth; 18.02.2011
Действительно, это был бы вариант, но для этого потребовалось бы преобразовывать экземпляры туда и обратно при взаимодействии с библиотекой. Хотя это возможно, это приводит к большим накладным расходам.
- person Dimitri C.; 18.02.2011
Вы не сможете перегрузить оператор ==
, но можете создать IEqualityComparer<T>
, который можно использовать для словарей и т. Д.
Хотя вы можете написать метод расширения Equals
, он никогда не будет использоваться, потому что виртуальный метод на Object
будет всегда применим, и если существует применимый метод экземпляра, компилятор не ищет методы расширения, даже если есть более конкретный.
Возможно, вы захотите переименовать свой метод IsEqualTo
в ValueEquals
или что-то подобное ... но я согласен, что это все еще не идеально.
person
Jon Skeet
schedule
18.02.2011