c#中結構體和類的比較

iDotNetSpace發表於2009-03-09

區別:
結構是一種用關鍵字struct宣告的自定義資料型別。與類相似,也可以包含建構函式,常數,欄位,方法,屬性,索引器,運算子和巢狀型別等,不過,結構是值型別。
1.結構的建構函式和類的建構函式不同。
   a.結構不能包含顯式的無引數建構函式。結構成員講自動初始化為它們的預設值。
   b.結構不能包含以下形式的初始值設定類:base(argument-list);
2.對於結構中的例項欄位成員,不能在宣告時賦值初始化。
3.宣告瞭結構型別後,可以使用new運算子建立構造物件,也可以不使用new關鍵字。如果不使用new,那麼在初始化所有欄位之前,欄位將保持未賦值狀態且物件不可用。
4.結構不支援繼承,即一個結構不能從另一個結構或類繼承,而且不能作為一個類的基類。但是,結構從基類OBJECT繼承。結構也可以實現介面。
5.什麼時候用結構呢?結構使用簡單,並且很有用,但是要牢記:結構在堆疊中建立,是值型別,而類是引用型別。每當需要一種經常使用的型別,而且大多數情況下該型別只是一些資料時,使用結構能比使用類獲得更佳效能。
最後引用部落格園的“越過林子”的話:
   結構是值型別,所以會影響效能,但根據使用結構的方式,這種影響可能是正面的,也可能是負面的。正面的影響是為結構分配記憶體時,速度非常快,因為它們將內聯或者儲存在堆疊中。在結構超出了作用域被刪除時,速度也很快。另一方面,只要把結構作為引數來傳遞或者把一個結構賦給另一個結構(例如A=B,其中A和B是結構),結構的所有內容就被複制,而對於類,則只複製引用。這樣,就會有效能損失,根據結構的大小,效能損失也不同。注意,結構主要用於小的資料結構。但當把結構作為引數傳遞給方法時,就應把它作為ref引數傳遞,以避免效能損失——此時只傳遞了結構在記憶體中的地址,這樣傳遞速度就與在類中的傳遞速度一樣快了。另一方面,如果這樣做,就必須注意被呼叫的方法可以改變結構的值。

 

 

 

C#中結構與類的區別      
     
  作者:未知   時間:2004-10-20   12:12   出處:網際網路   責編:jizhuwo      
     
                              摘要:暫無    
     
     
  本文目錄  
   
   
    類與結構的例項比較  
   
   
    類與結構的差別  
   
   
    如何選擇結構還是類  
   
   
    一.類與結構的示例比較:  
   
   
    結構示例:  
   
   
   
   
   
   
   
   
   
    public   struct   Person  
    {  
   
   
    string   Name;  
   
   
    int   height;  
   
   
    int   weight  
   
   
    public   bool   overWeight()  
   
   
    {  
   
   
    //implement   something  
   
   
    }  
   
   
    }  
   
   
   
   
    類示例:  
   
   
   
    public   class   TestTime  
    {  
   
   
    int   hours;  
   
   
    int   minutes;  
   
   
    int   seconds;  
   
   
    public   void   passtime()  
   
   
    {  
   
   
   
    //implementation   of   behavior.  
    }  
   
   
    }  
   
   
   
   
    呼叫過程:  
   
   
   
    public   class   Test  
    {  
   
   
    public   static   ovid   Main  
   
   
    {  
   
   
    Person   Myperson=new   Person   //宣告結構  
   
   
    TestTime   Mytime=New   TestTime   //宣告類  
   
   
    }  
   
   
    }  
   
   
   
   
   〈由廈嫻睦?又形頤強梢鑰吹劍?嗟納?骱徒峁溝納?鞣淺@嗨疲?皇竅薅ǚ?竺媸?struct   還是   class   的區別,而且使用時,定義新的結構和定義新的類的方法也非常類似。那麼類和結構的具體區別是什麼呢?  
   
   
    二   .類與結構的差別  
   
   
    1.值型別與引用型別  
   
   
    結構是值型別:值型別在堆疊上分配地址,所有的基型別都是結構型別,例如:int   對應System.int32   結構,string   對應   system.string   結構   ,通過使用結構可以建立更多的值型別  
   
   
    類是引用型別:引用型別在堆上分配地址  
   
   
   
    堆疊的執行效率要比堆的執行效率高,可是堆疊的資源有限,不適合處理大的邏輯複雜的物件。所以結構處理作為基型別對待的小物件,而類處理某個商業邏輯  
   
   
    因為結構是值型別所以結構之間的賦值可以建立新的結構,而類是引用型別,類之間的賦值只是複製引用  
   
   
    注:  
   
   
    1.雖然結構與類的型別不一樣,可是他們的基型別都是物件(object),c#中所有型別的基型別都是object    
   
   
    2.雖然結構的初始化也使用了New   操作符可是結構物件依然分配在堆疊上而不是堆上,如果不使用“新建”(new),那麼在初始化所有欄位之前,欄位將保持未賦值狀態,且物件不可用  
   
   
    2.繼承性  
   
   
    結構:不能從另外一個結構或者類繼承,本身也不能被繼承,雖然結構沒有明確的用sealed宣告,可是結構是隱式的sealed   .  
   
   
    類:完全可擴充套件的,除非顯示的宣告sealed   否則類可以繼承其他類和介面,自身也能被繼承  
   
   
    注:雖然結構不能被繼承   可是結構能夠繼承介面,方法和類繼承介面一樣  
   
   
    例如:結構實現介面  
   
   
   
    interface   IImage  
    {  
    void   Paint();  
    }  
    struct   Picture   :   IImage  
    {  
    public   void   Paint()  
    {  
    //   painting   code   goes   here  
    }  
    private   int   x,   y,   z;   //   other   struct   members  
    }  
   
   
   
   
    3.內部結構:  
   
   
    結構:  
   
   
    沒有預設的建構函式,但是可以新增建構函式  
   
   
    沒有解構函式  
   
   
    沒有   abstract   和   sealed(因為不能繼承)  
   
   
    不能有protected   修飾符  
   
   
    可以不使用new   初始化  
   
   
    在結構中初始化例項欄位是錯誤的  
   
   
    類:    
   
   
    有預設的建構函式  
   
   
    有解構函式  
   
   
    可以使用   abstract   和   sealed    
   
   
    有protected   修飾符  
   
   
    必須使用new   初始化  
   
   
    三.如何選擇結構還是類  
   
   
    討論了結構與類的相同之處和差別之後,下面討論如何選擇使用結構還是類:  
   
   
    1.堆疊的空間有限,對於大量的邏輯的物件,建立類要比建立結構好一些  
   
   
    2.結構表示如點、矩形和顏色這樣的輕量物件,例如,如果宣告一個含有   1000   個點物件的陣列,則將為引用每個物件分配附加的記憶體。在此情況下,結構的成本較低。  
   
   
    3.在表現抽象和多級別的物件層次時,類是最好的選擇  
   
   
    4.大多數情況下該型別只是一些資料時,結構時最佳的選擇

 

 總結:

區別有三:  
  1:   類可以繼承,結構不可以.  
  2:   類是引用型別,結構是值型別  
  3:   類在堆中,結構在棧分配記憶體

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-564912/,如需轉載,請註明出處,否則將追究法律責任。

相關文章