亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

.NET中的六個重要概念

2019-11-14 16:23:03
字體:
來源:轉載
供稿:網友

內容導讀

  • 概述
  • 當你聲明一個變量背后發生了什么?
  • 堆和棧
  • 值類型和引用類型
  • 哪些是值類型,哪些是引用類型?
  • 裝箱和拆箱
  • 裝箱和拆箱的性能問題

 一、概述

  本文會闡述六個重要的概念:堆、棧、值類型、引用類型、裝箱和拆箱。本文首先會通過闡述當你定義一個變量之后系統內部發生的改變開始講解,然后將關注點轉移到存儲雙雄:堆和棧。之后,我們會探討一下值類型和引用類型,并對有關于這兩種類型的重要基礎內容做一個講解。

  本文會通過一個簡單的代碼來展示在裝箱和拆箱過程中所帶來的性能上的影響,請各位仔細閱讀。

 

 二、當你聲明一個變量背后發生了什么?

  當你在一個.NET應用程序中定義一個變量時,在RAM中會為其分配一些內存塊。這塊內存有三樣東西:變量的名稱、變量的數據類型以及變量的值。

  上面簡單闡述了內存中發生的事情,但是你的變量究竟會被分配到哪種類型的內存取決于數據類型。在.NET中有兩種可分配的內存:棧和堆。在接下來的幾個部分中,我們會試著詳細地來理解這兩種類型的存儲。

2

 三、存儲雙雄:堆和棧

  為了理解棧和堆,讓我們通過以下的代碼來了解背后到底發生了什么。

