MSIL 靜態類在 IL 定義上和非靜態類的差別
阿新 • • 發佈:2021-08-09
本文來聊聊 MSIL 的基礎知識,給一個 C# 的類標記了 static 之後和標記 static 之前,生成這個類的 IL 程式碼有什麼不同
本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名[林德熙](http://blog.csdn.net/lindexi_gd)(包含連結:http://blog.csdn.net/lindexi_gd ),不得用於商業目的,基於本文修改後的作品務必以相同的許可釋出。如有任何疑問,請與我[聯絡](mailto:[email protected])。
本文來聊聊 MSIL 的基礎知識,給一個 C# 的類標記了 static 之後和標記 static 之前,生成這個類的 IL 程式碼有什麼不同
如以下的程式碼是一個預設的控制檯程式
class Program
{
static void Main(string[] args)
{
}
}
此時生成的 IL 程式碼,大概如下
.class private auto ansi beforefieldinit KakawbaijairKacheberelere.Program extends [System.Runtime]System.Object
而如果給 Program 加上靜態,如以下程式碼,生成的 IL 程式碼是和之前不相同的
static class Program
{
static void Main(string[] args)
{
}
}
生成的 IL 程式碼如下
.class private abstract sealed auto ansi beforefieldinit
KakawbaijairKacheberelere.Program
extends [System.Runtime]System.Object
複習一下 IL 程式碼的知識
在 MSIL 裡,採用 .class
表示這是型別的定義,型別定義的格式大概如下
.class [訪問許可權] [其他修飾] [名稱空間].[類名] extends [繼承的基類]
可以看到上下兩個 IL 程式碼的不同在於,如果標記了 static 那 IL 將加上 abstract sealed
修飾。和 C# 程式碼的含義相同,通過 abstract
表示此型別不能被例項化,通過 sealed
表示此型別不能被繼承。因此這就構成了靜態類的特點,不能被建立例項,也不能被繼承
部落格園部落格只做備份,部落格釋出就不再更新,如果想看最新部落格,請到 https://blog.lindexi.com/
本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名[林德熙](http://blog.csdn.net/lindexi_gd)(包含連結:http://blog.csdn.net/lindexi_gd ),不得用於商業目的,基於本文修改後的作品務必以相同的許可釋出。如有任何疑問,請與我[聯絡](mailto:[email protected])。