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


小聲嗶嗶

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

值類型與引用類型的區別

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

首先咱們先定義一下

    /// <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變了,由此我們可以想到

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

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

相關代碼地址(GitHub)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM