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