c 中的兩種資料型別 值型別和引用型別

2021-04-20 23:05:54 字數 2777 閱讀 8868

我們都知道,

c#的兩大資料型別分別為值型別和引用型別。很多人或許閉著眼睛都能說出值型別包括簡單型別、結構體型別和列舉型別,引用型別包括自定義類、陣列、介面、委託等,但是當被問及到二者之間的聯絡和區別,什麼時候用

struct

什麼時候用

class

時,就常常混淆不清了。為此,了解值型別和引用型別的本質差異就變的很有必要了。

值型別直接儲存其值,變數本身就包含了其實例資料,而引用型別儲存的只是例項資料的記憶體引用。因此,乙個值型別變數就永遠不會影響到其他的值型別變數,而兩個引用型別變數則很有可能指向同一位址,從而發生相互影響。

gc來控制其**,需要進行位址轉換,效率降低,這也正是

c#需要定義兩種資料型別的原因之一。

值型別均隱式派生自

system.valuetype

,而system.valuetype

又直接派生於

system.object,

每種值型別均有乙個隱式的預設建構函式來初始化該型別的預設值,注意所有的值型別都是密封(

sealed

)的,所以無法派生出新的值型別。而且

system.valuetype

本身是乙個類型別,而不是值型別,因為它重寫了

object

的equals()

方法,所以對值型別將按照例項的值來比較,而不是比較引用位址。c#

的統一型別系統,使得值型別可以轉化為物件來處理,這就是常說的裝箱和拆箱。由於裝拆箱需要裝建全新物件或做強制型別轉換,這些操作所需時間和運算要遠遠大於賦值操作,因此不提倡使用它,同時也要盡量避免隱式裝拆箱的發生。

注:棧是作業系統分配的乙個連續的記憶體區域,用於快速訪問資料。因為值型別的容量是已知的,因此它可儲存在棧上。而託管堆是clr在應用程式啟動時為應用程式預留的一塊連續記憶體區,是用於動態記憶體分配的記憶體區,引用型別的容量只有到執行時才能確定,所有用堆來儲存引用型別。 c#

的兩種資料型別延伸之一--

巢狀型別的記憶體分配

對於引用型別巢狀值型別,以及值型別巢狀引用型別的情況下,記憶體分配可以根據以下兩條規律來判斷:

•引用型別始終部署在託管堆上;

•值型別總是分配在它宣告的地方:作為欄位時,跟隨其所屬的物件儲存;作為區域性變數時,儲存在棧上。  

c#的兩種資料型別延伸之二

--string

型別 string

是乙個很有意思的引用型別,為什麼說它很有意思呢?因為它表現了很多值型別的特點。請看一下**示例:

示例1string str1 = "abc";

string str2 = str1;

str1 = "123";

console.writeline(str2);

示例2(msdn

上的例子

)string a = "hello";

string b = "h";

b += "ello";

console.writeline(a == b);示例1

的輸出結果是

abc,改變

str1

的值對str2

沒有影響。

示例2的輸出結果是

true

。 這樣的結果會使我們誤以為

string

就是值型別。其實不然,示例1中

str1 = "123"

語句編譯器私底下建立了乙個新的字串物件來儲存新的字串行

"123"

,也就是此

str1

已非彼str1

了,「此」

str1

的值的改變也就不能影響「彼」

str1

的值了,當然

str2

的值也就不會改變了。實質上

str1 = "123"

是str1=new string("123")

的簡寫,它的每一次賦值都會拋掉原來的物件而生成乙個新的字串物件,分配新的記憶體空間,因此

string

是不可改變的。如果要建立可修改的字串,可使用

stringbuilder

以獲得更好的效能。至於示例

2是因為為了方便比較字串的值重定義了string的運算子==

!=

c#的兩種資料型別延伸之三

--struct

和class 

class

和struct

的語法基本相同,從宣告到使用,都很相似。但是

struct

的約束要比

class

多,理論上,

struct

能做到的

class

都能做到,但

class

能做到的

stuct

卻不一定做的到,也就是說

struct

都能被class

所代替。那麼為什麼還要使用

struct

呢?存在即是合理的,

struct

在很多方面有著效能優勢。讓我們看看它們的主要區別在**?

比較struct

和class

的不同,可以得出以下幾條

struct

和class

的使用原則:

1 在表示諸如點、矩形等主要用來儲存資料的輕量級物件時,首選

struct

。 2

在表示資料量大、邏輯複雜的大物件時,首選

class

。 3

在表現抽象和多級別的物件層次時,

class

是最佳選擇。

js的兩種資料型別

js中的資料型別總體來說分為兩種,他們分別是 1 值型別 基本型別 數值型 number 字元型別 string 布林值型 boolean null 和 underfined 2 引用型別 類 函式,物件,陣列等 值型別理解 變數之間的互相賦值,是指開闢一塊新的記憶體空間,將變數值賦給新變數儲存到新...

C 的資料型別 值型別和引用型別

c 的資料型別包含兩大類 值型別和址型別 引用型別 值型別 只是用來存放資料的型別。值型別包括 簡單型別 純量型別 結構型別 struct 列舉型別 enum 簡單型別包括 整數型別 布林型別 實數型別 字元型別 char 整數型別 sbyte byte short ushort int uint ...

C 的兩種類據型別 值型別和引用型別

值型別直接儲存其值,而引用型別儲存對其值的引用。部署 託管堆上部署了所有引用型別。引用型別 基類為objcet 值型別 均隱式派生自system.valuetype 值型別 byte,short,int,long,float,double,decimal,char,bool 和 struct 統稱為...