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,實作豐富。