Почему C# ConcurrentDictionary имеет перегрузку AddOrUpdate с методом addValueFactory?C#

Место общения программистов C#
Anonymous
Почему C# ConcurrentDictionary имеет перегрузку AddOrUpdate с методом addValueFactory?

Сообщение Anonymous »

Используется ли перегрузка AddOrUpdate, принимающая addValueFactory, в тех случаях, когда мы хотим гарантировать, что экземпляр «дорогого» объекта будет создан только один раз?
ИИ говорит, что это полезно в случаях, когда вы имеете дело с дорогими объектами, поэтому вы создаете этот дорогой объект только тогда, когда объект с данным ключом не существует в параллельном словаре.
Я задал ИИ следующий вопрос: не могу Я просто заранее проверяю, существует объект или нет вот так:

Код: Выделить всё

if (concurrentDictionary.TryGetValue(key, out var item))
{
return item;
}
Или вот так:

Код: Выделить всё

concurrentDictionary.ContainsKey(key)
На что он ответил, что, поскольку это параллельный словарь, кто-то другой может одновременно добавить элемент с тем же ключом, поэтому параллельный словарь будет выполнять внутренние проверки и вызывать моего делегата (который создает дорогостоящий объект) только в том случае, если элемент не существует.
Для меня это имеет смысл, но когда я просматривал исходный код ConcurrentDictionary, мне не удалось выяснить, есть ли какие-либо проверки, если ключ существует или нет.
Так действительно ли мы используем перегрузку AddOrUpdate, которая принимает addValueFactory, в случаях, когда мы хотим быть уверены, что не создаем экземпляр дорогостоящего объекта более одного раза?

Подробнее здесь: https://stackoverflow.com/questions/799 ... efactory-m

Вернуться в «C#»