Может кто-нибудь сказать мне, есть ли альтернативный способ генерации этого метода, который работает как для примитивных, так и для не примитивных типов?
blockquote>Вы не можете этого сделать. У вас не может быть одного объекта метода, который работает для
foo(int)
иfoo(Integer)
. Потому что это будут два разных метода.Причина, по которой компилятор позволяет вам вызывать некоторые
foo(Integer)
с помощьюfoo(5)
, заключается в том, что компилятор использует бокс, чтобы превратить 5 в объект Integer, а затем передать его.Помните: компилятор решает во время компиляции, какой метод будет вызван. Когда есть два метода с одинаковыми именами с разными типами аргументов, это перегрузка ... и происходит во время компиляции.
Короче говоря: либо вы должны создать два объекта метода, либо вы должны предоставить необходимый код для вставки / распаковки между примитивными и упакованными ссылочными типами по мере необходимости!
Проще говоря, Dictionary
является универсальным типом, позволяющим:
Если у вас .NET 2.0 или выше, вы должны предпочесть Dictionary
(и другие общие коллекции)
Тонкое, но важное отличие состоит в том, что Hashtable
поддерживает несколько потоков чтения с одним потоком записи, тогда как Dictionary
не обеспечивает безопасности потоков. Если вам нужна потокобезопасность с помощью универсального словаря, вы должны реализовать собственную синхронизацию или (в .NET 4.0) использовать ConcurrentDictionary
.
Словарь введен (так что типы значений не нуждаются в боксе) ), Hashtable - нет (поэтому типы значений нуждаются в боксе). Hashtable имеет более приятный способ получения значения, чем словарь IMHO, потому что он всегда знает, что значение является объектом. Хотя, если вы используете .NET 3.5, легко написать метод расширения для словаря, чтобы добиться аналогичного поведения.
Если вам нужно несколько значений для каждого ключа, посмотрите мой исходный код MultiValueDictionary здесь: multimap в .NET
Класс Hashtable - это особый тип класса словаря, который использует целочисленное значение (называемое хешем) для помощи в хранении своих ключей. Класс Hashtable использует хэш для ускорения поиска определенного ключа в коллекции. Каждый объект в .NET является производным от класса Object. Этот класс поддерживает метод GetHash, который возвращает целое число, однозначно идентифицирующее объект. Класс Hashtable в целом представляет собой очень эффективную коллекцию. Единственная проблема с классом Hashtable заключается в том, что он требует небольших накладных расходов, а для небольших коллекций (менее десяти элементов) накладные расходы могут снижать производительность.
Существует некоторая особая разница между двумя, которую необходимо учитывать:
HashTable: неуниверсальная коллекция, самые большие накладные расходы в этом коллекция состоит в том, что он автоматически упаковывает ваши ценности и чтобы получить исходное значение, вам необходимо выполнить распаковку, они уменьшают производительность вашего приложения в качестве штрафа.
Словарь: это общий тип коллекции, в которой нет неявных бокс, поэтому не нужно распаковывать, вы всегда получите оригинал значения, которые вы сохранили, чтобы улучшить ваше приложение производительность.
Второе существенное отличие:
если вы пытались получить доступ к значению из хеш-таблицы на основе ключа, который не существует, он вернет null. но в случае Словарь, который даст вам KeyNotFoundException.
Есть еще одно важное различие между HashTable и Dictionary. Если вы используете индексаторы для получения значения из HashTable, то HashTable успешно вернет null для несуществующего элемента, в то время как Dictionary выдаст ошибку, если вы попытаетесь получить доступ к элементу с помощью индексатора, который не существует в Dictionary
.Интерфейс ILookup используется в .net 3.5 с linq.
HashTable - базовый класс, который слабо типизирован; DictionaryBase абстрактный класс имеет строгую типизацию и использует внутри себя HashTable.
Я обнаружил странную вещь в Dictionary, когда мы добавляем несколько записей в Dictionary, порядок добавления записей сохраняется. Таким образом, если я применю foreach к Dictionary, я получу записи в том же порядке, в котором я их вставлял.
В то время как с обычной HashTable это не так, поскольку когда я добавляю одинаковые записи в Hashtable, порядок не сохраняется. Насколько мне известно, Dictionary основан на Hashtable, если это так, то почему мой Dictionary сохраняет порядок, а HashTable нет?
Что касается того, почему они ведут себя по-разному, то это потому, что Generic Dictionary реализует hashtable, но не основан на System.Collections.Hashtable. Реализация Generic Dictionary основана на выделении пар ключ-значение из списка. Затем они индексируются с помощью ведер хэш-таблицы для произвольного доступа, но когда она возвращает перечислитель, она просто проходит по списку в последовательном порядке - это будет порядок вставки, пока записи не используются повторно.
Шив Говинд Birlasoft.:)