標籤:
?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
實值型別 Name=tom ,Age=18
pp改變一下值=================
實值型別 Name=jack ,Age=20
實值型別 Name=tom ,Age=18
實值型別輸出結束=================
參考型別輸出開始=================
參考型別 Name=tom ,Age=18
參考型別 Name=tom ,Age=18
pcref改變一下值=================
參考型別 Name=jack ,Age=20
參考型別 Name=jack ,Age=20
參考型別輸出結束=================
最終結論:
可以看出由於類是需要開闢堆區空間,變數是指向堆區的引用。所以參考型別賦值不會改變堆區的引用。而實值型別是直接在棧區開闢空間的不存在引用。
關於堆區和棧區,如果沒有認知的話,我推薦一本書,可能大學都讀過《深入理解電腦系統》,我最近在複讀,略有見解。
在欄位範圍的影響下,棧區會被新值覆蓋。而堆區會自動被GC處理。
實值型別:高效,缺點作為資料的載體。沒有多態。
參考型別:需要被GC,實現豐富。
實值型別和參考型別