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