前言:
有一次在記憶體快照中發現某個ClassName+<>c的物件,如下圖紅框處:
第一次看到有點不知所以,查了一下,原來是compiler建立用來執行lambda的class物件。
舉個例子,寫了如下圖的程式(用到lambda):
這個類別還包含:
- 1個<>c型別的靜態唯讀field(<>9)
- 1個Func委派的靜態的field(<>9__0_0)
- 1個靜態的建構子
- 1個預設建構子
- 1個符合Func委派簽章的方法(b__0_0)
所以managed記憶體內才會出現Progarm+<>c的物件,但compiler為何需要這麼做?
原因是效能考量,將lambda的delegate宣告成static,免去重複建立instance的effort,
就像類別內的static method。
To be continued...
參考資料:
https://blog.jetbrains.com/dotnet/2019/01/23/c-classes-memory-snapshots/