標籤:style blog http color 使用 os io strong
區別實值型別和參考型別的重要一點就是實值型別賦值的時候是給出一塊記憶體空間,空間裡放下要賦給實值型別的值。而參考型別是開闢一塊記憶體空間,空間裡放下的是要賦給參考型別值的指向地址。
就像一個是複製了銀行卡裡的現金,你花了你複製的現金,和該銀行卡是沒有關係的。而參考型別是複製了一個銀行卡,此卡為銀行卡的副卡,因為他們的指向地址是一樣的,所以當你使用副卡
的時候,主卡裡的錢也會隨之變動。
下面給出一段代碼。
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