最新资讯

  • C#方法的生命周期与内存布局

C#方法的生命周期与内存布局

2026-02-09 21:01:08 栏目:最新资讯 1 阅读

一、“方法”存放在哪里?

假设:

class Person
{
    public string Name;  // 实例字段 → 存储在堆上
    public int Age;      // 实例字段 → 存储在堆上
}

Person p = new Person(); // 整个对象(包括 Name 和 Age)分配在堆上

方法的 IL(中间语言)代码是存储在程序的元数据中,最终由 JIT 编译为本地机器码,存放在内存的“代码区”或“方法区”中。

具体来说:

项目存储位置
方法的代码(指令)方法区 / JIT 代码缓存(Native Code Cache)
方法的元数据(名称、参数、返回类型等)元数据区(Metadata Area)
每个对象实例的方法调用时的局部变量和参数调用栈(Stack)
实例字段(成员变量)堆(Heap)

1. 方法代码只有一份,共享给所有实例

class Person
{
    public string Name;
    public void SayHello()
    {
        Console.WriteLine("Hello, " + Name);
    }
}
  • SayHello() 的代码逻辑在整个程序中 只有一份
  • 不管你创建 1 个还是 1000 个 Person 对象,SayHello 的代码不会复制 1000 次
  • 所有实例 共享同一个方法实现

类似于:你有一本菜谱(类),做了 10 次同一个菜(10 个对象),但菜谱本身只有一本。


补充:泛型方法的“多分身”现象 (Generic Specialization)

“代码只有一份”,这对于普通方法是正确的,但对于泛型方法,情况会有所不同: