C#中關於值類型和引用類型的區別

小聲嗶嗶

一直以來對於值類型與引用類型之間的區別都不是特別清晰,直到踩了坑....
正好最新閒暇,便想着梳理梳理這一兩年來遇到的奇葩問題和解決方案,順便就把它給拎出來記一下,省得之後再摔跤git

值類型與引用類型的區別

今天爲了說明值類型與引用類型的典型區別,準備把結構體(值類型)和類(引用類型)拉出來溜溜github

首先我們先定義一下

/// <summary>
    /// 類
    /// </summary>
    class TestClass
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

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

而後咱看代碼

class Program
    {
        static void Main(string[] args)
        {
            //測試引用類型
            TestClass c1 = new TestClass { Id = 0, Name = "未定義" };
            TestClass c2 = c1;//c1給了c2
            c2.Id = 1;c2.Name = "a";
            Console.WriteLine($"c1[{c1.Id},{c1.Name}]");
            //測試值類型
            TestStruct s1 = new TestStruct { Id = 0, Name = "未定義" };
            TestStruct s2 = s1;//s1給了s2
            s2.Id = 2; s2.Name = "b";
            Console.WriteLine($"s1[{s1.Id},{s1.Name}]");
            Console.ReadKey();
        }
    }

最後看結果

結束

好了,結果顯而易見。
c1和s1我一直沒有動過它,s1(值類型)卻是乖乖的,可是c1(引用類型)卻跟着c2變了,由此咱們能夠想到微信

值類型的每一次賦值都會執行一次逐字段的複製,引用類型的賦值只是指針的傳遞,其實也是生成新的指針實例。app

也就是說,我們在c1和c2之間進行值傳遞的時候,傳的其實只是內存地址而已。就像你有一張銀行卡,你用它綁了支付寶又用它綁了微信,不管你用哪一個app去買包子,花的都是你銀行卡里的錢
最後,遇到這個坑別忘了跳一跳,摔到裏面真的挺疼的測試

相關代碼地址(GitHub)指針

相關文章
相關標籤/搜索