То, почему Словарь [индексирует], бросает KeyNotFoundException, но Хеш-таблица [индекс] не делает?

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

Используя следующий код:

    System.Diagnostics.Stopwatch s = new System.Diagnostics.Stopwatch();

    var p = new { FirstName = "Bill", LastName = "Gates" };

    s.Start();
    Console.WriteLine("{0} {1}", p.FirstName, p.LastName);
    s.Stop();
    Console.WriteLine("Console.WriteLine(\"{0} {1}\", p.FirstName, p.LastName); took: " + s.ElapsedMilliseconds + "ms - " + s.ElapsedTicks + " ticks");

    s.Reset();
    s.Start();
    Console.WriteLine(p.FirstName + " " + p.LastName);
    s.Stop();

    Console.WriteLine("Console.WriteLine(p.FirstName + \" \" + p.LastName); took: " + s.ElapsedMilliseconds + "ms - " + s.ElapsedTicks + " ticks");

я получил следующие результаты:

Bill Gates
Console.WriteLine("{0} {1}", p.FirstName, p.LastName); took: 2ms - 7280 ticks
Bill Gates
Console.WriteLine(p.FirstName + " " + p.LastName); took: 0ms - 67 ticks

Используя метод форматирования более чем в 100 раз медленнее!! Конкатенация даже не зарегистрировалась как 1 мс, который является, почему я произвел галочки таймера также.

14
задан Joan Venge 9 November 2009 в 21:54
поделиться

3 ответа

Вот ответ .

Основная причина Словарь выкидывает то, что нет "ошибки" значение, которое работает с любым V. Hashtable может возвращать null потому что ключ всегда является ссылкой введите.

18
ответ дан 1 December 2019 в 10:19
поделиться

Таким образом, не будет двусмысленности между тем, когда значение словаря [key] хранит нулевое значение, и когда ключ не существует. Hashtable [key] вернет null, если он хранит null или ключ не существует.

6
ответ дан 1 December 2019 в 10:19
поделиться

Основная причина, по которой Dictionary выбрасывает - политическая - было несколько вариантов для сохранения эффективности и простоты использования. Фактически он предоставляет метод (TryGetValue), который ясно демонстрирует, что утверждения о предполагаемой «неспособности» вернуть разумное значение являются ложными. Однако TryGetValue заставляет явно неудобный синтаксис делать именно то, что индексатор мог бы сделать легко.

Шаблоны C # предоставляют простой способ создания отдельных реализаций для семантики ссылок и значений, а также есть два других средства для бесшовной обработки отсутствующих объектов с семантикой значений, которые используются tempates и некоторыми операторами (по умолчанию и допускающими значение NULL). Это означает, что не было рациональной причины нарушать семантику хеш-таблицы.

Это долгая политическая борьба между академическим понятием коллекции, которое настаивает на том, что каждый должен пройти проверку «есть ли у вас», и реальным фактом, что такая искусственная процедура неэффективна и нарушает безопасность потоков - в принципе ( он нарушает потокобезопасность других безопасных реализаций, делая доступ неатомарным).

2
ответ дан 1 December 2019 в 10:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: