Фактический ответ на заголовок «В чем разница» будет следующим:
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>();
Различие между a Dictionary<T>
и a Hashtable
это a Dictionary<T>
универсальный тип, который может специализироваться для хранения типов значения вдоль ссылочных типов.
Хеш-таблица может только сохранить ссылочные типы (a Object
переданный ссылкой), и только оценивают типы, которые упаковываются (также переданный ссылкой).
Когда словарь специализирован с типами значения, он должен возвратить те значения 'значением' не ссылкой. Так, поэтому, a Dictionary<T>
не может возвратить пустой указатель, поскольку пустой указатель не является допустимым значением для типов значения.
Я записал расширение для этого.
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);
}
}
В Вашем сообщении существует одно неправильное представление. Словарь не является оберткой вокруг Хеш-таблицы. Это - совершенно другая реализация.
Причина, почему это изменение было внесено, главным образом выравнивается по ширине одним утверждением: Пустой указатель является допустимым значением для хеш-таблицы. Без этого изменения не возможно различать non-exsistent ключ и ключ значения с нулевым значением с помощью [] метод доступа. Словарь разрешает это.
Если Вы обратитесь к коду с помощью Отражателя, то Вы будете видеть, что Словарь пытается показать ключ и явно повышает исключение, если это не находит ключ.
public TValue get_Item(TKey key)
{
int index = this.FindEntry(key);
if (index >= 0)
{
return this.entries[index].value;
}
ThrowHelper.ThrowKeyNotFoundException();
return default(TValue);
}
Словарь. ContainsKey, вероятно, лучше для Вас, чем TryGetValue.
Но относительно почему, никакая идея.
Я вполне уверен, что это ограничение является одной из функциональных причин создания обертки во-первых.