C#中值型別與引用型別的區別
阿新 • • 發佈:2018-12-12
值型別是直接儲存一個數值,而引用型別是儲存對值的引用,這兩種型別分別儲存在不用的記憶體區域。而從記憶體上看,值型別是在棧中的操作,而引用型別是在堆中的操作。值型別是具體的那個數值所佔用的空間大小,而引用型別是存放那個數值的空間地址。 我們知道,在C#中,結構體是值型別,類是引用型別。值型別可以減少對堆的管理、使用,減少垃圾回收,表現出更好的效能。但是值型別也有不好的一面,比如會涉及到裝箱拆箱等操作。而C#中的委託(Delegate)是一種引用型別,該引用型別與其它引用型別有所不同,在委託物件的引用中存放的不是對資料的引用,而是存放對方法的引用,即在委託的內部包含一個指向某個方法的指標。通過使用委託把方法的引用封裝在委託物件中,然後將委託物件傳遞給呼叫引用方法的程式碼。
通過程式碼說明如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Stock { class Program { static void Main(string[] args) { Refer.show(); //靜態方法不需要例項化 } } public class stamp //定義一個stamp類 { public string Name { get; set; } //作為引用型別 public int age { get; set; } //作為值型別 } public static class Refer //定義靜態類 { public static void show() //定義靜態方法 { stamp stamp1 = new stamp { Name = "xiaoming", age = 22 }; stamp stamp2 = new stamp { Name = "xiaoqing", age = 23 }; int age = stamp1.age; stamp1.age = 34; stamp stamp3 = stamp2; //引用型別 stamp2.Name = "xaiohuang"; Console.WriteLine("stamp1's age : {0}", stamp1.age); Console.WriteLine("Current age : {0}", age); Console.WriteLine("stamp2's Name : {0}", stamp2.Name); Console.WriteLine("stamp3's Name : {0}", stamp3.Name); Console.ReadLine(); } } }
執行結果如下:
執行結果分析:可以看到,當改變Stamp1.age的值時,變數age的值沒跟著改變。而在改變了stamp2.Name的值的時候,stamp2.Name的值跟著改變了。這是因為引用型別只是包含堆上面資料區域中地址的引用,他們都指向了同一塊記憶體區域。所以當stamp3引用stamp2時(stamp stamp3 = stamp2;),stamp2改變的值是能夠影響stamp3的。當然,改變stamp3的值也能夠影響到stamp2。