C# 类实例的内存管理

C# 类实例的内存管理,c#,.net,memory-management,clr,C#,.net,Memory Management,Clr,我怀疑.Net中的内存管理。根据我的理解,内存分配和恢复如下: 对于所有值类型,框架将在堆栈中分配内存 对于所有引用类型,将在堆中分配内存, 稍后将由GC清除或管理 对于堆栈中分配的内存,将在中清除内存 执行完成时的后进先出方法 我对以下情况表示怀疑: Class MathLibrary{ int number1; int number2; public int computesum(){ return number1 + number2; } } 内存分配是如何发生的,我知道这个

我怀疑.Net中的内存管理。根据我的理解,内存分配和恢复如下:

  • 对于所有值类型,框架将在堆栈中分配内存

  • 对于所有引用类型,将在堆中分配内存, 稍后将由GC清除或管理

  • 对于堆栈中分配的内存,将在中清除内存 执行完成时的后进先出方法
  • 我对以下情况表示怀疑:

    Class MathLibrary{
    
    int number1;
    int number2;
    
    public int computesum(){
        return number1 + number2;
    }
    
    }

    内存分配是如何发生的,我知道这个对象的引用(数学)将存储在堆栈中,实际内存将分配在堆中。如果是,那么为值类型(两个整数变量)和方法定义分配的内存将在哪里

    对于所有值类型,框架将在堆栈中分配内存

    这并不总是正确的。如果在方法中声明了值类型,它将进入堆栈。如果它是类级变量,则它将位于堆上,因为拥有它的对象是在堆上分配的

    因此,对于MathLibrary,2个整数也将位于堆上,因为它们是该对象的字段

    对于所有引用类型,内存将在堆中分配,稍后将由GC清除或管理

    是的,这是真的。但是,这里需要记住的一件重要事情是,对象将在堆上分配,但是如果此对象是在方法中创建的,则对象的引用将在堆栈上。实际对象将位于堆上。例如:

    public void Foo()
    {
       Foo f = new Foo();
    }
    
    引用“f”将在堆栈上,但引用所引用的实际对象将在堆上

    对于所有值类型,框架将在堆栈中分配内存

    这并不总是正确的。如果在方法中声明了值类型,它将进入堆栈。如果它是类级变量,则它将位于堆上,因为拥有它的对象是在堆上分配的

    因此,对于MathLibrary,2个整数也将位于堆上,因为它们是该对象的字段

    对于所有引用类型,内存将在堆中分配,稍后将由GC清除或管理

    是的,这是真的。但是,这里需要记住的一件重要事情是,对象将在堆上分配,但是如果此对象是在方法中创建的,则对象的引用将在堆栈上。实际对象将位于堆上。例如:

    public void Foo()
    {
       Foo f = new Foo();
    }
    

    引用“f”将在堆栈上,但引用所引用的实际对象将在堆上

    你对值类型的理解是错误的!通常有以下两条黄金法则:

  • 将在堆上分配引用类型
  • 值类型和指针(对其他对象的引用)将分配到声明它们的位置,而不总是在堆栈上 此外,关于
    堆栈
    ,还有以下两个事实:

  • 堆栈
    负责跟踪代码中执行的内容(方法调用、传递参数等)
  • Heap
    负责跟踪对象
  • 因此,在您的示例中,这两种值类型(number1和number2)都是在引用类型的类中声明的,因此作为类实例的对象将在
    堆上分配,这两种值类型也是如此!由于
    数学
    对象实际上是对实际对象的引用,因此它完全取决于声明它的位置!
    例如,如果它是在一个方法中声明的,
    Stack
    将负责跟踪调用的内容,因此
    mathematics
    引用将驻留在堆栈上,并指向
    堆上的实际对象。但是,如果它被声明为实例成员,它将驻留在
    堆上

    那么您对值类型的理解是错误的!通常有以下两条黄金法则:

  • 将在堆上分配引用类型
  • 值类型和指针(对其他对象的引用)将分配到声明它们的位置,而不总是在堆栈上 此外,关于
    堆栈
    ,还有以下两个事实:

  • 堆栈
    负责跟踪代码中执行的内容(方法调用、传递参数等)
  • Heap
    负责跟踪对象
  • 因此,在您的示例中,这两种值类型(number1和number2)都是在引用类型的类中声明的,因此作为类实例的对象将在
    堆上分配,这两种值类型也是如此!由于
    数学
    对象实际上是对实际对象的引用,因此它完全取决于声明它的位置!
    例如,如果它是在一个方法中声明的,
    Stack
    将负责跟踪调用的内容,因此
    mathematics
    引用将驻留在堆栈上,并指向
    堆上的实际对象。但是,如果它被声明为实例成员,它将驻留在
    堆上

    ,然后有具有自己语义的捕获变量。然后有具有自己语义的捕获变量。我下面的答案是否回答了您的问题?如果是,请阅读下面我的回答是否回答了您的问题?如果是,请阅读