天天看點

值類型和引用類型

​C#有三種類型,其中指針類型微軟不建議使用,是以不介紹了。

值類型和應用類型,其實很好區分和解釋。我就用一段代碼一個圖說明清楚

值類型和引用類型

* 自定義類型:結構體

 代碼如下:

/// <summary>
    /// 結構體
    /// </summary>
    public struct People
    {
        public  string Name { get; set; }
     
        public  int Age { get; set; }

        public void Write()
        {
            Console.WriteLine($"值類型 Name={Name} ,Age={Age}");
        }
    }

    /// <summary>
    /// 引用類
    /// </summary>
    public class PeopleClass
    {
        public string Name { get; set; }
       
        public int Age { get; set; }

        public void Write()
        {
            Console.WriteLine($"引用類型 Name={Name} ,Age={Age}");
        }
    }      
static void Main(string[] args)
        {
            Console.WriteLine("值類型輸出開始=================");
            People p = new People();
            p.Name = "tom";
            p.Age = 18;
            p.Write();
            People pp = p;
            pp.Write();
            Console.WriteLine("pp改變一下值=================");
            pp.Name = "jack";
            pp.Age = 20;
            pp.Write();
            p.Write();
            Console.WriteLine("值類型輸出結束=================");

            Console.WriteLine("引用類型輸出開始=================");
            PeopleClass pc=new PeopleClass();
            pc.Name = "tom";
            pc.Age = 18;
            pc.Write();
            PeopleClass pcref = pc;
            pcref.Write();
            Console.WriteLine("pcref改變一下值=================");
            pcref.Name = "jack";
            pcref.Age = 20;
            pcref.Write();
            pc.Write();
            Console.WriteLine("引用類型輸出結束=================");
            Console.ReadLine();
        }      

輸出結果:

值類型輸出開始=================

值類型 Name=tom ,Age=18

pp改變一下值=================

值類型 Name=jack ,Age=20

值類型輸出結束=================

引用類型輸出開始=================

引用類型 Name=tom ,Age=18

pcref改變一下值=================

引用類型 Name=jack ,Age=20

引用類型輸出結束=================

最終結論:

可以看出由于類是需要開辟堆區空間,變量是指向堆區的引用。是以引用類型指派不會改變堆區的引用。而值類型是直接在棧區開辟空間。

關于堆區和棧區, 比較抽象 。我最近在複讀《深入了解計算機系統》,裡面講到了計算機存儲原理可以解惑。

在字段作用域的影響下,棧區會被新值覆寫。而堆區會自動被GC處理。

值類型:高效,缺點作為資料的載體。沒有多态。

引用類型:需要被GC,實作豐富。