1. 程式人生 > 其它 >MSIL 靜態類在 IL 定義上和非靜態類的差別

MSIL 靜態類在 IL 定義上和非靜態類的差別

本文來聊聊 MSIL 的基礎知識,給一個 C# 的類標記了 static 之後和標記 static 之前,生成這個類的 IL 程式碼有什麼不同

本文來聊聊 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])。