C# 在堆或堆栈上分配?
我最近问了一个关于StackOverflowXeptions的问题,解释非常有用! 但是,我编写了一个方法,并试图找出T cached分配给堆/堆栈的位置:C# 在堆或堆栈上分配?,c#,memory,heap-memory,stack-memory,C#,Memory,Heap Memory,Stack Memory,我最近问了一个关于StackOverflowXeptions的问题,解释非常有用! 但是,我编写了一个方法,并试图找出T cached分配给堆/堆栈的位置: private Dictionary<Type, Component> _cachedComponents = new Dictionary<Type, Component>(); public T GetCachedComponent<T>() where T : Component { //N
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缓存会发生什么呢?它将被移动到堆中吗?因为堆栈不再携带数据,但字典仍然保存引用
由于T cached是在方法中声明的,所以我假定它是分配的
在堆栈上,对吗
在方法中分配T不会影响它在堆或堆栈中的位置。是前者还是后者取决于它是引用类型还是值类型
但是参考文献会被添加到字典中,应该是
在堆上分配,对吗
一旦将引用添加到字典中,密钥将存储在字典中,字典在堆上分配,因为它是引用类型
方法返回后,堆栈将被清除,对吗
一旦方法返回,堆栈帧将被清除
但是T缓存会发生什么呢?它将被移动到堆中吗
如果T缓存在字典中,那么它已经在堆上分配了
总的来说,我假设你问这些问题是为了获得一般知识。您不应该太担心这一点,因为我在这里写的是一个实现细节,可能会有变化。Aaaaaaah。不,您应该真正了解有关引用类型和值类型的各种问题。尝试思考使用it的程序通常不是正确的思维方式。这家伙的可能复制品很好地解释了事情:是的,这是为了一般知识:你知道它是如何工作的吗?我也很想知道,但是类主体中的值类型字段也会被分配到堆上,不是吗?除此之外,我理解您的输入:thx a lotIf如果它是一个局部变量,它将被分配到堆栈上。如果它是类声明中的一个字段,则会在堆上分配它。