欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#中值類型和引用類型解析

 更新時(shí)間:2017年09月30日 09:50:24   作者:Amedeo  
這篇文章主要為大家詳細(xì)介紹了C#中值類型和引用類型的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

在C#中,值類型和引用類型是相當(dāng)重要的兩個(gè)概念,必須在設(shè)計(jì)類型的時(shí)候就決定類型實(shí)例的行為。如果在編寫(xiě)代碼時(shí)不能理解引用類型和值類型的區(qū)別,那么將會(huì)給代碼帶來(lái)不必要的異常。很多人就是因?yàn)闆](méi)有弄清楚這兩個(gè)概念從而在編程過(guò)程中遇到了很多問(wèn)題,在這里博主淺談對(duì)值類型和引用類型的認(rèn)識(shí)。

首先從概念上看,值類型直接存儲(chǔ)其值,而引用類型存儲(chǔ)對(duì)其值的引用。從而這兩種類型存儲(chǔ)在內(nèi)存的不同地方。

其次從內(nèi)存空間上看,值類型是在棧中操作,而引用類型則在堆中分配存儲(chǔ)單元。

棧在編譯的時(shí)候就分配好內(nèi)存空間,在代碼中有棧的明確定義,而堆是程序運(yùn)行中動(dòng)態(tài)分配的內(nèi)存空間,可以根據(jù)程序的運(yùn)行情況動(dòng)態(tài)地分配內(nèi)存的大小。因此,值類型總是在內(nèi)存中占用一個(gè)預(yù)定義的字節(jié)數(shù)。而引用類型的變量則在棧中分配一個(gè)內(nèi)存空間,這個(gè)內(nèi)存空間包含的是對(duì)另一個(gè)內(nèi)存位置的引用,這個(gè)位置是托管堆中的一個(gè)地址,即存放此變量實(shí)際值的地方。

也就是說(shuō)值類型相當(dāng)于現(xiàn)金,要用就直接用,而引類型相當(dāng)于存折,要用得先去銀行取。

但值類型在棧上分配內(nèi)存,而引用類型在托管堆上分配內(nèi)存,只是一種籠統(tǒng)的說(shuō)法。下面對(duì)其進(jìn)行詳細(xì)描述。

(1)對(duì)于值類型的實(shí)例,如果作為方法中的局部變量,則被創(chuàng)建在線程棧上;如果該實(shí)例作為類型的成員,則作為類型成員的一部分,連同其他類型字段存放在托管堆上。

每種值類型均有一個(gè)隱式的默認(rèn)構(gòu)造函數(shù)來(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)用特定類型的默認(rèn)構(gòu)造函數(shù)并對(duì)變量賦以默認(rèn)值。在上例中,默認(rèn)構(gòu)造函數(shù)將值0賦給了i。

說(shuō)明:C#的所有值類型均隱式派生自System.ValueType,而System.ValueType直接派生于System.Object。即System.ValueType本身是一個(gè)類類型,而不是值類型。其關(guān)鍵在于ValueType重寫(xiě)了Equals方法,從而對(duì)值類型按照實(shí)例的值來(lái)比較,而不是引用地址來(lái)比較。

(2)引用類型的實(shí)例創(chuàng)建在托管堆上。

下面以一段代碼來(lái)詳細(xì)講解一下值類型與引用類型的區(qū)別

