程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#學習之結構與類的區別

C#學習之結構與類的區別

編輯:關於C語言
最近有看到網上面試題提到結構魚類的區別,遂查看了msdn以及一些網上的資料總結了一下,一做學習之用 C#學習之結構與類的區別 數據結構和類實際上都是創建對象的模版,每個對象都包含數據,並提供了處理和訪問數據的方法。在語法上,非常相似,主要是使用關鍵字的區別。對於類和結構,都是使用關鍵字new來聲明實例:這個關鍵字對象創建對象,並對其進行初始化。   1、值類型和引用類型 結構是指類型,指類型在堆棧(棧)上分配地址,C#中的所有基類型都是結構類型(例如:int對應System.Int32結構); 類是引用類型,引用類型是在堆上分配地址; 堆棧的執行效率要比堆的執行效率高,可是堆棧的資源有限,不適合處理大的邏輯復雜的對象。所以結構處理作為基類型對待的小對象,而類處理某個商業邏輯; 因為結構是值類型所以結構之間的賦值可以創建新的結構,而類是引用類型,類之間的賦值只是復制引用;(所以在以結構為參數傳遞時,最好使用ref,這樣只傳遞地址引用,能夠提高效率,同時也應注意這樣結構的值也會隨著方法調用而改變) 關於堆和堆棧的比較參見http://blog.csdn.Net/fengziyoyo/archive/2006/12/28/1465761.ASPx。 注:
  a.雖然結構與類的類型不一樣,可是他們的基類型都是對象(object),c#中所有類型的基類型都是object
b.雖然結構的初始化使用了New操作符,可是結構對象依然分配在堆棧上,如果不使用New那麼在初始化所有字段之前,字段將保持為未賦值狀態,且對象不可用。   2、繼承性 結構:不能從另外一個結構或者類繼承,本身也不能被繼承,雖然結構沒有明確的Sealed申明,可是結構是隱式的Sealded; 類:完全可擴展,除非顯示的申明Sealed,否則類可以繼承其他類和接口,自身也可以被繼承; 注:雖然結構不能被繼承,可是結構能夠繼承接口,方式和類繼承接口一樣。   3、內部構造 結構: 沒有默認的構造函數,但是可以添加帶參數(結構不能添加不帶任何參數的構造函數)的構造函數; 沒有析構函數; 沒有abstract和sealed(因為不能繼承); 沒有portected修飾符,因為結構不能被繼承; 可以不使用new 初始化;(例如:Struct A; A.Property = tempA;) 在結構中初始化實例字段是錯誤的; (例如:Struct B { public P1=1; //Error,Initial Values not Allowed. public p2; } )   類: 有默認的構造函數;有析構函數;可以使用abstract和sealed;有protected修飾符; 必須使用new關鍵字初始化(靜態類除外)   總結:如何選擇結構還是類
  討論了結構與類的相同之處和差別之後,下面討論如何選擇使用結構還是類:

  1.堆棧的空間有限,對於大量的邏輯的對象,創建類要比創建結構好一些
  2.結構表示如點、矩形和顏色這樣的輕量對象,例如,如果聲明一個含有 1000 個點對象的數組,則將為引用每個對象分配附加的內存。在此情況下,結構的成本較低。
  3.在表現抽象和多級別的對象層次時,類是最好的選擇
  4.大多數情況下該類型只是一些數據時,結構時最佳的選擇
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved