小聲嗶嗶 一直以來對於值類型與引用類型之間的區別都不是特別清晰,直到踩了坑.... 正好最新閑暇,便想著梳理梳理這一兩年來遇到的奇葩問題和解決方案,順便就把它給拎出來記一下,免得以後再摔跤 值類型與引用類型的區別 今天為了說明值類型與引用類型的典型區別,準備把結構體(值類型)和類(引用類型)拉出來溜 ...
小聲嗶嗶
一直以來對於值類型與引用類型之間的區別都不是特別清晰,直到踩了坑....
正好最新閑暇,便想著梳理梳理這一兩年來遇到的奇葩問題和解決方案,順便就把它給拎出來記一下,免得以後再摔跤
值類型與引用類型的區別
今天為了說明值類型與引用類型的典型區別,準備把結構體(值類型)和類(引用類型)拉出來溜溜
首先咱們先定義一下
/// <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去買包子,花的都是你銀行卡裡的錢
最後,遇到這個坑別忘了跳一跳,摔到裡面真的挺疼的