C# 值類型和引用類型等值判斷

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();


        }
    }
}

  

運行結果:spa

相關文章
相關標籤/搜索