Меня интересует ваше мнение относительно проблемы, возникшей при реализации небольшой библиотеки для написания интеграционных/системных тестов на C#. Библиотека состоит из 2 части: тест Authoring API и тестовый Runtime API. Писатель теста использует авторский API для создания прототипов плана тестирования. Время выполнения может занять прототип и создать представление прототипа и выполнить его.Как указать, что экземпляры некоторых классов не должны использоваться в качестве ключей словаря?
Чтобы проверить класс с именем RuntimeTestPlanBuilder, мне пришлось переопределить метод Equals во всех классах объектных моделей времени исполнения. Это привело к ситуации, когда я должен переопределить метод GetHashCode. Реализация GetHashCode для некоторых классов объектной модели среды выполнения была простой. Поскольку некоторые классы в модели времени выполнения являются контейнерами, реализующими GetHashCode для них, было жестким и даже невозможным (поскольку среда выполнения может добавлять элементы в контейнер, хэш-код не может быть вычислен в O (1), например).
В результате я обнаружил, что мне интересно, как запретить пользователям контейнеров помещать их в словарь в качестве ключей. Решение, которое я выбрал, - это переопределить метод GetHashCode и выбросить исключение. Я не удовлетворен этим решением, так как он будет работать только во время выполнения. Кроме того, я удивляюсь, почему дизайнеры .Net Framework решили поместить метод GetHashCode в класс Object. Я думаю, что это решение привело к моей ситуации, так как я не могу пометить свои контейнеры как незаменимые словарные ключи в отличной форме.
Лучшим решением (для дизайнеров .Net Framework) могло быть определение интерфейса с именем IHashable с помощью двух методов: Equals и GetHashCode и принудительного применения интерфейса с ограничением по типу универсального словаря. Таким образом, мы можем обеспечить во время компиляции, что ключи реализуют Equals и GetHashCode. Кроме того, легко понять, что классы, которые не реализуют этот интерфейс, не должны использоваться в качестве словарных клавиш.
Мой вопрос: можете ли вы предложить лучшее решение (не исключающее исключения из GetHashCode), чтобы указать, что экземпляры некоторых классов не должны использоваться в качестве ключей словаря?
Благодаря
Как вы реализуете метод Equals() в классах проблем? Реализация GetHashCode() не должна быть сложнее, чем реализация Equals(). –
В принципе, 2 контейнера равны, если они имеют одинаковое количество элементов, и все предметы в тех же местах равны. – Ikaso
@PieterGeerkens - попытайтесь представить мой вопрос не в указанном контексте, а в более широком контексте - как пометить некоторые классы как неправомерные ключи словаря? – Ikaso