C#學習筆記(基礎知識回顧)之值類型和引用類型


一:C#把數據類型分為值類型和引用類型

  1.1:從概念上來看,其區別是值類型直接存儲值,而引用類型存儲對值的引用。

  1.2:這兩種類型在內存的不同地方,值類型存儲在堆棧中,而引用類型存儲在托管對上。存儲位置的不同會有不同的影響。

例如int類型是值類型:int x,y; x=10;y=x;y=20;前三個語句會在內存的兩個地方存儲值10。改變y的值不會影響x。

 

如果已經定義了一個類Test,Test是一個引用類型,有一個int類型的成員變量value,執行完如下代碼后,只有一個Test對象。x和y都指向包含該對象的內存位置,申明這兩個對象只保留一個引用而不會實例化給定類型的對象。創建對象必須使用new關鍵字。由於x和y引用同一個對象,所以對y的修改會影響x。因此結果為10和20

Test x, y;
x=new Test(); x.Value = 10; y = x; Console.WriteLine("X的值為:"+x.Value); y.Value = 20; Console.WriteLine("X的值為:" + x.Value); Console.ReadKey();

二:CTS類型

  2.1C#認可的基本預定義類型沒有內置於C#語言中,而是內置於.NETFramework中,例如申明一個int類型的數據時,實際上是System.Int32的一個實例,其意義在於可以把所有的基本數據類型看成支持某些方法的類。例如把int i轉換為string,可以使用string s = i.ToString();

  引用類型和值類型都繼承自System.Object類。不同的是,幾乎所有的引用類型都直接從System.Object繼承,而值類型則繼承其子類,即直接繼承System.ValueType。

  預定義的值類型包括整形、浮點類型,decimal類型,bool類型,字符類型等。預定義的引用類型 根類型Object類型,string類型。

  2.2 string類型,string類型是引用類型,但是與引用類型常見的行為有一些區別。字符串是不可改變的,修改其中一個字符串就會創建一個全新的string對象,而另一個字符串不發生變化。string類型的很多操作反而看起來和值類型相似,例如:

       

          

 三:關於值類型和引用類型判斷是否相等。

  3.1 當比較兩個值類型時,進行的是內容比較;而比較兩個引用類型時,進行的是引用比較。示例如下:

  3.2 string 是一個例外,string比較可以直接使用==或Equal(),CLR對string類型的比較會比較其值而不是引用。這點看起來更像是值類型的特性,而實際上是重載了運算符 "==" 和方法Equals ,系統解析的時候會直接比較String 的內容。

 

 關於值類型和引用類型的值傳遞和引用傳遞可看下一篇:

C#學習筆記(基礎知識回顧)之值傳遞和引用傳遞


免責聲明!

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



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