21.詳述.NET里class和struct的異同
答:結(jié)構(gòu)與類共享幾乎所有相同的語法,但結(jié)構(gòu)比類受到的限制更多:盡管結(jié)構(gòu)的靜態(tài)字段可以初始化,結(jié)構(gòu)實(shí)例字段聲明還是不能使用初始值設(shè)定項(xiàng)。
結(jié)構(gòu)不能聲明默認(rèn)構(gòu)造函數(shù)(沒有參數(shù)的構(gòu)造函數(shù))或析構(gòu)函數(shù)。
結(jié)構(gòu)的副本由編譯器自動(dòng)創(chuàng)建和銷毀,因此不需要使用默認(rèn)構(gòu)造函數(shù)和析構(gòu)函數(shù)。實(shí)際上,編譯器通過為所有字段賦予默認(rèn)值(參見默認(rèn)值表)來實(shí)現(xiàn)默認(rèn)構(gòu)造函數(shù)。
結(jié)構(gòu)不能從類或其他結(jié)構(gòu)繼承。
結(jié)構(gòu)是值類型 -- 如果從結(jié)構(gòu)創(chuàng)建一個(gè)對(duì)象并將該對(duì)象賦給某個(gè)變量,變量則包含結(jié)構(gòu)的全部值。復(fù)制包含結(jié)構(gòu)的變量時(shí),將復(fù)制所有數(shù)據(jù),對(duì)新副本所做的任何修改都不會(huì)改變舊副本的數(shù)據(jù)。
由于結(jié)構(gòu)不使用引用,因此結(jié)構(gòu)沒有標(biāo)識(shí) -- 具有相同數(shù)據(jù)的兩個(gè)值類型實(shí)例是無法區(qū)分的。C# 中的所有值類型本質(zhì)上都繼承自ValueType,后者繼承自 Object。編譯器可以在一個(gè)稱為裝箱的過程中將值類型轉(zhuǎn)換為引用類型。
結(jié)構(gòu)具有以下特點(diǎn):
結(jié)構(gòu)是值類型,而類是引用類型。
向方法傳遞結(jié)構(gòu)時(shí),結(jié)構(gòu)是通過傳值方式傳遞的,而不是作為引用傳遞的。
與類不同,結(jié)構(gòu)的實(shí)例化可以不使用 new 運(yùn)算符。
結(jié)構(gòu)可以聲明構(gòu)造函數(shù),但它們必須帶參數(shù)。
一個(gè)結(jié)構(gòu)不能從另一個(gè)結(jié)構(gòu)或類繼承,而且不能作為一個(gè)類的基。所有結(jié)構(gòu)都直接繼承自 System.ValueType,后者繼承自 System.Object。
結(jié)構(gòu)可以實(shí)現(xiàn)接口。
在結(jié)構(gòu)中初始化實(shí)例字段是錯(cuò)誤的。
22.什么叫應(yīng)用程序域?什么是托管代碼?什么是強(qiáng)類型系統(tǒng)?什么是裝箱和拆箱?什么是重載? CTS、CLS和CLR分別作何解釋?
答:應(yīng)用程序域:應(yīng)用程序域?yàn)榘踩、可靠性、版本控制以及卸載程序集提供了隔離邊界。應(yīng)用程序域通常由運(yùn)行庫宿主創(chuàng)建,運(yùn)行庫宿主負(fù)責(zé)在運(yùn)行應(yīng)用程序之前引導(dǎo)公共語言運(yùn)行庫。應(yīng)用程序域提供了一個(gè)更安全、用途更廣的處理單元,公共語言運(yùn)行庫可使用該單元提供應(yīng)用程序之間的隔離。
托管代碼:使用基于公共語言運(yùn)行庫的語言編譯器開發(fā)的代碼稱為托管代碼;托管代碼具有許多優(yōu)點(diǎn),例如:跨語言集成、跨語言異常處理、增強(qiáng)的安全性、版本控制和部署支持、簡化的組件交互模型、調(diào)試和分析服務(wù)等。
強(qiáng)類型:C# 是強(qiáng)類型語言;因此每個(gè)變量和對(duì)象都必須具有聲明類型。
裝箱和拆箱:裝箱和拆箱使值類型能夠被視為對(duì)象。對(duì)值類型裝箱將把該值類型打包到 Object 引用類型的一個(gè)實(shí)例中。這使得值類型可以存儲(chǔ)于垃圾回收堆中。拆箱將從對(duì)象中提取值類型。
重載:每個(gè)類型成員都有一個(gè)唯一的簽名。方法簽名由方法名稱和一個(gè)參數(shù)列表(方法的參數(shù)的順序和類型)組成。只要簽名不同,就可以在一種類型內(nèi)定義具有相同名稱的多種方法。當(dāng)定義兩種或多種具有相同名稱的方法時(shí),就稱作重載。
CTS通用類型系統(tǒng) (common type system) :一種確定公共語言運(yùn)行庫如何定義、使用和管理類型的規(guī)范。
CLR公共語言運(yùn)行庫:.NET Framework 提供了一個(gè)稱為公共語言運(yùn)行庫的運(yùn)行時(shí)環(huán)境,它運(yùn)行代碼并提供使開發(fā)過程更輕松的服務(wù)。
CLS公共語言規(guī)范:要和其他對(duì)象完全交互,而不管這些對(duì)象是以何種語言實(shí)現(xiàn)的,對(duì)象必須只向調(diào)用方公開那些它們必須與之互用的所有語言的通用功能。為此定義了公共語言規(guī)范 (CLS),它是許多應(yīng)用程序所需的一套基本語言功能。
23.值類型和引用類型的區(qū)別?
答:基于值類型的變量直接包含值。將一個(gè)值類型變量賦給另一個(gè)值類型變量時(shí),將復(fù)制包含的值。這與引用類型變量的賦值不同,引用類型變量的賦值只復(fù)制對(duì)對(duì)象的引用,而不復(fù)制對(duì)象本身。
所有的值類型均隱式派生自 System.ValueType。與引用類型不同,從值類型不可能派生出新的類型。但與引用類型相同的是,結(jié)構(gòu)也可以實(shí)現(xiàn)接口。
與引用類型不同,值類型不可能包含 null 值。然而,可空類型功能允許將null 賦給值類型。 每種值類型均有一個(gè)隱式的默認(rèn)構(gòu)造函數(shù)來初始化該類型的默認(rèn)值。
值類型主要由兩類組成:結(jié)構(gòu)、枚舉; 結(jié)構(gòu)分為以下幾類:Numeric(數(shù)值)類型、整型、浮點(diǎn)型、decimal、bool、用戶定義的結(jié)構(gòu)。
引用類型的變量又稱為對(duì)象,可存儲(chǔ)對(duì)實(shí)際數(shù)據(jù)的引用。聲明引用類型的關(guān)鍵字:class、interface、delegate、內(nèi)置引用類型: object、string