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


        }
    }
}

  

運行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM