- .net軟件工程師面試題及答案 推薦度:
- 相關(guān)推薦
.net面試題及答案
.net程序員在求職面試中,學(xué)會(huì)做好面試準(zhǔn)備很重要,那么你了解面試題及答案了嗎?下面陽(yáng)光網(wǎng)小編已經(jīng)為你們整理了.net面試題及答案,希望可以幫到你。
.net面試題及答案(一)
1.JIT是什么,它是如何工作的?GC是什么,簡(jiǎn)述一下GC的工作方式?
JIT:Just in time,C#或者是VB.NET的代碼首先被編譯為IL存儲(chǔ)在本地,當(dāng)要運(yùn)行這些代碼的時(shí)候,CLR對(duì)IL進(jìn)行第二次編譯轉(zhuǎn)換成機(jī)器碼運(yùn)行。好處:可移植性,而且IL在加載到內(nèi)存中時(shí)將受到類(lèi)型安全性方面檢查,這實(shí)現(xiàn)了更好的安全性和可靠性。
GC:垃圾回收(garbage collection),是根據(jù)程序的需要自動(dòng)分配和回收內(nèi)存的過(guò)程。垃圾回收器處理的是引用對(duì)象,而且只回收堆上的內(nèi)存。這意味著假如維持對(duì)一個(gè)對(duì)象的引用,就會(huì)阻止GC重用對(duì)象使用的`內(nèi)存。在.NET中,垃圾回收器采用的是mark-and-compact算法。在一次垃圾回收周期開(kāi)始的時(shí)候,它要識(shí)別對(duì)象的所有跟引用,根據(jù)這個(gè)引用可以遍歷每個(gè)根引用所標(biāo)識(shí)的一個(gè)樹(shù)形結(jié)構(gòu),并遞歸確定所有引用指向的對(duì)象。這樣一來(lái),垃圾回收器就可以識(shí)別所有可達(dá)的對(duì)象,在執(zhí)行回收的時(shí)候,GC不是枚舉所有訪(fǎng)問(wèn)不到的對(duì)象,相反,通過(guò)壓縮所有相鄰的可達(dá)的對(duì)象來(lái)執(zhí)行垃圾回收。不可訪(fǎng)問(wèn)的對(duì)象就會(huì)被覆蓋。垃圾回收的宗旨是提高內(nèi)存的利用率,它并不是用來(lái)清理文件句柄,和數(shù)據(jù)庫(kù)連接字符串,端口或者其他有限的資源(終接器finalizer,不能被顯示調(diào)用,不能傳遞任何參數(shù),即不能被重載,只有垃圾回收器才能調(diào)用終接器,使用Using語(yǔ)句進(jìn)行確定性終結(jié)
2.類(lèi)(class)和結(jié)構(gòu)(struct)的區(qū)別是什么?它們對(duì)性能有影響嗎?
01. 值類(lèi)型與引用類(lèi)型
結(jié)構(gòu)是值類(lèi)型:值類(lèi)型在棧上分配地址,所有的基類(lèi)型都是結(jié)構(gòu)類(lèi)型,例如:int 對(duì)應(yīng)System.int32 結(jié)構(gòu),通過(guò)使用結(jié)構(gòu)可以創(chuàng)建更多的值類(lèi)型
類(lèi)是引用類(lèi)型:引用類(lèi)型在堆上分配地址堆棧的執(zhí)行效率要比堆的執(zhí)行效率高,可是堆棧的資源有限,不適合處理大的邏輯復(fù)雜的對(duì)象。所以結(jié)構(gòu)處理作為基類(lèi)型對(duì)待的小對(duì)象,而類(lèi)處理某個(gè)商業(yè)邏輯因?yàn)榻Y(jié)構(gòu)是值類(lèi)型所以結(jié)構(gòu)之間的賦值可以創(chuàng)建新的結(jié)構(gòu),而類(lèi)是引用類(lèi)型,類(lèi)之間的賦值只是復(fù)制引用
注:1.雖然結(jié)構(gòu)與類(lèi)的類(lèi)型不一樣,可是他們的基類(lèi)型都是對(duì)象(object),c#中所有類(lèi)型的基類(lèi)型都是object
2.雖然結(jié)構(gòu)的初始化也使用了New 操作符可是結(jié)構(gòu)對(duì)象依然分配在堆棧上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段將保持未賦值狀態(tài),且對(duì)象不可用
02.繼承性
結(jié)構(gòu):不能從另外一個(gè)結(jié)構(gòu)或者類(lèi)繼承,本身也不能被繼承,雖然結(jié)構(gòu)沒(méi)有明確的用sealed聲明,可是結(jié)構(gòu)是隱式的sealed .
類(lèi):完全可擴(kuò)展的,除非顯示的聲明sealed 否則類(lèi)可以繼承其他類(lèi)和接口,自身也能被繼承注:雖然結(jié)構(gòu)不能被繼承 可是結(jié)構(gòu)能夠繼承接口,方法和類(lèi)繼承接口一樣
03.內(nèi)部結(jié)構(gòu):
結(jié)構(gòu): 沒(méi)有默認(rèn)的構(gòu)造函數(shù),但是可以添加構(gòu)造函數(shù)沒(méi)有析構(gòu)函數(shù)沒(méi)有 abstract 和 sealed(因?yàn)椴荒芾^承)不能有protected 修飾符可以不使用new 初始化在結(jié)構(gòu)中初始化實(shí)例字段是錯(cuò)誤的
類(lèi): 有默認(rèn)的構(gòu)造函數(shù) 有析構(gòu)函數(shù) 可以使用 abstract 和 sealed 有protected 修飾符
必須使用new 初始化
.net面試題及答案(二)
1.什么是元編程,.NET有哪些元編程的手段和場(chǎng)景?什么是反射?能否舉一些反射的常用場(chǎng)景?有人說(shuō)反射性能較差,您怎么看待這個(gè)問(wèn)題?有什么辦法可以提高反射的性能嗎?
學(xué)著做OA的時(shí)候,動(dòng)態(tài)加載不同的DataProvider(Oracle和Sqlserver),方便,可以隨時(shí)替換不用重新編譯程序
2.委托是什么?匿名方法是什么?在C# 3.0中,Lambda表達(dá)式是什么?擴(kuò)展方法是什么?LINQ是什么?您覺(jué)得C# 3.0中還有哪些重要的特性,它們帶來(lái)了什么優(yōu)勢(shì)?BCL中哪些類(lèi)庫(kù)和這些特性有關(guān)?您平時(shí)最常用哪些?
委托可以把一個(gè)方法作為參數(shù)代入另一個(gè)方法。
委托可以理解為指向一個(gè)函數(shù)的指針。
匿名方法:就是沒(méi)有實(shí)際方法聲明的委托實(shí)例。或者說(shuō),它們的定義是直接內(nèi)嵌在代碼中的。
Lambda表達(dá)式:是比匿名方法更加簡(jiǎn)潔的一種匿名函數(shù)語(yǔ)法
委托和事件沒(méi)有可比性,因?yàn)槲惺穷?lèi)型,事件是對(duì)象,下面說(shuō)的是委托的對(duì)象(用委托方式實(shí)現(xiàn)的事件)和(標(biāo)準(zhǔn)的event方式實(shí)現(xiàn))事件的區(qū)別。事件的內(nèi)部是用委托實(shí)現(xiàn)的。因?yàn)閷?duì)于事件來(lái)講,外部只能“注冊(cè)自己+=、注銷(xiāo)自己-=”,外界不可以注銷(xiāo)其他的注冊(cè)者,外界不可以主動(dòng)觸發(fā)事件,因此如果用Delegate就沒(méi)法進(jìn)行上面的控制,因此誕生了事件這種語(yǔ)法。事件是用來(lái)閹割委托實(shí)例的,類(lèi)比用一個(gè)自定義類(lèi)閹割List。事件只能add、remove自己,不能賦值。事件只能+=、-=,不能= 。事件內(nèi)部就是一個(gè)private的委托和add、remove兩個(gè)方法。
3.工作之外您看哪些技術(shù)相關(guān)的`書(shū)、網(wǎng)站、社區(qū)、項(xiàng)目等等?
您還接觸哪些.NET以外的技術(shù),能和.NET或.NET中有針對(duì)性的部分做個(gè)對(duì)比嗎?
C#本質(zhì)論,SQL Server2008實(shí)戰(zhàn),數(shù)據(jù)結(jié)構(gòu),ASP.NET揭秘,Javascript深入淺出
4.website和webapplication的區(qū)別
1)website修改后不需要重啟即可看到效果,webapplication需要
2)website不分namespace,webapplication有namespace
3)website為了兼容asp轉(zhuǎn)過(guò)來(lái)的開(kāi)發(fā)人員習(xí)慣
4)沒(méi)有技術(shù)上的區(qū)別,調(diào)試習(xí)慣不同
5)website為每個(gè)編譯為一個(gè)dll,webapplication生成一個(gè)dll
6)不利于工程開(kāi)發(fā),比如代碼出錯(cuò)不容易發(fā)現(xiàn)
.net面試題及答案(三)
1.異常的作用是什么?.NET BCL中有哪些常見(jiàn)的異常?在代碼中您是如何捕獲/處理異常的?在“catch (ex)”中,“throw”和“throw ex”有什么區(qū)別?您會(huì)如何設(shè)計(jì)異常的結(jié)構(gòu),什么情況下您會(huì)拋出異常?
(1)C# 語(yǔ)言的異常處理功能可幫助您處理程序運(yùn)行時(shí)出現(xiàn)的任何意外或異常情況
(2)throw會(huì)保留堆棧信息。throw ex 不會(huì)。當(dāng)然,如果你拋出新的異常之前設(shè)置innerException的話(huà),可以通過(guò)innerException的堆棧訪(fǎng)問(wèn)原有的堆棧。
(3)靠異常才能發(fā)現(xiàn)錯(cuò)誤的,通過(guò)try catch finally來(lái)捕獲異常。如果是未預(yù)料到的則不處理(內(nèi)存不足,刪除文件)直接報(bào)錯(cuò)更容易發(fā)現(xiàn)錯(cuò)誤catch塊從最具體到常規(guī)排列
2.List<T>和T[]的區(qū)別是什么,平時(shí)你如何進(jìn)行選擇?Dictionary<TKey, TValue>是做什么的?.NET BCL中還有哪些常用的容器?它們分別是如何實(shí)現(xiàn)的(哪種數(shù)據(jù)結(jié)構(gòu))?分別是適用于哪些場(chǎng)景?
01.List<T>arrylist的泛型版本,大小是可變的,T[]繼承自Array,大小是固定的。如果大小沒(méi)有怎么變化,選擇T[],一般情況下選擇List<T>
02.Dictionary是hashtable的.泛型版本,用來(lái)存儲(chǔ)鍵值對(duì)的.例如:sortlist,stack等
3.抽象類(lèi)和接口有什么區(qū)別?使用時(shí)有什么需要注意的嗎?
如何選擇是定義一個(gè)“完全抽象”的抽象類(lèi),還是接口?什么是接口的“顯式實(shí)現(xiàn)”?為什么說(shuō)它很重要?
相同點(diǎn):都不能被直接實(shí)例化,都通過(guò)繼承實(shí)現(xiàn)其抽象方法
不同點(diǎn):
(1) 接口支持多繼承;抽象類(lèi)不能實(shí)現(xiàn)多繼承。
(2) 接口只能定義行為;抽象類(lèi)既可以定義行為,還可能提供實(shí)現(xiàn)。
(3) 抽象類(lèi)允許包含實(shí)現(xiàn)的virtual成員,所以能為派生類(lèi)成員提供一個(gè)默認(rèn)的實(shí)現(xiàn),而接口所有的成員自動(dòng)成為virtual成員,而且不能包含任何實(shí)現(xiàn)
4.字符串是引用類(lèi)型類(lèi)型還是結(jié)構(gòu)類(lèi)型? 引用類(lèi)型
它和普通的引用類(lèi)型相比有什么特別的地方嗎?不可變的
使用字符串時(shí)有什么需要注意的地方?為什么說(shuō)StringBuilder比較高效?
當(dāng)拼接兩個(gè)字符串時(shí),系統(tǒng)先是把兩個(gè)字符串寫(xiě)入內(nèi)存,接著刪除原來(lái)的String對(duì)象,然后創(chuàng)建一個(gè)String對(duì)象,并讀取內(nèi)存中的數(shù)據(jù)賦給該對(duì)象。這一來(lái)二去的,耗了不少時(shí)間。而使用System.Text命名空間下面的StringBuilder類(lèi)就不是這樣了,它提供的Append方法,能夠在已有對(duì)象的原地進(jìn)行字符串的修改,簡(jiǎn)單而且直接。
在連接多個(gè)字符串時(shí),它無(wú)論何時(shí)都比直接相加更高效嗎?
不一定,在1000個(gè)字符以?xún)?nèi)效果一樣,達(dá)到10000時(shí)StringBuilder類(lèi)的效率會(huì)顯著提升
如何高效地進(jìn)行數(shù)組復(fù)制?“二維數(shù)組”和“數(shù)組的數(shù)組”有什么區(qū)別?
數(shù)組復(fù)制的方法:for CopyTo() 靜態(tài)CopyTo() Clone
【.net面試題及答案】相關(guān)文章:
.net經(jīng)典面試題04-08
.net軟件工程師面試題及答案04-02
.net基礎(chǔ)面試題04-08
.net軟件工程師面試題04-06
經(jīng)典面試題及答案04-04
面試題及答案04-04
.net高級(jí)工程師面試題04-08
net高級(jí)工程師面試題12-09