值類型與引用類型的區別

1、概念講解:

一、值類型:
ui

包括:sbyte、short、int、long、float、double、decimal(以上值類型有符號)spa

   byte、ushort、uint、ulong(以上值類型無符號)code

   bool、char對象

二、引用類型:
blog

包括:對象類型、動態類型、字符串類型內存

2、具體區別:

一、值類型:ci

byte b1 = 1; byte b2 = b1; Console.WriteLine("{0},{1}。", b1, b2); b2 = 2; Console.WriteLine("{0},{1}。", b1, b2); Console.ReadKey();

解釋:字符串

byte b1 = 1;聲明b1時,在棧內開闢一個內存空間保存b1的值1。string

byte b2 = b1;聲明b2時,在棧內開闢一個內存空間保存b1賦給b2的值1。it

Console.WriteLine("{0},{1}。", b1, b2);輸出結果爲1,1。

b2 = 2;將b2在棧中保存的值1改成2。

Console.WriteLine("{0},{1}。", b1, b2);輸出結果爲1,2。

二、引用類型:

string[] str1 = new string[] { "a", "b", "c" }; string[] str2 = str1; for (int i = 0; i < str1.Length; i++) { Console.Write(str1[i] + " "); } Console.WriteLine(); for (int i = 0; i < str2.Length; i++) { Console.Write(str2[i] + " "); } Console.WriteLine(); str2[2] = "d"; for (int i = 0; i < str1.Length; i++) { Console.Write(str1[i] + " "); } Console.WriteLine(); for (int i = 0; i < str2.Length; i++) { Console.Write(str2[i] + " "); } Console.ReadKey();

解釋:

string[] str1 = new string[] { "a", "b", "c" };聲明str1時,首先在堆中開闢一個內存空間保存str1的值(假設:0a001),而後在棧中開闢一個內存空間保存0a001地址

string[] str2 = str1;聲明str2時,在棧中開闢一個內存空間保存str1賦給str2的地址

for (int i = 0; i < str1.Length; i++)

{

  Console.Write(str1[i] + " ");

}

Console.WriteLine();

for (int i = 0; i < str2.Length; i++)

{

  Console.Write(str2[i] + " ");

}

Console.WriteLine();

輸出結果爲:

a b c

a b c

str2[2] = "d";修改值是修改0a001的值

for (int i = 0; i < str1.Length; i++)

{

  Console.Write(str1[i] + " ");

}

Console.WriteLine();

for (int i = 0; i < str2.Length; i++)

{

  Console.Write(str2[i] + " ");

}

輸出結果爲:

a b d

a b d

三、string類型:(特殊)

string str1 = "abc"; string str2 = str1; Console.WriteLine("{0},{1}。", str1, str2); str2 = "abd"; Console.WriteLine("{0},{1}。", str1, str2); Console.ReadKey();

解釋:

string str1 = "abc";聲明str1時,首先在堆中開闢一個內存空間保存str1的值(假設:0a001),而後在棧中開闢一個內存空間保存0a001地址

string str2 = str1;聲明str2時,首先在堆中開闢一個內存空間保存str1賦給str2的值(假設:0a002),而後在棧中開闢一個內存空間保存0a002的地址

Console.WriteLine("{0},{1}。", str1, str2);輸出結果爲:
abc
abc

str2 = "abd";修改str2時,在堆中開闢一個內存空間保存修改後的值(假設:0a003),而後在棧中修改str2地址爲0a003地址

Console.WriteLine("{0},{1}。", str1, str2);輸出結果爲:
abc
abd

堆中內存空間0a002將被垃圾回收利用。

 

以上是我對值類型與引用類型的理解,但願能夠給須要的朋友帶來幫助。

相關文章
相關標籤/搜索