程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> .net類型的理解

.net類型的理解

編輯:.NET實例教程
  昨晚,無事,隨手翻了翻《CLR 架構設計》,看到類型一章,感觸頗多,心中竊喜。大清早來公司,寫下這點心得,一是怕久後忘記,也可以相互學習。 
 .Net所有類型都(隱示)繼承System.Objet,地球人都知道。 
 .Net類型分兩類,一類是值類型(valueType),一類是引用類型(referenceType 
       
值類型包括兩類;枚舉,結構。 
       
結構又細分為; 數字類型(比如Int32,float等),bool類型 ,用戶結構(比如struct)。 
       
值類型之外的類型都是引用類型,StringObject為內置的引用類型。 
 值類型和引用類型在內存中分配的空間不同 
       
值類型一般分配在棧中(stack),優點是訪問速度快,事後不需要GC執行垃圾回收。 
       
比如在函數中定義一個局部變量iInt32 i=0),在i沒都被函數使用之前,i一直呆在棧中。 
       
引用類型的對象一般分配在堆中(heap),缺點是訪問速度慢,事後需要GC執行垃圾回收(因為分配在堆中的對象需要事先到棧中,找到自己的指針,才能被引用)。 
 裝箱子與拆箱子 
      
其實,我們每敲一行DEMO,都有 裝箱子與拆箱子 在發生。 
      
先解釋,什麼是裝箱子,裝箱子就是把前面提到的值類型對象轉化成引用類型(value to reference)。 
      
拆箱子,就是把引用類型對象轉化成值類型(reference to value)。 
      
舉例,很多人都喜歡用這樣使用,定義int i=0i.toString();其實i.toString()這個操作就是裝箱子。 
      Public class TestOne 
      { 
        Methed1(Object obj) 
       { 
          doanythings; 
       } 
       Public void main() 
       { 
          int i=1; 
          Methed1(i); 
       } 
    } 
     
代碼不多,就一個Methed1(Object obj)方法,在main方法中調用Methed1(i);實質也是一個裝箱子的過程, 
     
int類型轉化成System.Object類型。 
     Public class TestTwo 
     { 
         Public void main() 
        { 
           String str=“12345“
 
           Convert.ToInt32(str); 
        } 
     } 
     Convert.ToInt32(str)
就是一個拆箱子,把引用類型轉化成值類型。 
 強制類型轉換(注意只對引用類型而言) 
     
類型可以繼承,假設有 類型A,類型B實際存在;B繼承A,那麼可以說A是父類,B是子類,地球人都知道。 

    A a=new A()
 
    B b=new B()
 
    a=b
;OK 
    b=a;  NO 
    b=(B)a
OK(強制類型) 
    
子類可以(隱示)轉換成父類,比如a=b 
    
父類可以(強制類型)換換成子類,比如b=(B)a 
    IS
AS 都可以進行強制類型轉化,但AS性能更好,AS如果轉化失敗,返回NULL 
    IS
返回true or false 
有寫得不正確的地方,請指教。 
-------------------------------------------------------------------------------------------------------------------------------------------------------
2007y11m9d
補充 
 基元與基元之間的轉換 
      
第五節的強制類型轉換,只是針對引用類型,沒有講到值類型。 
      
基元是值類型的一部分,即數字類型(Int32,byte,char,float等)。 
      
基元在CLR中都有一個對應的別名,比如int等價System.Int32string等價System.Stringobject等價System.Object
      StringObject不是值類型,(內置的引用類型)
      基元與基元之間的轉換在CLR中有一套比較負責的機制,但總的來說,不同類型之間的基元轉換時,小的數據類型可以向大的數據類型轉化,但是大的數據類型向小的數據類型轉換時,要小心數據溢出,C#編譯器在默認情況下是不檢查基元類型操作時發生的數據溢出,也就是說在發生溢出時,不拋出異常,想想多麼可怕。所以應該盡量避免使用不同類型的基元操作,或者在編譯時檢查數據溢出,使用checked 關鍵字,讓程序拋出異常,記住checked耗費性能。 
      
還有,並不是所有類型的基元都可以相互轉換的,CLR有自己的一套規則,我也不想記,太多了,以後再研究,哈哈!
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved