程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> C#高級編程閱讀筆記一(關於值類型和引用類型)

C#高級編程閱讀筆記一(關於值類型和引用類型)

編輯:.NET實例教程
數據在內存中的存儲位置,取決於它的數據類型,在C#中,分為值類型和引用類型,值類型的數據存儲在內存中的堆棧中,每個變量或程序都有自己的堆棧,不可以共用一個堆棧地址。當數據一個值類型的變量傳遞到另一個相同類型的變量時,會在堆棧中分配兩個不同的地址。

而引用類型的數據存儲在內存中的堆中,可以不同的變量或程序共同使用同一個位置的數據。當數據從一個引用類型的變量傳遞到另一個相同類型的變量時,只是把這個變量的引用地址傳遞給新的變量,同時引用當前堆中存儲的數據。

可以通過實例得到詳細結論:
using System;
// 定義一個矩形類,類屬於引用類型
class RefRectangle
{
public int width;
public int height;
}
// 定義一個矩形結構,屬於值類型
struct ValRectangle
{
public int width;
public int height;
}

class RefValRectangle
{
public static void Main()
{
// 創建一個矩形對象,並將值傳遞給另一個新對象.
RefRectangle ref1 = new RefRectangle(); ;
ref1.width = 3;
ref1.height = 4;
RefRectangle ref3 = ref1;
Console.WriteLine("Dimensions of ref1 are : " + ref3.width.ToString() + "..." + ref3.height.ToString());
Console.WriteLine("Change Dimensions of ref1");
ref1.width = 10;
ref1.height = 50;
bool bTransfer = ref3.Equals(ref1);
Console.WriteLine("Dimensions of ref1 now are : " + ref3.width.ToString() + "....." + ref3.height.ToString());
Console.WriteLine(bTransfer.ToString());
Console.ReadLine();
// 創建一個矩形結構,將值傳遞給一個新的矩形結構
ValRectangle val1 = new ValRectangle();
val1.width = 3;
val1.height = 4;
ValRectangle val3 = val1;
Console.WriteLine("Dimensions of val1 are : " + val3.width.ToString() + "..." + val3.height.ToString());
Console.WriteLine("Change Dimensions of val1");
val1.width = 10;
val1.height = 50;
bool bPass = val3.Equals(val1);
Console.WriteLine("Dimensions of val1 now are : " + val3.width.ToString() + "....." + val3.height.ToString());
Console.WriteLine(bPass.ToString());
Console.ReadLine();
}
}

可以看到,當值類型的變量傳遞後,改變第一個變量,不會影響第二個變量的值,這是因為,當變量傳遞時,是在堆棧中又分配了一個地址給新的變量,所以這個兩個變量在傳遞發生後,不再有關系。
而引用類型的變量傳遞後,改變第一個,第二個變量隨之改變,是因為兩個變量同時引用堆中的一個地址的內容,當一個變量改變,對應與內存中的堆也隨之改變,而另外的一個變量也隨之改變。



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved