1. 程式人生 > >C#中值型別與引用型別的區別

C#中值型別與引用型別的區別

值型別是直接儲存一個數值,而引用型別是儲存對值的引用,這兩種型別分別儲存在不用的記憶體區域。而從記憶體上看,值型別是在棧中的操作,而引用型別是在堆中的操作。值型別是具體的那個數值所佔用的空間大小,而引用型別是存放那個數值的空間地址。 我們知道,在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。