運行結果: ...
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(); } } }
運行結果: