Должен ли я всегда использовать TryGetValue для доступа к словарям .net? - PullRequest
9 голосов
/ 20 мая 2009

В еще один вопрос, Я видел, как несколько человек рекомендуют мне всегда использовать TryGetValue.

Хотя я всегда использую TryGetValue над шаблоном Contains? / Access, я намеренно избегаю этого шаблона, когда ожидаю, что ключ всегда будет в словаре. Затем я обращаюсь к прямому доступу к индексатору, так что возникает исключение, если ключа нет, потому что действительно произошло нечто неожиданное (т. Е. Ключа не было в словаре, пока я этого ожидаю).

Поскольку, по-видимому, существует общее согласие с моей «передовой практикой» (3 из 4 человек в упомянутом мною посте явно советовали использовать TryGetValue в любое время), мне не терпится прочитать расширенное обсуждение этого тема ...

Ответы [ 4 ]

13 голосов
/ 20 мая 2009

Нет, вы совершенно правы, ИМО.

Нет смысла делать:

if (dict.TryGetValue(key, out value))
{
    // whatever
}
else
{
    throw new SomeException("key '" + key + "' wasn't in dictionary");
}

Единственное преимущество этого:

value = dict[key];

заключается в том, что вы получаете более явное сообщение об исключении ... но за счет читабельности, IMO.

Это похоже на приведение против использования as - исключение - это правильный результат, когда состояние "неверно", поэтому используйте форму, которая задает это поведение.

2 голосов
/ 20 мая 2009

Если ожидается, что ключ отсутствует, использование TryGetValue обычно приводит к получению более чистого и эффективного кода. Если ожидается, что ключ присутствует, то прямой индексный доступ обычно лучше - исключение указывает на ошибку.

ContainsKey обычно используется только в том случае, если соответствующее значение не требуется.

1 голос
/ 20 мая 2009

Если отсутствие ключа является исключительным, можно вызвать исключение, imho.

0 голосов
/ 20 мая 2009

Если это исключительное поведение для ключа, который не существует в вашем словаре (как это звучит), то хорошо, если исключение возбуждается, если ключ не найден, и пусть это исключение распространяется вниз по стеку. , Если вы хотите использовать практику защитного программирования, вы можете использовать следующее, прежде чем получить доступ к словарному ключу:

Debug.Assert(Dictionary.ContainsKey(Key));

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...