C# 构造函数如何在C中分配内存

C# 构造函数如何在C中分配内存,c#,C#,有人能解释一下这个嵌套构造函数在内存中是如何工作的吗。我不太清楚嵌套构造函数的内存分配和位置是如何完成的?它将首先计算最里面的树。每个树都作为一个参数传递给它的父树,就像任何方法调用一样,参数在被传递之前首先被求值。由此产生的顺序等于 class Tree<T> { public T Value { get; set; } public List<Tree<T>> Children { get; pri

有人能解释一下这个嵌套构造函数在内存中是如何工作的吗。我不太清楚嵌套构造函数的内存分配和位置是如何完成的?

它将首先计算最里面的树。每个树都作为一个参数传递给它的父树,就像任何方法调用一样,参数在被传递之前首先被求值。由此产生的顺序等于

class Tree<T>
    {
        
        public T Value { get; set; }
        public List<Tree<T>> Children { get; private set; }

        public Tree(T value, params Tree<T>[] children)
        {
            Value = value;
            Children = new List<Tree<T>>();
            foreach (Tree<T> child in children)
            {
                Children.Add(child);
            }
        }

class Programing
    {
        static void Main(string[] args)
        {
            Tree<int> tree =
                new Tree<int>(7,
                    new Tree<int>(12,
                        new Tree<int>(9),
                        new Tree<int>(31),
                        new Tree<int>(16)));
            tree.Print();
        }
    }

分配将遵循典型的对象分配模式,无需任何特殊考虑。

树是一个类,因此所有实例都在堆上分配,并最终进行垃圾收集和释放

树和树是不同的类型,具有不同的T值属性。如果T是一个类,那么该属性将是指向堆上另一个位置的指针。但由于您使用的是值类型;在树中,Value属性将只是直接存储在分配给树实例的内存中的int

构造函数和其他方法调用一样,只能在从左到右对其所有参数表达式求值之后执行。params参数是语法糖,编译器将在调用函数之前插入额外的数组创建

忽略整数值也被首先推送到堆栈上,执行顺序将是

var t1=新树9; var t2=新树31; var t3=新树16; var t4=新树[]{t1,t2,t3}; var t5=新树12,t4; var t6=新树[]{t5}; 树=新树7,t6;
但是,树的每个实例以及在构造函数中创建的每个列表都可以从内存中的任何位置分配。

从内部到外部。为了构造最外部的对象,您肯定需要一个完全构造的嵌套对象,它本身需要自己的子树等等,直到您最终可以构造一个不需要任何子树的树。很明显,您在堆上为创建的每个对象构造了这些firstallocate,其中包括每个树的列表
var a = new Tree<int>(9),
var b = new Tree<int>(31),
var c = new Tree<int>(16);
var d = new Tree<int>(12, a, b, c);
Tree<int> tree = new Tree<int>(7, d);