值類型和引用類型的區別,struct和class的區別
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語言中的結構體只涉及到數據結構
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的區別