public void Method1(){    // Line 1    int i=4;    // Line 2    int y=2;    //Line 3    class1 cls1 = new class1();}

  代碼只有三行,現在我們可以一行一行地來了解到底內部是怎么來執行的。

  • Line 1:當這一行被執行后,編譯器會在棧上分配一小塊內存。棧會在負責跟蹤你的應用程序中是否有運行內存需要
  • Line 2:現在將會執行第二步。正如棧的名字一樣,它會將此處的一小塊內存分配疊加在剛剛第一步的內存分配的頂部。你可以認為棧就是一個一個疊加起來的房間或盒子。在棧中,數據的分配和解除都會通過LIFO (Last In First Out)即先進后出的邏輯規則進行。換句話說,也就是最先進入棧中的數據項有可能最后才會出棧。
  • Line 3:在第三行中,我們創建了一個對象。當這一行被執行后,.NET會在棧中創建一個指針,而實際的對象將會存儲到一個叫做“堆”的內存區域中。“堆”不會監測運行內存,它只是能夠被隨時訪問到的一堆對象而已。不同于棧,堆用于動態內存的分配。
  • 這里需要注意的另一個重要的點是對象的引用指針是分配在棧上的。 例如:聲明語句 Class1 cls1; 其實并沒有為Class1的實例分配內存,它只是在棧上為變量cls1創建了一個引用指針(并且將其默認職位null)。只有當其遇到new關鍵字時,它才會在堆上為對象分配內存。
  • 離開這個Method1方法時(the fun):現在執行控制語句開始離開方法體,這時所有在棧上為變量所分配的內存空間都會被清除。換句話說,在上面的示例中所有與int類型相關的變量將會按照“LIFO”后進先出的方式從棧中一個一個地出棧。
  • 需要注意的是:這時它并不會釋放堆中的內存塊,堆中的內存塊將會由垃圾回收器稍候進行清理。

3

  現在我們許多的開發者朋友一定很好奇為什么會有兩種不同類型的存儲?我們為什么不能將所有的內存塊分配只到一種類型的存儲上?

  如果你觀察足夠仔細,基元數據類型并不復雜,他們僅僅保存像 ‘int i = 0’這樣的值。對象數據類型就復雜了,他們引用其他對象或其他基元數據類型。換句話說,他們保存其他多個值的引用并且這些值必須一一地存儲在內存中。對象類型需要的是動態內存而基元類型需要靜態內存。如果需求是動態內存的話,那么它將會在堆上為其分配內存,相反,則會在棧上為其分配。

4

 四、值類型和引用類型

  既然我們已經了解了棧和堆的概念了,是時候了解值類型和引用類型的概念了。值類型將數據和內存都保存在同一位置,而一個引用類型則會有一個指向實際內存區域的指針。

  通過下圖,我們可以看到一個名為i的整形數據類型,它的值被賦值到另一個名為j的整形數據類型。他們的值都被存儲到了棧上。

  當我們將一個int類型的值賦值到另一個int類型的值時,它實際上是創建了一個完全不同的副本。換句話說,如果你改變了其中某一個的值,另一個不會發生改變。于是,這些種類的數據類型被稱為“值類型”。

5

  當我們創建一個對象并且將此對象賦值給另外一個對象時,他們彼此都指向了如下圖代碼段所示的內存中同一塊區域。因此,當我們將obj賦值給obj1時,他們都指向了堆中的同一塊區域。換句話說,如果此時我們改變了其中任何一個,另一個都會受到影響,這也說明了他們為何被稱為“引用類型”。

 五、哪些是值類型,哪些是引用類型?

  在.NET中,變量是存儲到棧還是堆中完全取決于其所屬的數據類型。比如:‘String’或‘Object’屬于引用類型,而其他.NET基元數據類型則會被分配到棧上。下圖則詳細地展示了在.NET預置類型中,哪些是值類型,哪些又是引用類型。

6

 六、裝箱和拆箱

  現在,你已經有了不少的理論基礎了?,F在,是時候了解上面的知識在實際編程中的使用了。在應用中最大的一個意義就在于:理解數據從棧移動到堆的過程中所發生的性能消耗問題,反之亦然。

  考慮一下以下的代碼片段,當我們將一個值類型轉換為引用類型,數據將會從棧移動到堆中。相反,當我們將一個引用類型轉換為值類型時,數據也會從堆移動到棧中。

  不管是在從棧移動到堆還是從堆中移動到棧上都會不可避免地對系統性能產生一些影響。

  于是,兩個新名詞橫空出世:當數據從值類型轉換為引用類型的過程被稱為“裝箱”,而從引用類型轉換為值類型的過程則被成為“拆箱”。

7

  如果你編譯一下上面這段代碼并且在ILDASM(一個IL的反編譯工具)中對其進行查看,你會發現在IL代碼中,裝箱和拆箱是什么樣子的。下圖則展示了示例代碼被編譯后所產生的IL代碼。

8

 七、裝箱和拆箱的性能問題

  為了弄明白到底裝箱和拆箱會帶來怎樣的性能影響,我們分別循環運行10000次下圖所示的兩個函數方法。其中第一個方法中有裝箱操作,另一個則沒有。我們使用一個Stopwatch對象來監視時間的消耗。

  具有裝箱操作的方法花費了3542毫秒來執行完成,而沒有裝箱操作的方法只花費了2477毫秒,整整相差了1秒多。而且,這個值也會因為循環次數的增加而增加。也就是說,我們要盡量避免裝箱和拆箱操作。在一個項目中,如果你需要裝箱和裝箱,請仔細考慮它是否是絕對必不可少的操作,如果不是,那么盡量不用。

10

  雖然以上代碼段沒有展示拆箱操作,但其效果同樣適用于拆箱。你可以通過寫代碼來實現拆箱,并且通過Stopwatch來測試其時間消耗。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美日韩在线一区| 久久综合久久美利坚合众国| 欧美大片在线影院| 成人伊人精品色xxxx视频| 91久久精品日日躁夜夜躁国产| xx视频.9999.com| 成人h片在线播放免费网站| 欧美高跟鞋交xxxxxhd| 国产成人免费av电影| 性日韩欧美在线视频| 亚洲另类欧美自拍| 日本久久亚洲电影| 日韩中文在线中文网在线观看| 91精品国产综合久久香蕉922| 日韩国产高清污视频在线观看| 亚洲第一av网| 欧美日韩精品在线观看| 2019国产精品自在线拍国产不卡| 久久亚洲精品毛片| 亚洲视频日韩精品| 国外日韩电影在线观看| 伊是香蕉大人久久| 欧美日韩国产123| 欧美日韩加勒比精品一区| 亚洲桃花岛网站| 亚洲综合自拍一区| 国产日韩精品在线播放| 欧美理论电影在线播放| 欧美中文字幕在线播放| 色噜噜狠狠狠综合曰曰曰88av| 国产成人福利夜色影视| 色av中文字幕一区| 日韩小视频在线观看| 久久99热精品这里久久精品| 亚洲sss综合天堂久久| 国外成人在线视频| 国产精品尤物福利片在线观看| 91精品综合久久久久久五月天| 国产精品视频一区国模私拍| 国产精品普通话| 精品香蕉一区二区三区| 精品成人在线视频| 久久精品中文字幕免费mv| 97色在线观看| 国产欧美韩国高清| 日本三级久久久| 久久成人免费视频| 欧美极品少妇与黑人| 日韩理论片久久| 国产成人欧美在线观看| 久热精品视频在线观看一区| 欧美另类暴力丝袜| 69久久夜色精品国产7777| 久久理论片午夜琪琪电影网| 亚洲一区美女视频在线观看免费| 国产日韩欧美成人| 久久久99久久精品女同性| 日本视频久久久| 久久69精品久久久久久国产越南| 尤物九九久久国产精品的特点| 日韩久久午夜影院| 欧美成人免费观看| 欧美色videos| 亚洲精品一区中文| 欧美在线视频a| 亚洲第一av在线| 国产精品午夜国产小视频| 一区二区三区回区在观看免费视频| 欧美自拍大量在线观看| 欧洲亚洲在线视频| 国产美女精品视频免费观看| 亚洲开心激情网| 国产精品美女午夜av| 欧美理论电影在线播放| 久久综合亚洲社区| 亚洲国产成人91精品| 大胆人体色综合| 国产美女直播视频一区| 色琪琪综合男人的天堂aⅴ视频| 亚洲电影免费观看高清完整版| 亚洲国产欧美一区| 欧美国产日韩在线| 国产精品成人国产乱一区| 亚洲国产精品成人精品| 亚洲区一区二区| 91免费人成网站在线观看18| 亚洲天堂网在线观看| 国内揄拍国内精品| 激情亚洲一区二区三区四区| 久久精品欧美视频| 精品国产乱码久久久久久天美| 亚洲激情在线观看视频免费| 成人动漫网站在线观看| 中文字幕在线看视频国产欧美| 成人av.网址在线网站| 国产成人在线视频| 亚洲成人久久久久| 色妞一区二区三区| 亚洲一品av免费观看| 亚洲加勒比久久88色综合| 在线精品视频视频中文字幕| 国产精品老女人精品视频| 亚洲激情国产精品| 久久伊人91精品综合网站| 韩日欧美一区二区| 亚洲电影免费观看高清完整版在线| 国产亚洲精品美女| 国产精品日韩欧美大师| 热久久美女精品天天吊色| 国产精品视频精品视频| 国产午夜精品视频| 性欧美长视频免费观看不卡| 欧美孕妇毛茸茸xxxx| 日韩精品在线观看一区| 日韩欧美a级成人黄色| 日韩美女福利视频| 日韩免费电影在线观看| 国产丝袜高跟一区| 久久久久久久久爱| 欧美午夜性色大片在线观看| 国产日韩欧美91| 国产精品一区二区三区毛片淫片| 国产乱肥老妇国产一区二| 国产精品久久久久久久久影视| 欧美黑人xxx| 97在线看福利| 亚洲国产天堂久久综合网| 欧美成人精品在线观看| 亚洲国产美女久久久久| 欧美成人在线免费| 久久99热精品这里久久精品| 国产成人亚洲综合| 欧美亚洲免费电影| 欧美成aaa人片在线观看蜜臀| 久久激情视频免费观看| 一区二区三区天堂av| 中文字幕欧美专区| 91精品久久久久久久久不口人| 九色精品美女在线| www国产精品com| 精品一区二区电影| 久久色免费在线视频| 亚洲男女自偷自拍图片另类| 亚洲影视九九影院在线观看| 欧美性生交大片免网| 亚洲新中文字幕| 亚洲sss综合天堂久久| 久久视频精品在线| 国产日韩在线一区| 亚洲天堂男人天堂女人天堂| 欧美激情视频网| 亚洲欧美精品suv| 欧美性高潮床叫视频| 大胆欧美人体视频| 国产精品视频网址| 亚洲精品免费一区二区三区| 亚洲视频在线观看视频| 国产精品久久久久久超碰| 亚洲乱码一区二区| 高跟丝袜欧美一区| 97视频在线播放| 国产精品成人aaaaa网站| 懂色av影视一区二区三区| 北条麻妃在线一区二区|