Словари (C # или другие) - это просто контейнер, в котором вы ищите значение на основе ключа. Во многих языках это более правильно идентифицируется как Map с наиболее распространенной реализацией, являющейся HashMap.
Проблема в том, что происходит, когда ключ не существует. Некоторые языки ведут себя, возвращая null
или nil
или другое эквивалентное значение. По умолчанию значение по умолчанию вместо того, чтобы сообщать вам, что значение не существует.
Хорошо это или плохо, но разработчики библиотеки C # придумали идиому, чтобы разобраться с поведением. Они пришли к выводу, что поведение по умолчанию для поиска несуществующего значения - это исключение. Если вы хотите избежать исключений, то вы можете использовать Try
вариант. Это тот же подход, который они используют для разбора строк на целые числа или объекты даты / времени. По сути, воздействие таково:
T count = int.Parse("12T45"); // throws exception
if (int.TryParse("12T45", out count))
{
// Does not throw exception
}
И это перенесено в словарь, индексатор которого делегирует Get(index)
:
var myvalue = dict["12345"]; // throws exception
myvalue = dict.Get("12345"); // throws exception
if (dict.TryGet("12345", out myvalue))
{
// Does not throw exception
}
Это просто способ, которым разработан язык.
Должны ли out
переменные быть обескуражены?
C # не первый язык, чтобы иметь их, и у них есть свое предназначение в определенных ситуациях. Если вы пытаетесь построить систему с высокой степенью параллелизма, вы не можете использовать out
переменные на границах параллелизма.
Во многих отношениях, если есть идиома, поддерживаемая поставщиками языка и основных библиотек, я пытаюсь использовать эти идиомы в своих API. Это заставляет API чувствовать себя более последовательным и удобным на этом языке. Поэтому метод, написанный на Ruby, не будет похож на метод, написанный на C #, C или Python. У каждого из них есть предпочтительный способ построения кода, и работа с ним помогает пользователям вашего API быстрее освоить его.
Являются ли Карты в целом анти-паттерном?
У них есть своя цель, но часто они могут быть неправильным решением для той цели, которую вы имеете. Особенно, если у вас есть двунаправленное отображение, которое вам нужно. Существует много контейнеров и способов организации данных. Есть много подходов, которые вы можете использовать, и иногда вам нужно немного подумать, прежде чем выбрать этот контейнер.
Если у вас очень короткий список значений двунаправленного отображения, то вам может понадобиться только список кортежей. Или список структур, где вы можете легко найти первое совпадение по обе стороны от сопоставления.
Подумайте о проблемной области и выберите наиболее подходящий инструмент для работы. Если его нет, создайте его.