我最近问了一个关于StackOverflowExeptions的问题,解释非常有用!
但是,我编写了一个方法并尝试找出T cached
的分配位置(堆/堆栈):
private Dictionary<Type, Component> _cachedComponents = new Dictionary<Type, Component>();
public T GetCachedComponent<T>() where T : Component {
//Not yet sure if the next line works or throws an exception -> just ignore it
if(_cachedComponents[typeof(T)] != null) {
return (T)_cachedComponents[typeof(T)]
} else {
T cached = this.GetComponent<T>();
_cachedComponents.Add(typeof(T), cached);
return cached;
}
}
T cached
在方法中被声明,我认为它是在堆栈上分配的,对吧?T cached
会发生什么? 答案 0 :(得分:0)
在方法中分配的由于T cached是在方法中声明的,我认为它是分配的 在堆栈上,对吗?
T
不会影响它在堆或堆栈上。无论是前者还是后者的决定都取决于这是引用类型还是值类型。
但是引用会被添加到字典中,应该是 在堆上分配,对吧?
将引用添加到Dictionary<TKey, TValue>
后,密钥将存储在字典中,该字典在堆上分配,因为它是引用类型。
方法返回后,堆栈被“清除”,对吗?
方法返回后,清除堆栈帧。
但是T缓存会发生什么?它会被移到堆中吗?
如果T
缓存在字典中,那么它已经在堆上分配。
总的来说,我假设您就这些问题提出一般性知识。你不应该过多地担心这一点,因为我在这里写的是一个实现细节,可能会有所变化。