using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 堆和棧
{
class Program
{
static void Main(string[] args)
{
#region 引用類型
// s : 對象的引用【存儲在棧中】
//new Student() 【對象存儲在堆中】
Student s = new Student();//引用類型
s.Age = 88;
Console.WriteLine("初始對象s的Age是:" + s.Age.ToString()); // 輸出:88
Student s2 = s;//給引用類型賦值的時候,其實只是賦值了對象的引用【即是在棧中賦值了對象的引用,s和s2的引用地址都指向同一個堆上的地址】
s2.Age = 44;
Console.WriteLine("引用類型賦值后對象s2的Age是:" + s2.Age.ToString());// 輸出:44
Console.WriteLine("引用類型賦值后對象s的Age是:" + s.Age.ToString());// 輸出:44
#endregion
#region 值類型
//局部變量 【存儲在棧中】
int aaa = 0;//值類型
Console.WriteLine("初始aaa變量的值是:" + aaa.ToString()); // 輸出:0
int aaa2 = aaa;//給值類型變量賦值的時候,是創建了一個副本(即克隆,aaa2 和aaa沒一毛錢關系)
aaa2 = 99;
Console.WriteLine("值類型賦值后aaa變量的值是:" + aaa.ToString()); // 輸出:0
Console.WriteLine("值類型賦值后aaa2變量的值是:" + aaa2.ToString()); // 輸出:99
#endregion
#region 等值判斷
int i = 3;
int j = 3;
Console.WriteLine("值類型等值判斷:"+(i == j).ToString());// 輸出:true ,值類型等值判斷直接比較值本身
Student a = new Student();
a.Age = 3;
Student b = new Student();
b.Age = 3;
Console.WriteLine("引用類型等值判斷:"+(a == b).ToString());// 輸出:false ,引用類型等值判斷的是棧中的地址,不是比較數據的本身
//引用類型變量的賦值操作,復制的是引用,即內存地址,由於賦值后二者都指向同一內存地址,所以改變其中一個,另一個也會跟着改變,二者就像綁定在了一起。
Student c = a;
Console.WriteLine("引用類型等值判斷:" + (a == c).ToString());// 輸出:true ,引用類型等值判斷的是棧中的地址,不是比較數據的本身
#endregion
Console.ReadKey();
}
}
}

運行結果:

