2024年8月12日 星期一

[C#/Memory] managed記憶體快照裡的ClassName+<>c是什麼?

 前言:

有一次在記憶體快照中發現某個ClassName+<>c的物件,如下圖紅框處:



第一次看到有點不知所以,查了一下,原來是compiler建立用來執行lambda的class物件。

舉個例子,寫了如下圖的程式(用到lambda):













看了IL code,的確compiler在我的Program類別內多建了一個<>c類別(如下圖),
這個類別還包含:

  • 1個<>c型別的靜態唯讀field(<>9)
  • 1個Func委派的靜態的field(<>9__0_0)
  • 1個靜態的建構子
  • 1個預設建構子
  • 1個符合Func委派簽章的方法(b__0_0)










所以managed記憶體內才會出現Progarm+<>c的物件,但compiler為何需要這麼做?


To be continued...


參考資料:

https://blog.jetbrains.com/dotnet/2019/01/23/c-classes-memory-snapshots/