C# 在堆或堆栈上分配?

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

我最近问了一个关于StackOverflowXeptions的问题,解释非常有用! 但是,我编写了一个方法,并试图找出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缓存会发生什么呢?它将被移动到堆中吗?因为堆栈不再携带数据,但字典仍然保存引用 由于T cached是在方法中声明的,所以我假定它是分配的 在堆栈上,对吗

在方法中分配T不会影响它在堆或堆栈中的位置。是前者还是后者取决于它是引用类型还是值类型

但是参考文献会被添加到字典中,应该是 在堆上分配,对吗

一旦将引用添加到字典中,密钥将存储在字典中,字典在堆上分配,因为它是引用类型

方法返回后,堆栈将被清除,对吗

一旦方法返回,堆栈帧将被清除

但是T缓存会发生什么呢?它将被移动到堆中吗

如果T缓存在字典中,那么它已经在堆上分配了


总的来说,我假设你问这些问题是为了获得一般知识。您不应该太担心这一点,因为我在这里写的是一个实现细节,可能会有变化。

Aaaaaaah。不,您应该真正了解有关引用类型和值类型的各种问题。尝试思考使用it的程序通常不是正确的思维方式。这家伙的可能复制品很好地解释了事情:是的,这是为了一般知识:你知道它是如何工作的吗?我也很想知道,但是类主体中的值类型字段也会被分配到堆上,不是吗?除此之外,我理解您的输入:thx a lotIf如果它是一个局部变量,它将被分配到堆栈上。如果它是类声明中的一个字段,则会在堆上分配它。