區別值類型和引用類型的重要一點就是值類型賦值的時候是給出一塊內存空間,空間裏放下要賦給值類型的值。而引用類型是開闢一塊內存空間,空間裏放下的是要賦給引用類型值的指向地址。
就像一個是複製了銀行卡里的現金,你花了你複製的現金,和該銀行卡是沒有關係的。而引用類型是複製了一個銀行卡,此卡爲銀行卡的副卡,因爲他們的指向地址是一樣的,所以當你使用副卡
的時候,主卡里的錢也會隨之變動。
下面給出一段代碼。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace WindowsConsoleApplicationValueAndReference { class Program { static void Main(string[] args) { ReferenceAndValue.ReferenceAndValueMethod(); } } public class Person { public string Name { get; set; } public int Age { get; set; } } public static class ReferenceAndValue { public static void ReferenceAndValueMethod() { Person tang = new Person { Name = "Andelshejlsberge", Age = 25 }; int age = tang.Age;//age=tang.age=25 tang.Age = 22; Person name = tang;//name.Name=andelshejlsberge tang.Name = "tangxuelong";//tang.name=tangxuelong name.name=tang.name=tangxuelong Console.WriteLine("tang.Name={0}",tang.Name); Console.WriteLine("tang.age={0}", tang.Age); Console.WriteLine("age={0}", age); Console.WriteLine("name={0}", name.Name); Console.ReadLine(); } } }
分析一下代碼。首先創建了一個person類,該類中包含name和age倆個屬性
我們在方法中創建person的對象tang,初始化對象的name和age。
這時候看下一步,我們將對象tang的age賦值給一個int類型的變量age,然後改變對象tang的age的值,運行結果會告訴我們,此時age=25,tang.age=22;
接下來我們繼續看下面的代碼,繼續創建一個對象將tang賦值給該對象。那麼此時如果加入斷點的話我們都知道name.Name=tang.Name=andershejlsberge這是沒錯的。那麼接下來像上面一樣我們改變tang.name的值我們會發現,name.name的值此時也改變了。
就像開始說的那樣,引用類型不僅僅分配了內存空間,還解析了內存塊的指向地址。
裝箱和拆箱
裝箱和拆箱其實就是引用類型和值類型之間的轉換
值類型轉換爲引用類型就是裝箱,引用類型轉換爲值類型就是拆箱。
public static class boxingAndUnboxing { public static void boxingandunboxing() { int ageInt = new int(); //boxing object age =(object)ageInt; age = null; //unboxing ageInt = (int)age; Console.WriteLine(ageInt); } }
分析一下上面的代碼。這段代碼會拋出System.NullReferenceException異常,因爲age爲引用類型,引用類型是可以賦空值的,然後將引用類型轉換爲值類型時,引用類型沒有值。。
所以就拋出了異常。而去掉這段代碼輸出結果爲0,這是因爲我們沒有初始化,默認的值類型變量的值就爲0