Подтвердить что ты не робот

Почему ConcurrentDictionary.TryRemove требует второй аргумент?

Я хочу только удалить значение. Мне не нужно использовать переменную впоследствии. Почему бы не включить перегрузку, где этот второй параметр не требуется?

Нужно ли мне просто хранить его во временной локальной переменной, а не использовать его, и собирать сборщик мусора, когда метод заканчивается? Кажется довольно глупым.

Функция: http://msdn.microsoft.com/en-us/library/dd287129.aspx

4b9b3361

Ответ 1

Вы можете создать именно тот метод, который вы хотите:

public static class ConcurrentDictionaryEx {
  public static bool TryRemove<TKey, TValue>(
    this ConcurrentDictionary<TKey, TValue> self, TKey key) {
    TValue ignored;
    return self.TryRemove(key, out ignored);
  }
}

UPDATE. Или, как Dialecticus, упомянутых в комментариях, просто используйте Remove. Но учтите, что, поскольку это явная реализация интерфейса, вам понадобится ссылка на IDictionary<TKey, TValue>, которая вернет вас к созданию метода расширения, если вы хотите избежать ссылки ConcurrentDictionary<TKey, TValue>:

public static class ConcurrentDictionaryEx {
  public static bool Remove<TKey, TValue>(
    this ConcurrentDictionary<TKey, TValue> self, TKey key) {
      return ((IDictionary<TKey, TValue>)self).Remove(key);
  }
}

Ответ 2

Если вас не интересует значение, которое было удалено, просто вызовите IDictionary.Remove(key). Он затенен, поэтому вы должны явно его вызывать.

Пример:

var dict = new ConcurrentDictionary<string, string>();
dict.AddOrUpdate("mykey", (val) => "test", (val1, val2) => "test");
((IDictionary)dict).Remove("mykey");

Метод TryRemove(key, out value) должен дать вам отзыв, вне зависимости от того, выполнена ли операция. Используйте тот, который наилучшим образом соответствует вашим потребностям.