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

C#值類型和引用類型

一、簡單比較

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

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

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

  值類型的實例一般是在線程棧上分配的(靜態分配),可是在某些情形下能夠存儲在堆中。引用類型的對象老是在進程堆中分配(動態分配)。數據結構

 

二、相同點

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

 

三、不一樣點

  1)範圍方面數據結構和算法

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

 

  2)內存分配方面函數

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

 

  3)適用場合spa

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

  • 引用類型能夠派生出新的類型,而值類型不能,由於全部的值類型都是密封(seal)的;
  • 引用類型能夠包含null值,值類型不能(可空類型功能容許將 null 賦給值類型,如   int? a = null;  );
  • 引用類型變量的賦值只複製對對象的引用,而不復制對象自己。而將一個值類型變量賦給另外一個值類型變量時,將複製包含的值。

 

結構體和類

一、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++中的結構體和類體現了數據結構和算法的結合。
 

二、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

相關文章
相關標籤/搜索