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

Фактический ответ на заголовок «В чем разница» будет следующим:

newTerrain.GetComponent("Terrain")

возвращает ссылку Component, а

newTerrain.GetComponent<Terrain>()

возвращает ссылку Terrain. [ 1119]

Таким образом, для фактического использования ссылки вы должны будете типизировать первый, например,

(Terrain) newTerrain.GetComponent("Terrain")

Однако оба имеют оператор bool (поскольку Terrain наследует от Behaviour, который наследует из Component, который наследует от Object), поэтому для простой проверки существования оба должны точно вести себя одинаково ... за исключением того, что версия string медленнее.

Так что остается странным, что перегрузка string не ведет себя должным образом.


В качестве альтернативы вы также можете использовать либо перегрузку с Type в качестве параметра, например

public GameObject GetPooledObject(Type type)
{
    ... GetComponent(type)
}

, и использовать

GameObject newTerrain = ObjectPool.Instance.GetPooledObject(typeof(Terrain));

, либо сделать метод объединения всего объекта универсальный снова, как

public GameObject GetPooledObject<T>() where T : Component 
{
    ... GetCompoment<T>()
}

и использовать

GameObject newTerrain = ObjectPool.Instance.GetPooledObject<Terrain>();
5
задан Robert Rossney 30 December 2008 в 04:51
поделиться

6 ответов

Различие между a Dictionary<T> и a Hashtable это a Dictionary<T> универсальный тип, который может специализироваться для хранения типов значения вдоль ссылочных типов.

Хеш-таблица может только сохранить ссылочные типы (a Object переданный ссылкой), и только оценивают типы, которые упаковываются (также переданный ссылкой).

Когда словарь специализирован с типами значения, он должен возвратить те значения 'значением' не ссылкой. Так, поэтому, a Dictionary<T> не может возвратить пустой указатель, поскольку пустой указатель не является допустимым значением для типов значения.

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

Я записал расширение для этого.

public static class DictionaryExtension
{
    public static TValue GetValueOrDefault<TKey, TValue>(this Dictionary<TKey, TValue> items, string key)
    {
        if (items != null && items.ContainsKey(key))
        {
            return items[key];
        }

        return default(TValue);
    }
}
2
ответ дан 18 December 2019 в 10:49
поделиться

В Вашем сообщении существует одно неправильное представление. Словарь не является оберткой вокруг Хеш-таблицы. Это - совершенно другая реализация.

Причина, почему это изменение было внесено, главным образом выравнивается по ширине одним утверждением: Пустой указатель является допустимым значением для хеш-таблицы. Без этого изменения не возможно различать non-exsistent ключ и ключ значения с нулевым значением с помощью [] метод доступа. Словарь разрешает это.

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

Если Вы обратитесь к коду с помощью Отражателя, то Вы будете видеть, что Словарь пытается показать ключ и явно повышает исключение, если это не находит ключ.

public TValue get_Item(TKey key)
{
    int index = this.FindEntry(key);
    if (index >= 0)
    {
        return this.entries[index].value;
    }
    ThrowHelper.ThrowKeyNotFoundException();
    return default(TValue);
}
1
ответ дан 18 December 2019 в 10:49
поделиться

Словарь. ContainsKey, вероятно, лучше для Вас, чем TryGetValue.

Но относительно почему, никакая идея.

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

Я вполне уверен, что это ограничение является одной из функциональных причин создания обертки во-первых.

0
ответ дан 18 December 2019 в 10:49
поделиться
Другие вопросы по тегам:

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