Не перехватывайте исключения для управления потоком данных - дело не только в том, что это может вызвать проблемы с производительностью (хотя они не так плохи, как думает большинство людей), как говорит Эрик, большинство людей боятся производительности исключений из-за использования отладчика).Это больше о логической природе исключений.Лично я бы не использовал исключения таким образом , даже если бы они были абсолютно свободными .
Что-нибудь плохое здесь произошло?В любом случае недопустимо, чтобы пользователь запрашивал значение этого ключа?Абсолютно нет - основная цель метода - предоставить значение по умолчанию.Не исключено, что ключ отсутствует, поэтому вы должны искать способ работы без исключений.
Теперь Dictionary<,>
уже имеет метод, позволяющий вам получить значение, еслиключ существует и сообщит вам, был ли он найден: TryGetValue
.
public static TValue GetValueOrDefault<TKey, TValue>(
this IDictionary<TKey, TValue> dict,
TKey key)
{
TValue ret;
// We don't care about the return value - we want default(TValue)
// if it returns false anyway!
dict.TryGetValue(key, out ret);
return ret;
}
Методы расширения просто компилируются в обычные статические вызовы методов и, таким образом, не имеют разницы в производительности.
Возможно, вы также захотите добавить перегрузку, позволяющую пользователю выражать значение по умолчаниючтобы вернуть, если ключ не был найден:
public static TValue GetValueOrDefault<TKey, TValue>(
this IDictionary<TKey, TValue> dict,
TKey key, TValue defaultValue)
{
TValue ret;
return dict.TryGetValue(key, out value) ? ret : defaultValue;
}
Кстати, я изменил название вашего метода, чтобы оно совпадало с TryGetValue
.Очевидно, вам не нужно следовать этому - это всего лишь предложение.