久久综合丝袜日本网手机版,日韩欧美中文字幕在线三区,亚洲精品国产品国语在线,极品在线观看视频婷婷

      <small id="aebxz"><menu id="aebxz"></menu></small>
    1. .net面試題及詳解

      時(shí)間:2022-07-03 11:30:23 面試 我要投稿
      • 相關(guān)推薦

      .net面試題及詳解

      1.什么是CLR

      .net面試題及詳解

      公共語言運(yùn)行時(shí)(Comman language Runtime),是一個(gè)可由多種編程語言使用的“運(yùn)行時(shí)”。CLR的核心功能:程序集加載,異常處理,線程同步,內(nèi)存管理等可由CLR

      的所有語言使用.

      2.什么是IL

      Intermediate language

      中間語言,.net程序在經(jīng)過編譯后就成為IL代碼。運(yùn)行時(shí)CLR將IL語言編譯成CPU能識別的CRU指令。IL也可以叫做托管代碼,IL可以訪問CLR所提供的所有功能。

      3.什么是JIT,它是如何工作的?

      即時(shí)編譯器,由CLR調(diào)用,負(fù)責(zé)將IL語言編譯成本地CPU指令。

      工作原理:

      當(dāng)程序被第一次調(diào)用的時(shí)候,CLR會(huì)指向包含在CLR內(nèi)部定義的特殊函數(shù),這個(gè)函數(shù)就是JITCompiler。JITComliler負(fù)責(zé)將IL代碼編譯成本地指令。

      JITCompiler知道實(shí)際調(diào)用了哪個(gè)方法,以及該方法是哪些類型定義的。JITCompiler會(huì)在定義該類型的程序集的元數(shù)據(jù)中查找該方法的IL代碼。

      并將IL編譯成本地CPU指令。編譯好的結(jié)果被放在一個(gè)內(nèi)存塊中,JITCompiler返回CLR為類型定義的內(nèi)部數(shù)據(jù)結(jié)構(gòu)。找到被調(diào)用方法對應(yīng)的那條記錄,

      并修改最初對于JITCompiler的引用。讓其指向內(nèi)存塊中被調(diào)用方法剛剛編譯好的CPU指令地址,最后執(zhí)行被調(diào)用方法的CPU指令。

      4.GC是什么,簡述一下GC的工作方式?

      垃圾回收(garbage collection)

      Dot Net的垃圾回收可以分為兩個(gè)步驟,第一步進(jìn)行“標(biāo)記”,垃圾回收器假設(shè)所有的對象都是垃圾,然后開始遍歷每一個(gè)“根”(根包含指向引用類型對象的一個(gè)指針,值類型對象永遠(yuǎn)不會(huì)被認(rèn)為是一個(gè)根),如果發(fā)現(xiàn)一個(gè)根引用了一個(gè)對象(非NULL),就對對象進(jìn)行標(biāo)記。沒有被標(biāo)記的對象被認(rèn)為是垃圾。第二個(gè)階段就是“壓縮”,其實(shí)就是將后面的對象移動(dòng)到已經(jīng)成為垃圾的對象位置,使得原來的托管堆更為緊湊。從而釋放了托管堆。

      GC類中的方法影響何時(shí)對對象進(jìn)行垃圾回收以及何時(shí)釋放對象所分配的資源。此類中的屬性提供以下信息:系統(tǒng)可用內(nèi)存總量、分配給對象的內(nèi)存的周期類別(代)。

      GC跟蹤并回收托管內(nèi)存中分配的對象。垃圾回收器定期執(zhí)行垃圾回收以回收分配給沒有有效引用的對象的內(nèi)存。當(dāng)使用可用內(nèi)存不能滿足內(nèi)存請求時(shí),垃圾回收會(huì)自動(dòng)進(jìn)行;蛘撸瑧(yīng)用程序可以使用 Collect 方法強(qiáng)制進(jìn)行垃圾回收。

      垃圾回收由以下步驟組成:

      GC搜索托管代碼中引用的托管對象。

      GC嘗試完成沒有被引用的對象。

      GC釋放沒有被引用的對象并回收它們的內(nèi)存。

      在回收期間,如果GC在托管代碼中找到對某對象的一個(gè)或多個(gè)引用,則不會(huì)釋放該對象。然而,GC不識別非托管代碼中對對象的引用,因此,除非明確禁止,否則它有可能釋放非托管代碼中以獨(dú)占方式使用的對象。KeepAlive 方法提供一種機(jī)制,該機(jī)制可防止垃圾回收器回收在非托管代碼中仍使用的對象。

      5.在.NET程序運(yùn)行過程中,什么是堆,什么是棧?什么情況下會(huì)在堆(棧)上分配數(shù)據(jù)?它們有性能上的區(qū)別嗎?“結(jié)構(gòu)”對象可能分配在堆上嗎?什么情況下會(huì)發(fā)生,有什么需要注意的?

      .NET進(jìn)程被創(chuàng)建時(shí)就會(huì)有一個(gè)堆隨之被創(chuàng)建, 用來保存該進(jìn)程在運(yùn)行中需要使用的對象/數(shù)據(jù); 當(dāng)一個(gè)線程被創(chuàng)建時(shí), 會(huì)有一個(gè)棧被創(chuàng)建,用來保存方法調(diào)用參數(shù), 局部變量等輕量型數(shù)據(jù).

      當(dāng)一個(gè)類里面包含一個(gè)結(jié)構(gòu)體類型的變量時(shí), 該結(jié)構(gòu)體類型會(huì)被分配在堆上.

      >泛型的作用是什么?它有什么優(yōu)勢?它對性能有影響嗎?它在執(zhí)行時(shí)的行為是什么?.NET BCL中有哪些泛型類型?舉例說明平時(shí)編程中您定義的泛型類型

      泛型的作用是什么?

      泛型的作用在于“算法的重用”。(這點(diǎn)其實(shí)很好理解,原來的ArrayList只能接受Object,現(xiàn)在通過List可以接受任何類型,也就是說ArrayList的方法都被各個(gè)類型重用了。但是Dot Net的泛型有個(gè)比較制肘地方,就是你很難對數(shù)值類型(值類型)進(jìn)行算法抽象,因?yàn)檫@牽涉到運(yùn)算符重載的問題,同時(shí)Dot Net的泛型的類型參數(shù)也不能約束成一個(gè)基元值類型(如int、double、float) 。)

      它有什么優(yōu)勢?

      第一:源代碼保護(hù)。(如果你知道C++模板對泛型的實(shí)現(xiàn)機(jī)制,就會(huì)知道C++在編譯的時(shí)候根據(jù)對泛型的調(diào)用,自動(dòng)“內(nèi)聯(lián)”了一個(gè)實(shí)現(xiàn),這樣泛型的內(nèi)容就暴露了,爾DotNet的實(shí)現(xiàn)方式就不同了,泛型類和方法會(huì)被編譯成IL,在執(zhí)行的時(shí)候由JIT負(fù)責(zé)將IL變化為指定類型參數(shù)的本地代碼,從而保護(hù)了源代碼)

      第二:類型安全。(這點(diǎn)是最顯而易見的,拋棄了使用ArrayList時(shí)各種丑陋的強(qiáng)制類型轉(zhuǎn)換)

      第三:更清晰地代碼。因?yàn)闆]有了強(qiáng)制類型轉(zhuǎn)換,所以代碼自然顯得更清晰,但是使用泛型時(shí)候帶來的<>有時(shí)候確實(shí)也會(huì)讓人搞糊涂,幸好泛型方法可以用類型推斷或者using語句來進(jìn)一步簡化寫法。

      第四:更好的性能,因?yàn)橹殿愋涂梢员苊庋b箱和拆箱所帶來的損耗(垃圾回收的次數(shù)也會(huì)減少)。(這點(diǎn)正是泛型神奇的地方,開發(fā)歷史上抽象能力的上升往往意味著性能的下降,但是泛型卻不是!泛型抽象了算法,但是C++和DotNet對泛型的實(shí)現(xiàn)能夠讓性能無損,并且更快。Java的擦除法泛型就沒有這種性能上的好處。)

      它對性能有影響嗎?

      對性能有積極的影響,因?yàn)橹殿愋涂梢员苊庋b箱和拆箱所帶來的負(fù)面影響,避免了垃圾回收,使得性能顯著提高。但是對引用類型這種影響就不明顯了。但是需要注意的是首次為一個(gè)特定數(shù)據(jù)類型調(diào)用方法時(shí),CLR都會(huì)為這個(gè)方法生成本地代碼。這會(huì)增大應(yīng)用程序的工作集大小,從而影響性能。

      它在執(zhí)行時(shí)的行為是什么?

      使用泛型類型參數(shù)的一個(gè)方法在進(jìn)行JIT編譯時(shí),CLR獲取IL,用指定的類型實(shí)參進(jìn)行替換,然后創(chuàng)建本地代碼。需要特別注意的是引用類型是共享代碼的,而對值類型就會(huì)為每一種生成獨(dú)立的一份類型代碼。但是需要指出的是引用類型的這種代碼共享并不會(huì)造成封閉類型只執(zhí)行一次構(gòu)造函數(shù)(就算是靜態(tài)構(gòu)造函數(shù)也是這樣的)。

      .NET BCL中有哪些泛型類型?

      List、Dictionary、Queue、Stack、SortedList和SortedDictionary、LinkedList等等。

      舉例說明平時(shí)編程中您定義的泛型類型。

      泛型的出現(xiàn)會(huì)替換原來一部分使用多態(tài)的地方從而提高性能和帶來更好的編譯時(shí)檢查,這樣就不需要在子類和超類(接口)間頻繁轉(zhuǎn)換了。比如你要根據(jù)情況打出各種報(bào)表,那么先把報(bào)表類定義成泛型類從而可以共享報(bào)表一系列的算法。

      > 異常的作用是什么?.NET BCL中有哪些常見的異常?在代碼中您是如何捕獲/處理異常的?在“catch (ex)”中,“throw”和“throw ex”有什么區(qū)別?您會(huì)如何設(shè)計(jì)異常的結(jié)構(gòu),什么情況下您會(huì)拋出異常?

      異常的作用是什么?

      異常用于處理系統(tǒng)級或者應(yīng)用程序級的錯(cuò)誤狀態(tài)。這就會(huì)引發(fā)另外幾個(gè)問題,異常相比原來使用的返回錯(cuò)誤代碼的優(yōu)點(diǎn)在哪里?異常處理是一種結(jié)構(gòu)化的處理過程,個(gè)人認(rèn)為他最大的優(yōu)點(diǎn)就在于將“成功場景”剝離出來,使得代碼更加清晰自然。但是異常處理相對于返回錯(cuò)誤碼有一個(gè)缺點(diǎn),那就是他會(huì)失去發(fā)生異常的位置。不過異常本身提供了很多幫助調(diào)試問題的工具,一般都帶有棧跟蹤,這樣位置的問題就得到一定程度的解決。還有就是IF和異常之間的選擇,我記得以前有人討論過在各種分支下是使用異常來處理各種“失敗場景”的分支還是使用IF或者SWITCH來處理呢?這其實(shí)是一個(gè)假問題,因?yàn)楫惓:湾e(cuò)誤是有概念上的不同的,這里的錯(cuò)誤是指有違“主成功場景”的“異常場景”,爾異常是指當(dāng)程序不能完成其名字所表示功能時(shí)的錯(cuò)誤。所以需要強(qiáng)調(diào)不要使用異常來區(qū)分各種失敗場景,異常壓根就不是用來干這件事情的!

      .NET BCL中有哪些常見的異常?

      隨便說幾個(gè),最著名的恐怕就是那句像繞口令一樣的“未將對象引用設(shè)置到對象實(shí)例”了,還有那些基本一出現(xiàn)整個(gè)應(yīng)用程序就被判死刑的“堆棧溢出”、“內(nèi)存無法分配”異常了。

      在代碼中您是如何捕獲/處理異常的?

      這道題的回答可以體現(xiàn)你是什么“級別”的程序員,這個(gè)級別倒不是說水平的高低,是指經(jīng)常寫哪一類的程序,如果對異常的捕獲比較“激進(jìn)”(經(jīng)常捕獲異常)那么這個(gè)人應(yīng)該是一個(gè)應(yīng)用級的程序員。如果對捕獲異常比較謹(jǐn)慎那么應(yīng)該是框架級別的程序員,這些人經(jīng)常寫給別人使用的代碼,如果無故的使用異常處理來越俎代庖,那后果很嚴(yán)重了,這里說一個(gè)我經(jīng)歷的事,剛畢業(yè)的時(shí)候我和同事做一個(gè)WEB的項(xiàng)目,項(xiàng)目里用第三方的Grid,那個(gè)Grid在發(fā)生異常的時(shí)候會(huì)自己報(bào)一個(gè)錯(cuò)誤,你知道我們有多傻眼了吧,我們需要的是我們來抓住異常,然后報(bào)出一句對用戶友好的錯(cuò)誤,但是那個(gè)控件卻干了這么個(gè)蠢事。

      我覺得普通程序員用的最多的CATCH就是抓住數(shù)據(jù)的異常,然后回滾數(shù)據(jù)庫來事務(wù)處理。這是一個(gè)典型的場景,因?yàn)槟忝鞔_并且能夠很好的恢復(fù)狀態(tài)。

      在“catch (ex)”中,“throw”和“throw ex”有什么區(qū)別?

      throw 重新拋出異常但是不破壞異常發(fā)生的調(diào)用棧爾“throw ex”會(huì)重置調(diào)用棧這樣捕獲異常的人會(huì)以為代碼出錯(cuò)在這里。

      您會(huì)如何設(shè)計(jì)異常的結(jié)構(gòu),什么情況下您會(huì)拋出異常?

      首先我會(huì)盡量的使用系統(tǒng)定義的那些異常,如果我需要處理某一特定類別的異常,而且處理方式和通常處理方式不同那么就考慮自定義異常,還有如果需要調(diào)用方用一種統(tǒng)一的方式來處理異常那么自定義異常就是一個(gè)好的選擇。結(jié)構(gòu)的話當(dāng)然基類是Sysytem.Exception,盡量使用扁平化異常的層次?梢钥紤]用泛型類來定義異常。

      我寫的代碼不能完成名字所說明的功能,那么我就會(huì)拋出異常。

      > List和T[]的區(qū)別是什么,平時(shí)你如何進(jìn)行選擇?Dictionary是做什么的?.NET BCL中還有哪些常用的容器?它們分別是如何實(shí)現(xiàn)的(哪種數(shù)據(jù)結(jié)構(gòu))?分別是適用于哪些場景?

      List和T[]的區(qū)別明顯有本質(zhì)的區(qū)別,List 是動(dòng)態(tài)分配內(nèi)存的鏈表,

      【.net面試題及詳解】相關(guān)文章:

      2011最新asp.net面試題與答案07-11

      資深HR詳解面試題的潛臺(tái)詞07-13

      關(guān)于一道.NET程序員面試題的遐想07-13

      WAP網(wǎng)絡(luò)與NET網(wǎng)絡(luò)的區(qū)別于定義!07-10

      京東為什么在用.net07-11

      面試題07-13

      《濟(jì)南的秋天》詳解07-04

      除夕的由來詳解07-04

      房屋保險(xiǎn)詳解07-13