第五章 基元类型、引用类型、值类型 CLR学习第五课
一、基元類型:編譯器直接支持的數據類型稱為基元類型(如int類型其對于的是system。int32)。
二、類型溢出,可以用checked 和unchecked進行類型溢出檢查和不進行類型溢出檢查。一個奇怪的問題,2個byte類型相加的結果居然是個int類型。如果原因是在clr(clr只在32位何64位進行算術運算)中計算時,要把byte類型先轉換為32位的int類型在相加,所以導致2個byte類型相加的結果是int類型;
一個詭異的問題 :如 a、b是byte類型 b+=a;則不會出錯。
三、所以的值計算都有對應的 System.Decimal是一個特殊的類型,clr沒有直接操作Decimal的值的IL代碼,如果對decimal的值操作沒有安全的執行,總是跑出system.overflowexception的異常,不管是否使用unckeck或者check。
四、值類型、引用類型;
值類型:直接或者間接繼承自system.valueType。值類型總是從棧分配內存。
引用類型:總是從托管堆中分配內存,new返回的是對象位于托管堆中的內存地址。該地址執行對象占用的數據位。
實例化一個引用類型包必須分配2個地址。一個是數據保存的真實地址,一個是指向該真實數據的地址。
裝箱:把值類型轉換為引用類型。先從托管堆中為新生成的引用類型分配內存,內存大小為值類型本身的大小,再加上額外的信息(即2個附件成員,一個是指向該內存的地址的引用地址,一個是SyanBlockIndex,用于進程操作,資源釋放標志物)。再將值類型拷貝到分配的空間上,在返回該值地址的語言。
拆箱:把引用類型轉換為值類型。如果該引用為空,拋出NullReferenceException。如果該引用對象不是一個期望的值類型,拋出一個InvalidCstException的異常。最后返回一個保護在裝箱中值類型所在真實地址的指針。
五、在一個方法體中,如果該對象是一個值類型。如果其調用的方法是引用類型的方法,該對象必須先轉換為引用類型(發生裝箱操作),然后再調用引用類型的方法。如果其掉用的是值類型的方法,就不會發生裝箱操作。如果一個值類型調用一個引用類型的方法兩次,只有在第一次調用時引發裝箱操作。第二次的時候直接在托管堆中調用第一次已裝箱的對象。
轉載于:https://www.cnblogs.com/gowhy/archive/2011/04/07/2007419.html
總結
以上是生活随笔為你收集整理的第五章 基元类型、引用类型、值类型 CLR学习第五课的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS UISwitch控件
- 下一篇: Windows小技巧 -- Win+R提