這篇文章主要介紹C#中值類(lèi)型與引用類(lèi)型的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)公司是網(wǎng)站建設(shè)技術(shù)企業(yè),為成都企業(yè)提供專(zhuān)業(yè)的網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站,網(wǎng)站設(shè)計(jì),網(wǎng)站制作,網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制適合企業(yè)的網(wǎng)站。十載品質(zhì),值得信賴!
這篇文章主要為大家詳細(xì)介紹了C#中值類(lèi)型和引用類(lèi)型的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
在C#中,值類(lèi)型和引用類(lèi)型是相當(dāng)重要的兩個(gè)概念,必須在設(shè)計(jì)類(lèi)型的時(shí)候就決定類(lèi)型實(shí)例的行為。如果在編寫(xiě)代碼時(shí)不能理解引用類(lèi)型和值類(lèi)型的區(qū)別,那么將會(huì)給代碼帶來(lái)不必要的異常。很多人就是因?yàn)闆](méi)有弄清楚這兩個(gè)概念從而在編程過(guò)程中遇到了很多問(wèn)題,在這里博主淺談對(duì)值類(lèi)型和引用類(lèi)型的認(rèn)識(shí)。
首先從概念上看,值類(lèi)型直接存儲(chǔ)其值,而引用類(lèi)型存儲(chǔ)對(duì)其值的引用。從而這兩種類(lèi)型存儲(chǔ)在內(nèi)存的不同地方。
其次從內(nèi)存空間上看,值類(lèi)型是在棧中操作,而引用類(lèi)型則在堆中分配存儲(chǔ)單元。
棧在編譯的時(shí)候就分配好內(nèi)存空間,在代碼中有棧的明確定義,而堆是程序運(yùn)行中動(dòng)態(tài)分配的內(nèi)存空間,可以根據(jù)程序的運(yùn)行情況動(dòng)態(tài)地分配內(nèi)存的大小。因此,值類(lèi)型總是在內(nèi)存中占用一個(gè)預(yù)定義的字節(jié)數(shù)。而引用類(lèi)型的變量則在棧中分配一個(gè)內(nèi)存空間,這個(gè)內(nèi)存空間包含的是對(duì)另一個(gè)內(nèi)存位置的引用,這個(gè)位置是托管堆中的一個(gè)地址,即存放此變量實(shí)際值的地方。
也就是說(shuō)值類(lèi)型相當(dāng)于現(xiàn)金,要用就直接用,而引類(lèi)型相當(dāng)于存折,要用得先去銀行取。
但值類(lèi)型在棧上分配內(nèi)存,而引用類(lèi)型在托管堆上分配內(nèi)存,只是一種籠統(tǒng)的說(shuō)法。下面對(duì)其進(jìn)行詳細(xì)描述。
(1)對(duì)于值類(lèi)型的實(shí)例,如果作為方法中的局部變量,則被創(chuàng)建在線程棧上;如果該實(shí)例作為類(lèi)型的成員,則作為類(lèi)型成員的一部分,連同其他類(lèi)型字段存放在托管堆上。
每種值類(lèi)型均有一個(gè)隱式的默認(rèn)構(gòu)造函數(shù)來(lái)初始化該類(lèi)型的默認(rèn)值。例如:
int i = new int();
等價(jià)于:
Int32 i = new Int32();
等價(jià)于:
int i = 0;
等價(jià)于:
Int32 i = 0;
使用new運(yùn)算符時(shí),將調(diào)用特定類(lèi)型的默認(rèn)構(gòu)造函數(shù)并對(duì)變量賦以默認(rèn)值。在上例中,默認(rèn)構(gòu)造函數(shù)將值0賦給了i。
說(shuō)明:C#的所有值類(lèi)型均隱式派生自System.ValueType,而System.ValueType直接派生于System.Object。即System.ValueType本身是一個(gè)類(lèi)類(lèi)型,而不是值類(lèi)型。其關(guān)鍵在于ValueType重寫(xiě)了Equals方法,從而對(duì)值類(lèi)型按照實(shí)例的值來(lái)比較,而不是引用地址來(lái)比較。
(2)引用類(lèi)型的實(shí)例創(chuàng)建在托管堆上。
下面以一段代碼來(lái)詳細(xì)講解一下值類(lèi)型與引用類(lèi)型的區(qū)別
namespace Test { class Program { static void Main(string[] args) { //調(diào)用ReferenceAndValue類(lèi)中的Demonstration方法 ReferenceAndValue.Demonstration(); Console.ReadLine(); } } public class stamp //定義一個(gè)類(lèi) { public string Name { get; set; } //定義引用類(lèi)型 public int Age { get; set; } //定義值類(lèi)型 } public static class ReferenceAndValue //定義一個(gè)靜態(tài)類(lèi) { public static void Demonstration() //定義一個(gè)靜態(tài)方法 { stamp Stamp_1 = new stamp { Name = "Premiere", Age = 25 }; //實(shí)例化 stamp Stamp_2 = new stamp { Name = "Again", Age = 47 }; //實(shí)例化 int age = Stamp_1.Age; //獲取值類(lèi)型Age的值 Stamp_1.Age = 22; //修改值類(lèi)型的值 stamp guru = Stamp_2; //獲取Stamp_2中的值 Stamp_2.Name = "Again Amend"; //修改引用的Name值 Console.WriteLine("Stamp_1's age:{0}", Stamp_1.Age); //顯示Stamp_1中的Age值 Console.WriteLine("age's value:{0}", age); //顯示age值 Console.WriteLine("Stamp_2's name:{0}", Stamp_2.Name); //顯示Stamp_2中的Name值 Console.WriteLine("guru's name:{0}", guru.Name); //顯示guru中的Name值 } } }
通過(guò)運(yùn)行上面一段程序之后我們可以看出,當(dāng)改變了Stamp_1.Age的值時(shí),age并沒(méi)有跟著變,但在改變了anders.Name的值后,guru.Name卻跟著變了,這就是值類(lèi)型和引用類(lèi)型的區(qū)別。在聲明age值類(lèi)型變量時(shí),將 Stamp_1.Age的值賦給它,這時(shí),編譯器在棧上分配了一塊空間,然后把Stamp_1.Age的值填進(jìn)去,二者沒(méi)有任何關(guān)聯(lián),就像在計(jì)算機(jī)中復(fù)制文件一樣,只是把Stamp_1.Age的值拷貝給age了。而引用類(lèi)型則不同,在聲明guru時(shí)把Stamp_2賦給它,前面說(shuō)過(guò),引用類(lèi)型包含的只是堆上數(shù)據(jù)區(qū)域地址的引用,其實(shí)就是把Stamp_2的引用也賦給guru,因此它們指向了同一塊內(nèi)存區(qū)域。既然是指向同一塊區(qū)域,不管修改誰(shuí),另一個(gè)的值都會(huì)跟著改變,就像信用卡跟親情卡一樣,用親情卡取了錢(qián),與之關(guān)聯(lián)的信用卡賬上也會(huì)跟著發(fā)生變化。
以上是“C#中值類(lèi)型與引用類(lèi)型的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!