每一個人都知道,當我們將Struct(Value Type)傳遞給函數時,等待Object,發生裝箱。爲什麼CLR在完成從結構到對象的投射時做拳擊?
但是,結構自ValueType,其從對象繼承繼承...
實施例:
ArrayList a = new ArrayList();
Point p = new Point(5,6);
a.Add(p);
在此例如對盒裝和加入的ArrayList。但p已經是對象(如果你做「p是對象」,你會變成真)。編譯器是否檢查元數據以查看所有繼承層次以查看是否存在ValueType類以知道值類型是否應在堆棧上分配?而且,如果它在繼承ValueType的層次結構中找到它,它不會繼續看到內部類?
例如:編譯器檢查點元數據:從誰繼承Point? TypeValue!好吧,我不會繼續 - 是值類型
,我認爲你應該專注於「引用」和「價值」。此外,價值類型沒有任何層次結構,因爲它們都是封閉的。 –
值類型不是「在堆棧上分配的」。考慮一個整數數組。你相信數組中的所有整數都分配在堆棧上嗎?如果是這樣,那麼數組如何從分配它的方法中返回? –
Eric Lippert先生,你的意思是,因爲堆棧是1 MB,它不能包含大數組?這是合乎邏輯的......所以,它被裝箱並保存在堆中? – zzfima