一直以來對於值類型與引用類型之間的區別都不是特別清晰,直到踩了坑....
正好最新閒暇,便想着梳理梳理這一兩年來遇到的奇葩問題和解決方案,順便就把它給拎出來記一下,省得之後再摔跤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去買包子,花的都是你銀行卡里的錢
最後,遇到這個坑別忘了跳一跳,摔到裏面真的挺疼的測試