国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

C# 值類型和引用類型

2019-11-17 04:06:08
字體:
供稿:網(wǎng)友
值類型直接存儲(chǔ)其值,變量本身就包含了其實(shí)例數(shù)據(jù),而引用類型保存的只是實(shí)例數(shù)據(jù)的內(nèi)存引用。因此,一個(gè)值類型變量就永遠(yuǎn)不會(huì)影響到其他的值類型變量,而兩個(gè)引用類型變量則很有可能指向同一地址,從而發(fā)生相互影響。
從內(nèi)存分配上來看,值類型通常分配在線程的堆棧上,作用域結(jié)束時(shí),所占空間自行釋放,效率高,無需進(jìn)行地址轉(zhuǎn)換,而引用類型通常分配在托管堆上,由GC來控制其回收,需要進(jìn)行地址轉(zhuǎn)換,效率降低,這也正是c#需要定義兩種數(shù)據(jù)類型的原因之一。
值類型均隱式派生自System.ValueType,而System.ValueType又直接派生于System.Object,每種值類型均有一個(gè)隱式的默認(rèn)構(gòu)造函數(shù)來初始化該類型的默認(rèn)值,注意所有的值類型都是密封(sealed)的,所以無法派生出新的值類型。而且System.ValueType本身是一個(gè)類類型,而不是值類型,因?yàn)樗貙懥薿bject的Equals()方法,所以對(duì)值類型將按照實(shí)例的值來比較,而不是比較引用地址。
C# 的統(tǒng)一類型系統(tǒng),使得值類型可以轉(zhuǎn)化為對(duì)象來處理,這就是常說的裝箱和拆箱。由于裝拆箱需要裝建全新對(duì)象或做強(qiáng)制類型轉(zhuǎn)換,這些操作所需時(shí)間和運(yùn)算要遠(yuǎn)遠(yuǎn)大于賦值操作,因此不提倡使用它,同時(shí)也要盡量避免隱式裝拆箱的發(fā)生。
注:棧是操作系統(tǒng)分配的一個(gè)連續(xù)的內(nèi)存區(qū)域,用于快速訪問數(shù)據(jù)。因?yàn)橹殿愋偷娜萘渴且阎?,因此它可存?chǔ)在棧上。而托管堆是CLR在應(yīng)用程序啟動(dòng)時(shí)為應(yīng)用程序預(yù)留的一塊連續(xù)內(nèi)存區(qū),是用于動(dòng)態(tài)內(nèi)存分配的內(nèi)存區(qū),引用類型的容量只有到運(yùn)行時(shí)才能確定,所有用堆來存儲(chǔ)引用類型。



C#的兩種數(shù)據(jù)類型延伸之一--嵌套類型的內(nèi)存分配

    對(duì)于引用類型嵌套值類型,以及值類型嵌套引用類型的情況下,內(nèi)存分配可以根據(jù)以下兩條規(guī)律來判斷:

•     引用類型始終部署在托管堆上;

•     值類型總是分配在它聲明的地方:作為字段時(shí),跟隨其所屬的對(duì)象存儲(chǔ);作為局部變量時(shí),存儲(chǔ)在棧上。


C#的兩種數(shù)據(jù)類型延伸之二--string類型

    string是一個(gè)很有意思的引用類型,為什么說它很有意思呢?因?yàn)樗憩F(xiàn)了很多值類型的特點(diǎn)。請(qǐng)看一下代碼示例:

示例1

string str1 = "abc";

string str2 = str1;

str1 = "123";

Console.WriteLine(str2);

示例2(msdn上的例子)

string a = "hello";

string b = "h";

// Append to contents of 'b'

b += "ello";

Console.WriteLine(a == b);

示例1的輸出結(jié)果是abc,改變str1的值對(duì)str2沒有影響。

示例2的輸出結(jié)果是True。

    這樣的結(jié)果會(huì)使我們誤以為string就是值類型。其實(shí)不然,示例1中str1 = "123"語句編譯器私底下創(chuàng)建了一個(gè)新的字符串對(duì)象來保存新的字符序列"123",也就是此str1已非彼str1了,“此”str1的值的改變也就不能影響“彼”str1的值了,當(dāng)然str2的值也就不會(huì)改變了。實(shí)質(zhì)上str1 = "123"是str1=new string("123")的簡(jiǎn)寫,它的每一次賦值都會(huì)拋掉原來的對(duì)象而生成一個(gè)新的字符串對(duì)象,分配新的內(nèi)存空間,因此string是不可改變的。如果要?jiǎng)?chuàng)建可修改的字符串,可使用stringbuilder以獲得更好的性能。至于示例2是因?yàn)闉榱朔奖惚容^字符串的值重定義了string的運(yùn)算符== 和 !=。

C#的兩種數(shù)據(jù)類型延伸之三--struct和class  

    class和struct的語法基本相同,從聲明到使用,都很相似。但是struct的約束要比class多,理論上,struct能做到的class都能做到,但class能做到的stuct卻不一定做的到,也就是說struct都能被class所代替。那么為什么還要使用struct呢?存在即是合理的,struct在很多方面有著性能優(yōu)勢(shì)。讓我們看看它們的主要區(qū)別在哪里?

數(shù)據(jù)類型不一樣,struct是值類型,class是引用類型,因此它們具有所有值類型和引用類型之間的差異。由于堆棧的執(zhí)行效率要比堆的執(zhí)行效率高,但是堆棧資源卻很有限,不適合處理邏輯復(fù)雜的大對(duì)象,因此struct常用來處理作為基類型對(duì)待的小對(duì)象,而class來處理某個(gè)商業(yè)邏輯。
從繼承性來看,struct既不能繼承也不能被繼承,但是可以實(shí)現(xiàn)接口,而Class就可以完全擴(kuò)展了。
內(nèi)部結(jié)構(gòu)有區(qū)別,struct只能添加帶參的構(gòu)造函數(shù),不能使用abstract和PRotected等修飾符,不能初始化實(shí)例字段,但是值得注意的是,struct可以重寫System.Object的3個(gè)虛方法,Equals()、ToString()和GetHashTable(),Class沒有這些限制。
比較struct和class的不同,可以得出以下幾條struct和class的使用原則:

1 在表示諸如點(diǎn)、矩形等主要用來存儲(chǔ)數(shù)據(jù)的輕量級(jí)對(duì)象時(shí),首選struct。

2 在表示數(shù)據(jù)量大、邏輯復(fù)雜的大對(duì)象時(shí),首選class。

3 在表現(xiàn)抽象和多級(jí)別的對(duì)象層次時(shí),class是最佳選擇
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 延庆县| 东乌珠穆沁旗| 于田县| 朝阳区| 贵溪市| 烟台市| 大名县| 报价| 伊宁县| 吉林市| 油尖旺区| 阜新| 绥德县| 土默特右旗| 贵南县| 灌南县| 广水市| 余江县| 景德镇市| 霞浦县| 富阳市| 广宗县| 临夏县| 来安县| 体育| 南皮县| 盐亭县| 汕头市| 儋州市| 长沙市| 出国| 上蔡县| 观塘区| 承德县| 喜德县| 两当县| 静海县| 抚宁县| 中卫市| 法库县| 襄垣县|