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

首頁 > 學院 > 編程設計 > 正文

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

2020-06-27 15:42:02
字體:
來源:轉載
供稿:網友

值類型和引用類型是.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.許多時候,引用比較都比值比較來的快,因為引用比較只要看看兩個地址是否相等
  而值比較卻要考慮里面真實的值
值類型和引用類型的區別其實從他們的名字上就看的出來
在傳遞值類型的時候傳遞的是真實值,這也就意味著原來的值被復制了一份到新的位置
而在傳遞引用類型的時候傳遞的是引用(地址),這里并沒有復制一份原來值的動作,因此兩個引用都指向一個對象
Ref
在沒有Ref的時候傳遞參數,CLR會為每個參數弄一個臨時變量出來,存儲值類型的值或者是引用類型的指針
這種情況下修改值類型或者引用類型的值不會影響到原來的值
但是修改引用類型的成員會影響到原來的值,下面兩個例子分別是修改參數成員和修改參數本身
?
public class ClassA
{
public string Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
ClassA a = new ClassA();
Test(a);
Console.WriteLine(a.Name);//這里會輸出mark
}
private static void Test(ClassA a)
{
a.Name = "Mark";
}
}
?
public class ClassA
{
public string Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
ClassA a = new ClassA();
Test(a);
Console.WriteLine(a.Name);//這里不會輸出Liu
}
private static void Test(ClassA a)
{
a = new ClassA() { Name = "Liu" };
}
}
  
在有REF的情況下傳遞參數,CLR就會把原來的變量的地址傳遞過去,如果修改了該變量會影響到原來的成員
?
public class ClassA
{
public string Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
ClassA a = new ClassA();
Test(ref a);
Console.WriteLine(a.Name);//這里會輸出Liu
}
private static void Test(ref ClassA a)
{
a = new ClassA() { Name = "Liu" };
}
}
  
備注1:如何確定一個對象在堆上或者是堆棧上
剛才說的都是理論,這邊是驗證
使用WinDBG+SOS附加到一個.net程序上;然后查看堆中的情況;
具體指令就不說了,大家查看一下幫助

值類型,引用類型,建站,.Net

值類型,引用類型,建站,.Net


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品国产精品| 国产精品高清在线观看| 日韩三级成人av网| 国产精品久久久久久久久| 亚洲理论在线a中文字幕| 一个人看的www久久| 欧美精品videosex性欧美| 国产精品激情自拍| 久久人91精品久久久久久不卡| 日韩av在线导航| 成人亚洲综合色就1024| 日韩欧美国产骚| 国产精品第一视频| 亚洲欧美日韩综合| 成人免费看吃奶视频网站| 国产伦精品免费视频| 91欧美精品午夜性色福利在线| 日韩在线视频观看| 国产日韩欧美综合| 国产精品久久视频| 日本中文字幕不卡免费| 影音先锋日韩有码| 亚洲欧美国内爽妇网| 国产成人精品视| 欧美xxxx18国产| 亚洲成人网在线| 久久久久亚洲精品成人网小说| 国产精品三级在线| 精品小视频在线| 日韩中文视频免费在线观看| 国产mv免费观看入口亚洲| 91亚洲精品久久久久久久久久久久| 性欧美在线看片a免费观看| 国产精品美乳在线观看| 日本a级片电影一区二区| 国产精品免费一区| 最新69国产成人精品视频免费| 91精品免费久久久久久久久| 国内精品久久久久| 欧美一级大片视频| 亚洲一区国产精品| 欧洲成人在线观看| 亚洲乱码国产乱码精品精| 成人免费福利在线| 欧亚精品在线观看| 欧美日韩999| 亚洲综合日韩中文字幕v在线| 久久在线视频在线| 国产精品96久久久久久| 国产亚洲aⅴaaaaaa毛片| 国产在线视频欧美| 国产a级全部精品| 91久久嫩草影院一区二区| 日韩av在线资源| 中文字幕在线国产精品| 日韩成人网免费视频| 欧美日韩亚洲视频| 国产日韩av高清| 日本高清+成人网在线观看| 亚洲精品网址在线观看| 九九久久综合网站| 91系列在线播放| 国产欧美va欧美va香蕉在线| 国产一区二区色| 热久久视久久精品18亚洲精品| 精品成人69xx.xyz| 亚洲天堂av在线免费观看| 亚洲**2019国产| 91精品国产91久久久久久吃药| 亚洲欧美日韩天堂一区二区| 久久久久久噜噜噜久久久精品| 中文字幕欧美精品日韩中文字幕| 国产综合在线视频| 在线日韩欧美视频| 精品久久久久久亚洲国产300| 欧美电影在线观看网站| 亚洲视频第一页| 亚洲国产精品人人爽夜夜爽| 久久的精品视频| 538国产精品一区二区免费视频| 欧美精品18videos性欧美| 日本免费久久高清视频| 日本三级韩国三级久久| 亚洲综合社区网| 欧美精品在线第一页| 欧美日韩激情美女| 亚洲视频在线播放| 亚洲第一福利网| 欧美日韩亚洲天堂| 国产va免费精品高清在线观看| 国产欧美精品一区二区三区-老狼| 日韩专区中文字幕| 欧美性高潮床叫视频| 久久久久久久久久久免费精品| 久久福利视频网| 全亚洲最色的网站在线观看| 91久久中文字幕| 97超级碰碰人国产在线观看| 日韩免费av一区二区| 亚洲国产成人精品女人久久久| 欧美洲成人男女午夜视频| 91久久精品日日躁夜夜躁国产| 国产69精品久久久久久| 91高清视频在线免费观看| 中文字幕日韩高清| 久青草国产97香蕉在线视频| 午夜精品久久久久久99热| 91高清视频免费| 亚洲国产精彩中文乱码av| 亚洲乱码av中文一区二区| 日韩精品在线免费播放| 欧美日韩中文在线观看| 国产成人一区三区| 欧美日韩国产在线播放| 最近2019好看的中文字幕免费| 欧美性videos高清精品| 国产一区二区日韩精品欧美精品| 性日韩欧美在线视频| 精品国产一区二区三区久久久狼| 国产精品第8页| 国产精品国产三级国产aⅴ浪潮| 上原亚衣av一区二区三区| 久久精品国产精品| 韩曰欧美视频免费观看| yw.139尤物在线精品视频| 日韩a**站在线观看| 中文字幕久热精品在线视频| 国产精品福利久久久| 中文字幕亚洲无线码a| 中文字幕欧美国内| 92福利视频午夜1000合集在线观看| 国产日韩av在线播放| 久久久电影免费观看完整版| 国产精品亚洲综合天堂夜夜| 狠狠干狠狠久久| 亚洲福利小视频| 欧美成人午夜免费视在线看片| 精品亚洲aⅴ在线观看| 日韩成人在线视频网站| 亚洲影视中文字幕| 欧美日韩国产一区中文午夜| 亚洲天堂免费在线| 日韩福利在线播放| 亚洲a在线播放| 欧美午夜宅男影院在线观看| 亚洲综合第一页| 亚洲全黄一级网站| 7m第一福利500精品视频| 欧美电影免费观看大全| 成人自拍性视频| 国产亚洲欧洲高清| 欧美激情视频网址| 亚洲国产成人在线视频| 91久久嫩草影院一区二区| 国产自摸综合网| 日韩成人高清在线| 久久久久久久成人| 久久久久久久久网站| 国产在线观看不卡| 色婷婷av一区二区三区久久| 亚洲自拍偷拍色图| 亚洲免费av电影| 26uuu亚洲国产精品| 欧美精品激情blacked18|