構造函數這玩意也是面試官經常會問到的東西,我們知道一個類的狀态初始化就全靠它了,下面提幾個小問題。
q:我看到web項目裡面通常都有一個basepage頁面,其中構造函數裡面做了權限驗證,
請問為什麼要這麼做。
a: 既然這麼做了,那麼設計者肯定就知道了一個原則就是執行個體構造器中,父類構造器先于子類執行,那麼這個先執行就可
以做很多有意思的事情,比如你說的權限驗證,可能有人會問為什麼要先于子類執行,剛才我也說了,構造函數是用于
初始化本類狀态的,這也叫“先掃屋子再請客”的道理吧~,然後風雨兼程的回溯到object的ctor中。好了,現在來回答
你的問題,先把這個問題簡化一下,就不用web項目來示範了。
可以看到,确實animal于bird先執行,可能有人會問,那animal調用的是誰的ctor呢?當然就是object了,我們可以看看il:
q: 既然你說構造函數用于初始化類的初始狀态,那麼請問下,我現在有一串這樣的
json:{"name":"smart","age":2}。實體類如下圖,請問我的json序列化後,age=?
a:其實這個問題的關鍵在于,反序列化的時候是否會調用構造函數的問題,先來通過reflector看下源碼,發現并沒有代碼,覺得
有點小奇怪,就用ilspy反編譯一下,同樣也沒有代碼,不可否認,底層肯定是有代碼執行的,要麼反編譯不出來,要麼clr用了
其他的方式,反正我們看不到實作源代碼,如果大家有什麼好意見可以幫幫我,謝謝了
reflector截圖:
ilspy截圖:
據資料說,裡面最後調用了formatterservices裡面的getsafeuninitializedobject來配置設定對象記憶體,配置設定完後就不走構造器
了,是以針對這個問題,隻能記住了。最後為了驗證一下,執行完代碼之後确實沒有走構造函數。
q:我知道引用類型可以用構造器,那值類型為什麼不能定義無參構造器?
a:這個問題問的好,編譯器會根據性能考慮,不會調用值類型的構造函數,即使你強制的new一下也不會執行
不過除非你自己顯示定義有參構造函數,而且值類型有個特點就是讀取之前必須初始化,否則會編譯不通過。
q:請問在類構造函數中能做單例嗎?
a: 能不能做,就要看類構造器的特征了,我們知道類構造器跟執行個體構造器一樣,他是用來初始化靜态字段的,線程
通路類構造器的時候内部會進行加鎖處理,是以多個線程同時通路的時候,隻會有一個線程執行了類構造器,是以
确實可以。