const 與 readonly 以及static readonly的區別

最近在《C#高級編程》彌補自己的基礎知識,碰到有意思的問題記錄下來吧,答案源自百度委屈

一、const 與 readonly 以及static readonly的區別。
    const:const是常量;readonly是實例只讀變量;static readonly是靜態只讀變量
區別可以從以下幾個方面分析:
1、內存分配
    const是常量,C#編譯器編譯源代碼時,會將const常量直接編譯成IL代碼,因此,它不存在分配內存的問題。
    readonly 修飾只讀實例字段時,只能在調用構造函數時才能對它進行初始化,而調用構造函數對它初始化,必然涉及到內存分配問題。readonly只能在對象除此創建時寫入數值,除非用反射來修改readonly字段。
    當readonly前面加static關鍵字變成static readonly時,該變量變成靜態只讀字段,此時,它是類型狀態的一部分,在該變量所在類型加載到應用程序域時,會爲他在動態內存內分配內存。
2、地址(指針)
    由1知,const常量在編譯時是直接嵌入代碼的,因此在運行時就不需要爲常量分配任何內存,因此它的地址我們也就無法得知,也就不能通過引用傳遞常量。
    而readonly加在變量前面變成實例只讀字段時,該變量會在對象調用構造函數的過程中爲它分配內存,因此它也就有實實在在的地址(指針)。
    static readonly修飾變量時,該變量是靜態只讀字段,在類型加載時會給他分配內存,因此該變量也是有指針的。
二、.NET平臺語言與其他非託管語言的交互問題。
.NET平臺中的C#與其他非託管代碼互操作性問題主要存在以下是哪個方面。
1、C#調用非託管代碼:
    託管語言調用非託管代碼時,.NET平臺提供了一種P(Plat)/Invoke的機制,以供.NET平臺語言調用非託管代碼。
2、C#調用COM組件,也就是其他公司做成的DLL等COM組件:
    .NET平臺語言調用其他非託管代碼寫成的COM組件時,.NET會創建一個託管程序集來描述COM組件,提供對COM組件的元數據描述,這樣C#等託管代碼就可以像調用託管的DLL組件一樣使用它。
3、非託管代碼調用託管代碼寫成的組件:
    這個具體機制是什麼,不得而知。
4、C++
    對於vs上的C++,它本身就可以被編譯成託管代碼,以用來交互,只要其遵循CLS規範。
發佈了30 篇原創文章 · 獲贊 4 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章