1. 程式人生 > >值類型和引用類型的區別,struct和class的區別

值類型和引用類型的區別,struct和class的區別

tro 處理 數據結構和算法 ron ever ring net string 分配

C#值類型和引用類型

1、簡單比較

  值類型的變量直接存儲數據,而引用類型的變量持有的是數據的引用,數據存儲在數據堆中。

  值類型(value type):byte,short,int,long,float,double,decimal,char,bool 和 struct 統稱為值類型。值類型變量聲明後,不管是否已經賦值,編譯器為其分配內存。

技術分享

  引用類型(reference type):string 和 class統稱為引用類型。當聲明一個類時,只在棧中分配一小片內存用於容納一個地址,而此時並沒有為其分配堆上的內存空間。當使用 new 創建一個類的實例時,分配堆上的空間,並把堆上空間的地址保存到棧上分配的小片空間中。

技術分享

  值類型的實例通常是在線程棧上分配的(靜態分配),但是在某些情形下可以存儲在堆中。引用類型的對象總是在進程堆中分配(動態分配)。

2、相同點

  • 引用類型可以實現接口,值類型當中的結構體也可以實現接口;
  • 引用類型和值類型都繼承自System.Object類。

3、不同點

  1)範圍方面

  • C#的值類型包括:結構體(數值類型、bool型、用戶定義的結構體),枚舉,可空類型。
  • C#的引用類型包括:數組,用戶定義的類、接口、委托,object,字符串。

  2)內存分配方面

  • 數組的元素不管是引用類型還是值類型,都存儲在托管堆上。
  • 引用類型在棧中存儲一個引用,其實際的存儲位置位於托管堆。簡稱引用類型部署在托管推上。而值類型總是分配在它聲明的地方:作為字段時,跟隨其所屬的變量(實 例)存儲;作為局部變量時,存儲在棧上。(棧的內存是自動釋放的,堆內存是.NET中會由GC來自動釋放)

  3)適用場合

  值類型在內存管理方面具有更好的效率,並且不支持多態,適合用做存儲數據的載體;引用類型支持多態,適合用於定義應用程序的行為。

  • 引用類型可以派生出新的類型,而值類型不能,因為所有的值類型都是密封(seal)的;
  • 引用類型可以包含null值,值類型不能(可空類型功能允許將 null 賦給值類型,如 int? a = null; );
  • 引用類型變量的賦值只復制對對象的引用,而不復制對象本身。而將一個值類型變量賦給另一個值類型變量時,將復制包含的值。

結構體和類

1、C和C++中結構體的不同

  1)C語言中的結構體不能為空

  為空,會報錯1>d:\myproject\visual studio 2013\projects\myc++\main.c(71): error C2016: C 要求一個結構或聯合至少有一個成員

  2) C語言中的結構體只涉及到數據結構

  C語言中的結構體只涉及到數據結構,而不涉及到算法,也就是說在C中數據結構和算法是分離的。換句話說就是C語言中的結構體只能定義成員變量,但是不能定義成員函數。然而在C++中既可以定義成員變量又可以定義成員函數, C++中的結構體和類體現了數據結構和算法的結合。

2、C++中的結構體與類的區別

  1)概念

  class和struct的語法基本相同,從聲明到使用,都很相似,但是struct的約束要比class多,理論上,struct能做到的class都能做到,但class能做到的stuct卻不一定做的到。

  2)類型

  struct是值類型,class是引用類型,因此它們具有所有值類型和引用類型之間的差異。

  3)效率

  由於堆棧的執行效率要比堆的執行效率高,但是堆棧資源卻很有限,不適合處理邏輯復雜的大對象,因此struct常用來處理作為基類型對待的小對象,而class來處理某個商業邏輯。

  4)關系

  struct不僅能繼承也能被繼承 ,而且可以實現接口,不過Class可以完全擴展。內部結構有區別,struct只能添加帶參的構造函數,不能使用abstract和protected等修飾符,不能初始化實例字段。

參考文章:

1. 詳解C結構體、C++結構體 和 C++類的區別

http://blog.csdn.net/loving_forever_/article/details/51483828#comments

2. C#詳解值類型和引用類型區別

http://blog.csdn.net/qiaoquan3/article/details/51202926#comments

值類型和引用類型的區別,struct和class的區別