2012-04-11 4 views
6

Выполняется ли литье из ConcurrentDictionary в IDictionary в потокобезопасной реализации, поскольку IDictionary не имеет методов GetOrAdd и AddOrUpdate?В ролях из ConcurrentDictionary для IDictionary

+0

Как вы имеете в виду «вырезать», точно? Удаляет ли это его из 'ConcurrentDictionary'? Нет. Доступно ли это из интерфейса IDictionary? № –

+2

@JamesMichaelHare: Он означает, что, если вы нажмете на 'IDictionary', делает ли этот объект потоком-небезопасным? Другими словами, превращает ли он его в обычный словарь? –

+0

Будет ли он по-прежнему быть потокобезопасным? Да, поскольку это может быть без этих операций. То есть, если вам нужен атомный 'GetOrAdd()' вам не повезет. –

ответ

10

Результирующий объект по-прежнему будет параллельным словарем. Такие вызовы, как «Добавить или удалить», используют базовую реализацию TryAdd и TryRemove (которые являются потокобезопасными). Отбрасывание объекта другим типом не изменяет сам объект.

Кроме того, для разъяснения вы можете использовать такие инструменты, как ILSpy, чтобы узнать, что представляет собой реализация методов IDictionary по умолчанию и будут ли они по-прежнему безопасными для потоков.

+0

Вы также можете посмотреть документацию MSDN для реализации ConcurrentDictionary методов 'IDictionary ': http://msdn.microsoft.com/en-us/library/dd287191.aspx – phoog

6

IDictionary - это просто интерфейс. Если вы примените его, результатом будет реализация ConcurrentDictionary, отсутствующие методы GetOrAdd и AddOrUpdate.

Предположительно, вы все еще можете использовать Item собственность и Add и ContainsKey методы (вместо из GetOrAdd и AddOrUpdate) методы, и ваш отливают объект все еще будет поточно-(так как лежащая в основе реализация является ConcurrentDictionary).

1

Интерфейс не влияет на реализацию. Он просто не раскрывает некоторые из методов ConcurrentDictionary.

Вы можете найти this или this полезно в понимании интерфейсов.

0

Было бы похоже на большой ConcurrentDictionary объект через IDictionary в форме замочной скважины - вы могли видеть только IDictionary форму, но он все равно будет ConcurrentDictionary.

-1

Короткий ответ №.

Вы управляете объектом через интерфейс и, следовательно, все еще используете конкретную реализацию. Вы не теряете никакой функциональности и своих методов. Они просто недоступны.

На стороне примечания, вам нужно явное приведение при понижении, без необходимости явного приведения при повышении - всегда безопасно это делать.

+0

извините, но ConcurrentDictionary добавляет два новых методы и скрывать другие, поэтому его реализация может добавить потокобезопасность только для новых методов, а не для скрытых методов. Документация MSDN не уточняет, поэтому я спросил об этом.Но после того, как я прочитал лучшие комментарии, и я взглянул на прототип ConcurrentDictionary, я увидел, что он не расширяет словарь, и это заверило меня, что маловероятно, что его использование в IDictionary косвенно будет использовать словарь расширенной версии. – Luciano

Смежные вопросы