namespace Test 
  { 
      class Program 
      { 
        static void Main(string[] args) 
        { 
       //調(diào)用ReferenceAndValue類中的Demonstration方法 
          ReferenceAndValue.Demonstration(); 
          Console.ReadLine(); 
        } 
      } 
      public class stamp       //定義一個(gè)類 
      { 
        public string Name { get; set; }    //定義引用類型 
        public int Age { get; set; }    //定義值類型 
      } 
      public static class ReferenceAndValue   //定義一個(gè)靜態(tà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;     //獲取值類型Age的值 
          Stamp_1.Age = 22;     //修改值類型的值 
          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卻跟著變了,這就是值類型和引用類型的區(qū)別。在聲明age值類型變量時(shí),將 Stamp_1.Age的值賦給它,這時(shí),編譯器在棧上分配了一塊空間,然后把Stamp_1.Age的值填進(jìn)去,二者沒(méi)有任何關(guān)聯(lián),就像在計(jì)算機(jī)中復(fù)制文件一樣,只是把Stamp_1.Age的值拷貝給age了。而引用類型則不同,在聲明guru時(shí)把Stamp_2賦給它,前面說(shuō)過(guò),引用類型包含的只是堆上數(shù)據(jù)區(qū)域地址的引用,其實(shí)就是把Stamp_2的引用也賦給guru,因此它們指向了同一塊內(nèi)存區(qū)域。既然是指向同一塊區(qū)域,不管修改誰(shuí),另一個(gè)的值都會(huì)跟著改變,就像信用卡跟親情卡一樣,用親情卡取了錢(qián),與之關(guān)聯(lián)的信用卡賬上也會(huì)跟著發(fā)生變化。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#簡(jiǎn)單配置類及數(shù)據(jù)綁定

    C#簡(jiǎn)單配置類及數(shù)據(jù)綁定

    這篇文章主要介紹了C#簡(jiǎn)單配置類及數(shù)據(jù)綁定,原理比較簡(jiǎn)單,適用于一些小型項(xiàng)目。主要實(shí)現(xiàn)保存配置到j(luò)son文件、從文件或?qū)嵗虞d配置類的屬性值、數(shù)據(jù)綁定到界面控件的功能,需要的朋友可以參考一下
    2021-11-11
  • C#學(xué)習(xí)筆記之適配器模式詳解

    C#學(xué)習(xí)筆記之適配器模式詳解

    這篇文章主要為大家詳細(xì)介紹了C#學(xué)習(xí)筆記之適配器模式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • C# 手動(dòng)/自動(dòng)保存圖片的實(shí)例代碼

    C# 手動(dòng)/自動(dòng)保存圖片的實(shí)例代碼

    C# 手動(dòng)/自動(dòng)保存圖片的實(shí)例代碼,需要的朋友可以參考一下
    2013-03-03
  • C#中讓控件全屏顯示的實(shí)現(xiàn)代碼(WinForm)

    C#中讓控件全屏顯示的實(shí)現(xiàn)代碼(WinForm)

    有時(shí)候需要讓窗口中某一塊的內(nèi)容全屏顯示,比如視頻播放、地圖等等。經(jīng)過(guò)摸索,暫時(shí)發(fā)現(xiàn)兩種可行方法,如果有誰(shuí)知道其他方法,敬請(qǐng)告知
    2012-04-04
  • C#使用位域技術(shù)進(jìn)行對(duì)象二進(jìn)制序列化優(yōu)

    C#使用位域技術(shù)進(jìn)行對(duì)象二進(jìn)制序列化優(yōu)

    在操作系統(tǒng)中,進(jìn)程信息對(duì)于系統(tǒng)監(jiān)控和性能分析至關(guān)重要,這個(gè)過(guò)程中,如何將捕獲到的進(jìn)程對(duì)象轉(zhuǎn)換為二進(jìn)制數(shù)據(jù),并進(jìn)行優(yōu)化,以減小數(shù)據(jù)包的大小,成為了一個(gè)關(guān)鍵問(wèn)題,下面我們就來(lái)看看如何使用位域技術(shù)對(duì)C#對(duì)象進(jìn)行二進(jìn)制序列化優(yōu)化吧
    2024-01-01
  • c# winform多線程死循環(huán)踩坑

    c# winform多線程死循環(huán)踩坑

    本文主要介紹了c# winform多線程死循環(huán)踩坑,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • C#中的委托數(shù)據(jù)類型簡(jiǎn)介

    C#中的委托數(shù)據(jù)類型簡(jiǎn)介

    委托是一個(gè)類型安全的對(duì)象,它指向程序中另一個(gè)以后會(huì)被調(diào)用的方法(或多個(gè)方法)。通過(guò)本文給大家介紹C#中的委托數(shù)據(jù)類型簡(jiǎn)介,對(duì)c委托類型相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2016-03-03
  • C# 站點(diǎn)IP訪問(wèn)頻率限制 針對(duì)單個(gè)站點(diǎn)的實(shí)現(xiàn)方法

    C# 站點(diǎn)IP訪問(wèn)頻率限制 針對(duì)單個(gè)站點(diǎn)的實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇C# 站點(diǎn)IP訪問(wèn)頻率限制 針對(duì)單個(gè)站點(diǎn)的實(shí)現(xiàn)方法。小編覺(jué)的挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • C#加解密之DES算法的實(shí)現(xiàn)

    C#加解密之DES算法的實(shí)現(xiàn)

    DES算法為密碼體制中的對(duì)稱密碼體制,又被稱為美國(guó)數(shù)據(jù)加密標(biāo)準(zhǔn)。本文將用C#語(yǔ)言實(shí)現(xiàn)DES算法,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-08-08
  • C#自定義簽名章實(shí)現(xiàn)方法

    C#自定義簽名章實(shí)現(xiàn)方法

    這篇文章主要介紹了C#自定義簽名章實(shí)現(xiàn)方法,涉及C#圖形繪制的相關(guān)實(shí)現(xiàn)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-08-08

最新評(píng)論