




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第C#中的引用類型以及特殊引用類型詳解引用類型分配在哪里
引用類型變量位于線程棧。引用類型實(shí)例分配在托管堆上。當(dāng)引用類型實(shí)例的大小小于85000bytes,被分配在GC堆上,當(dāng)大于或等于85000bytes,被分配在LOH(LargeObjectHeap)上。
變量(Variable),對(duì)象(Object),實(shí)例(Instance)
變量:
變量分配在線程棧上。
變量可以是值類型,也可以是引用類型。
當(dāng)變量是引用類型時(shí),包含了對(duì)對(duì)象的引用(內(nèi)存地址),也叫做對(duì)象引用。
對(duì)象:
對(duì)類、接口、委托和數(shù)組等的一個(gè)抽象描述。
實(shí)例:
在堆上創(chuàng)建的對(duì)象,稱為對(duì)象實(shí)例。
引用類型沒有new意味著什么?
Objecta=null;
Console.WriteLine(a.ToString());
運(yùn)行報(bào)錯(cuò)未將對(duì)象引用設(shè)置到對(duì)象實(shí)例。
意思是,在線程棧上創(chuàng)建的變量a沒有指向到堆上的對(duì)象實(shí)例。
托管堆上的垃圾回收
GC會(huì)遍歷所有托管堆上的對(duì)象,按照一定的遞歸遍歷算法,對(duì)那些沒有被引用的不可訪問對(duì)象實(shí)施回收。
new的背后發(fā)生了什么
classProgram
staticvoidMain(string[]args)
Personp;
p=newPerson(20);
publicclassPerson
publicint_age;
publicPerson(intage)
_age=age;
publicPerson()
}
另外,引用類型的值,比如這里的引用類型Person中的值_age也被分配在托管堆上。
線程棧上的2個(gè)變量引用同一個(gè)對(duì)象實(shí)例的內(nèi)存地址
線程棧上的2個(gè)變量引用同一個(gè)對(duì)象實(shí)例的內(nèi)存地址,改變其中一個(gè)變量的值會(huì)影響到另外一個(gè)變量。
classProgram
staticvoidMain(string[]args)
Personp1=newPerson(20);
Personp2=p1;
Console.WriteLine("沒有改變時(shí)p2的年齡是:"+p2._age+"歲");
p1._age=18;
Console.WriteLine("改變p1的值,p2的年齡也被改變了,現(xiàn)在是:"+p2._age+"歲,真好,年輕了!");
Console.ReadKey();
publicclassPerson
publicint_age;
publicPerson(intage)
_age=age;
publicPerson()
}
string類型是特殊的引用類型
特殊性體現(xiàn)在
從應(yīng)用角度體現(xiàn)了值類型語義,從內(nèi)存角度實(shí)現(xiàn)為引用類型存儲(chǔ),位于托管堆。
什么是string
可以看作是char的集合char[]
string創(chuàng)建與實(shí)例化
stringstr=Hello
以下錯(cuò)誤
Stringstr=newString(Hello
因?yàn)镾ystem.String沒有提供此構(gòu)造函數(shù)
以下可以
Char[]cs={a,b,c
StringstrArr=newString(cs);
但很少使用這種方式。
字符串的恒定性Immutability
是指字符串一經(jīng)創(chuàng)建,就不可改變。
字符串一旦創(chuàng)建,在托管堆上分配一塊連續(xù)的內(nèi)存空間。
恒定性的好處:
對(duì)String對(duì)象的任意操作,不會(huì)改變?cè)址?/p>
操作字符串不會(huì)出現(xiàn)線程同步的問題。
成就了字符串駐留。
恒定性的不足:
因?yàn)楹愣ㄐ裕瑢?duì)字符串的任何操作,比如字符串比較,字符串鏈接,字符串格式化等都會(huì)創(chuàng)建新的字符串,這樣造成內(nèi)存與性能的雙重?fù)p耗。如下:
publicstaticvoidMain()
stringstr="Thisisatestaboutimmuntablilityofstringtype.";
Console.WriteLine(str.Inseert(0,"Hi").Substring(19).ToUpper());
Console.WriteLine(str);
}
由于Insert,Substring,ToUpper這些方法,都會(huì)創(chuàng)建出新的臨時(shí)字符串,而這些新的字符串不被其他代碼引用的時(shí)候,就會(huì)被垃圾回收,造成性能上的損失。
恒定性的前提,String為密封類:
publicsealedclassString:IComparable,ICloneable,IConvertible,IComparablestring,IEnumerablechar,IEnumerable,IEquatablestring
字符串駐留StringInterning
MSDN對(duì)于字符駐留的定義:公共語言運(yùn)行庫通過維護(hù)一個(gè)哈希表(HashTable)來存放字符串,該表成為拘留池,也叫駐留池。
字符串駐留彌補(bǔ)了恒定性的不足:
對(duì)于相同的字符串,CLR不會(huì)不會(huì)為其分配內(nèi)存空間,而是共享同一內(nèi)存。
CLR內(nèi)部維護(hù)了一個(gè)哈希表HashTable來管理其創(chuàng)建的大部分String對(duì)象。key是string本身,value是string對(duì)應(yīng)的內(nèi)存地址。
駐留的2個(gè)靜態(tài)方法:
publicstaticstringIntern(stringstr);
當(dāng)str位于作為key位于CLR的駐留池時(shí),返回對(duì)str的引用,否則將str字符串添加到hashtable中,作為key,并返回引用。
publicstaticstringIsInterned(stringstr);
當(dāng)str位于作為key位于CLR的駐留池時(shí),返回對(duì)str的引用,否則返回null引用,也不添加到hashtable中。
字符串駐留是進(jìn)程級(jí)的
可以跨應(yīng)用程序域AppDomain而存在,駐留池在CLR加載時(shí)創(chuàng)建,分配在SystemDomain中,被進(jìn)程所有AppDomain所共享,其生命周期不受GC控制。
staticvoidMain(string[]args)
stringstrA="ab";
stringstrB="ab";
Console.WriteLine(ReferenceEquals(strA,strB));
stringstrC="a";
stringstrD=strC+"b";
Console.WriteLine(ReferenceEquals(strA,strD));
strD=String.Intern(strD);
Console.WriteLine(ReferenceEquals(strA,strD));
Console.ReadKey();
}
返回:
true
false
true
分析:
strA與strB內(nèi)容相同,在hashtable中的key相同,對(duì)應(yīng)了一樣的引用地址,所以返回true。strD的內(nèi)容雖然與strA相同,但由于是動(dòng)態(tài)生成的,不會(huì)把hashtable中key為ab的引用地址賦值給strD,所以strA與strD引用地址不一樣,返回false。strD=String.Intern(strD);手動(dòng)對(duì)strD實(shí)施駐留,并發(fā)現(xiàn)hashtable中已經(jīng)有了ab這個(gè)key,就把對(duì)應(yīng)的引用地址賦值給了strD,這樣,strA與strD引用地址相同,返回true。
staticvoidMain(string[]args)
strings1="abc";
strings2="ab";
strings3=s2+"c";
Console.WriteLine(string.IsInterned(s3)"null");
Console.WriteLine(ReferenceEquals(s1,s3));
Console.ReadKey();
}
返回:
abc
false
分析:
string.IsInterned(s3)對(duì)s3進(jìn)行手動(dòng)駐留,發(fā)現(xiàn)hashtable中abc這個(gè)key,于是,就返回abc的引用地址。但并沒有把引用地址賦值給s3。s1和s3的引用地址還是不一樣,返回false。
staticvoidMain(string[]args)
stringstrA="abcdef";
stringstrC="abc";
stringstrD=strC+"def";
Console.WriteLine(ReferenceEquals(strA,strD));
stringStrE="abc"+"def";
Console.WriteLine(ReferenceEquals(strA,StrE));
Console.ReadKey();
}
返回:
False,
true
分析:
因?yàn)閟trD=strC+def中strD的內(nèi)容雖然與strA想同,但因?yàn)槭莿?dòng)態(tài)生成的,不會(huì)被添加到hashtable中,所以引用地址不一樣,返回false。abc+def在IL中呈現(xiàn)為abcdef,不是動(dòng)態(tài)生成的,并且發(fā)現(xiàn)hashtable中已經(jīng)有了abcdef這個(gè)key,于是就把對(duì)應(yīng)的引用地址賦值給了strE,這樣strA和StrE就有了相同的引用地址,返回true。如圖:
staticvoidMain(string[]args)
strings="abc";
//IsInterned()獲取字符串變量的引用
Console.WriteLine(string.IsInterned(s)"null");
Console.ReadKey();
}
返回
abc。
分析:通過strings=abc使得hashtable中有abc這個(gè)key,當(dāng)進(jìn)行string.IsInterned(s)手動(dòng)駐留判斷的時(shí)候,發(fā)現(xiàn)有abc這個(gè)key,就把對(duì)應(yīng)的引用地址返回。
classProgram
staticvoidMain(string[]args)
strings="ab";
s+="c";
//IsInterned()獲取字符串變量的引用
Console.WriteLine(string.IsInterned(s)"null");
Con
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 如何講好線上培訓(xùn)課件
- 小學(xué)生認(rèn)識(shí)火箭課件圖片
- 《醫(yī)療護(hù)理禮儀》課件
- 路人王簽約合同協(xié)議
- 《中風(fēng)后康復(fù)之路》課件
- 車間勞務(wù)外包合同協(xié)議
- 轉(zhuǎn)讓押金無合同協(xié)議
- 轉(zhuǎn)讓軟件系統(tǒng)合同協(xié)議
- 養(yǎng)殖小區(qū)種豬供應(yīng)及技術(shù)服務(wù)合同
- it設(shè)備維保協(xié)議
- 七年級(jí)下地理試題
- 寧夏水利建筑工程預(yù)算定額
- 山東省普通高中學(xué)生發(fā)展報(bào)告
- 中職數(shù)學(xué)指數(shù)函數(shù)與對(duì)數(shù)函數(shù)試卷
- 《內(nèi)心強(qiáng)大 誰都傷不了你》讀書筆記思維導(dǎo)圖PPT模板下載
- 母親八十大壽微信邀請(qǐng)函(三篇)
- 裝配鉗工高級(jí)理論3-(試題及答案)
- GB/T 9126-2008管法蘭用非金屬平墊片尺寸
- GB/T 7999-2007鋁及鋁合金光電直讀發(fā)射光譜分析方法
- GB/T 20416-2006自然保護(hù)區(qū)生態(tài)旅游規(guī)劃技術(shù)規(guī)程
- GB 15579-1995弧焊設(shè)備安全要求第1部分:焊接電源
評(píng)論
0/150
提交評(píng)論