麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 應用 > 軟件技巧 > 正文

建站.Net常識 詳談值類型和引用類型

2024-07-16 17:45:16
字體:
來源:轉載
供稿:網友

值類型和引用類型是.net里面的一個基本概念
在面試的時候也經常遇到
關于這個概念有很多誤解,經常聽到下面的說法
1.兩者的區別是值類型分配在堆棧上,引用類型分配在堆上
  這句話不對,至少不準確
2.值類型性能更好,
  這句話要考慮情況
先補充一些背景資料
常見的值類型有:大部分原生類型,例如int float long 各種自己定義的結構體等等
常見的引用類型有:string 各種Class 數組(包括int[]這種的)
堆棧:在這里指的是執行堆棧
堆:在這里指的是托管堆,就是LOH+G0+G1+G2
讓我們先來看看第一點:兩者的區別是值類型分配在堆棧上,引用類型分配在堆上
1.假設在一個方法里面有一個語句是 var obj = new object();
首先 new 出來的Object將被存放在堆中
obj在堆棧上,其內容是一個指針,指向new 出來的那個Object
2.然后假設在一個方法里面有一個語句是 var i =1 ;
這里的 i 在堆棧上, 其值是1 (int 類型)
3.類中的值類型成員,例如以下一個定義
public class ClassA
{
private int i = 1;
}
假設在一個方法里面有一個語句是 var obj = new ClassA();
首先 new 出來的ClassA將被存放在堆中
obj在堆棧上,其內容是一個指針,指向new 出來的那個ClassA
ClassA中的成員 i 這個時候也在堆上
假設有一個有一個其他語句使用到ClassA.i 這個i的值才會被拷貝到堆棧上(大部分默認的情況)
4.將引用類型放在堆棧上
unsafe
{
var obj = stackalloc int[100];
}
stackalloc是用來在堆棧上分配內存的keyword
上面的4個例子正好證明了 引用類型和值類型都可以存在在堆和堆棧上
不過大部分時候都是情況1和2, 所以大部分引用類型都在堆上,大部分
讓我們先來看看第二點:值類型性能更好
就上面的情況1,2而言
a.在取一個對象的時候,情況1先讀取obj的值, 這是一個地址,然后要重新讀取該地址的真正的對象Object
情況2讀取obj的值,這就是真正的值了,所以相對數據比較快
b.在堆中的對象受到GC的影響,需要額外的CPU資源;(堆棧中的對象,出棧以后釋放掉了)
c.在堆中的對象需要等到GC后才被釋放,所以暫用內存時間較久
其他情況:
1.考慮一些情況,裝箱拆箱;這是值類型在堆棧和對中拷貝時特有的操作,該操作還是非常消耗資源的
  那么如果無法避免裝箱拆箱,就要考慮避免使用值類型了
2.值類型傳遞的時候每次都是值拷貝,如果某個值類型很大(例如自己定義的struct) 那么這個性能也是個問題;(而且還要考慮到堆棧有大小限制)
  所以一般情況下比較復雜的類型都只能用class
3.許多時候,引用比較都比值比較來的快,因為引用比較只要看看兩個地址是否相等

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 日韩在线播放第一页 | 香蕉秀| 国产成人精品区 | 久精品国产 | 一区在线免费视频 | 成人毛片在线 | 亚洲网站免费 | 午夜爱爱福利 | 亚洲自拍第二页 | 黄网站色成年大片免费高 | 午夜影院在线免费观看 | 香蕉成人在线视频 | 午夜视频啊啊啊 | 人成免费a级毛片 | 国产成人强伦免费视频网站 | 国产91小视频在线观看 | 国产免费观看一区二区三区 | 毛片在哪看 | 成人精品aaaa网站 | 最新久久免费视频 | 久久久电影电视剧免费看 | 性欧美xxxx极品摘花 | 色淫网站免费视频 | 热久久成人 | 国产99精品在线 | 久久久久久久久久美女 | 久久久视频免费观看 | 国产午夜精品一区二区三区四区 | 国产精品一区二区三区在线看 | 国产免费美女 | 久久久一区二区三区四区 | 少妇的肉体2无删减版 | h色视频在线观看 | 羞羞色院91精品网站 | 日韩欧美综合在线 | 国产精品欧美久久久久一区二区 | 国产精品久久久久久久久久大牛 | 美女在线视频一区二区 | 91网站免费观看 | 成人午夜免费观看 | 91在线色视频 |