.NET 面試題 - 初級&中級

初級.NET 開發人員 - 任何使用.NET 的人都應知道的

1. 描述線程與進程的區別?

進程是系統所有資源分配時候的一個基本單位,擁有一個完整的虛擬空間地址,並不依賴線程而獨立存在。進程可以定義程序的一個實例,但它只是佔據應用 程序所使用的地址空間。爲了讓進程完成一定的工作,進程必須至少佔有一個線程,這個線程即爲主線程,默認程序的工作都在這個主線程中完成,可以通過程序創 建多個線程,使多個線程可以同時運行(多CPU支持下),這就是多線程技術。

線程(Thread)與進程(Process)二者都定義了某種邊界,不同的是進程定義的是應用程序與應用程序之間的邊界,不同的進程之間不能共享代碼和數據空間,而線程定義的是代碼執行堆棧和執行上下文的邊界。同一進程中的不同線程共享代碼和數據空間。

2. 什麼是Windows服務,它的生命週期與標準的EXE程序有什麼不同?

Windows服務是運行在windows後臺指定用戶下(默認System)的應用程序,它沒有標準的UI界面,相比標準的EXE程 序,Windows服務是在服務開始的時候創建,而在服務結束的時候銷燬,而且可以設置服務是否與操作系統一起啓動,一起關閉。它支持三種方式:1)自動 方式2)手動方式3)禁用。自動方式下,Windows服務控制器將指導OS啓動後自動啓動服務並運行,而手動方式則必須手工啓動服務,禁用的情況下服務 將不能被啓動。另外標準的EXE默認使用的當前登錄的用戶,而Windows服務則默認使用System用戶,這在對系統資源訪問的時候特別需要注意。

3. Windows上的單個進程所能訪問的最大內存量是多少?它與系統的最大虛擬內存一樣嗎?這對於系統設計有什麼影響?

這個需要針對硬件平臺,公式爲單個進程能訪問的最大內存量=2的處理器位數次方/2,比如通常情況下,32位處理器下,單個進程所能訪問的最大內存量爲:232 /2 = 2G。單個進程能訪問的最大內存量是最大虛擬內存的1/2,因爲要分配給操作系統一半虛擬內存。

4. EXE和DLL之間的區間是什麼?

EXE文件有一個入口點,比如說Main()函數,這樣CLR可以由此處執行這個EXE文件,而DLL不包含這樣一個入口點所以不是可執行的。DLL文件主要包含一些程序集供其它函數調用。

5. 什麼是強類型,什麼是弱類型?哪種更好些?爲什麼?

強類型是在編譯的時候就確定類型的數據,在執行時類型不能更改,而弱類型在執行的時候纔會確定類型。沒有好不好,二者各有好處,強類型安全,因爲它 事先已經確定好了,而且效率高。一般用於編譯型編程語言,如C#、Java與C++等,弱類型相比而言不安全,在運行的時候容易出現錯誤,但它靈活,多用 於解釋型編程語言,如Javascript,VB等。

6. PID是什麼?在做系統的故障排除時如何使用它?

PID是進程編號,在系統發現故障的時候,可以根據它尋找故障所發生的具體進程。可通過Visual Studio將故障進程附加到進程中進行調試。

7. 單個TCP/IP端口上能夠被多少個進程偵聽?

1個

8. 什麼是GAC?它解決了什麼問題?

GAC是Global Assembly Cache,全局程序集緩存的簡稱。它解決了幾個程序共享某一個程序集的問題。不必再將那個被共享的程序集拷貝到應用程序目錄了,.NET應用程序在加載 的時候,會首先查看全局應用程序集緩存,如果有就可以直接使用,沒有再到應用程序目錄進行查找。

GAC還有一個很重要的作用,所有被放入GAC的程序集都是強名程序集,這樣可以保證相同文件名不同版本的程序集被正確的引用,這樣解決了COM時代的DLL地獄問題。同時強名還可以防止程序集僞造。

中級.NET 開發人員

1. 闡述面向接口、面向對象、面向方面編程的區別

面向接口更關注的是概念,它的原則是先定義好行爲規範,再根據行爲規範創建實現,嚴格的來說,面向接口應該是面向對象中的一部分,因爲面向對象也強 調的是本末倒置原則,也就是實現依賴於抽象,而抽象不依賴於具體實現。面向對象是對複雜問題的分解。面向方面的編程是一種新概念,它解決了很多面向對象無 法解決的問題,比如面向對象技術只能對業務相關的代碼模塊化,而無法對和業務無關的代碼模塊化。而面向方面正是解決這一問題的方案,它的關鍵思想是“將應 用程序中的商業邏輯與對其提供支持的通用服務進行分離”。

2. 什麼是Interface?它與Abstract Class有什麼區別?

接口(Interface)是用來定義行爲規範的,不會有具體實現,而抽象類除定義行爲規範外,可以有部分實現,但一個類能實現多個接口,但只能繼承一個父類。Interface可以理解爲是一種契約。

3. 什麼是反射?

程序集包含模塊,而模塊又包括類型,類型下有成員(這些信息存於元數據中),反射就是在運行時管理程序集,模塊,類型的對象,它能夠動態的創建類型 的實例,設置現有對象的類型或者獲取現有對象的類型,能調用類型的方法和訪問類型的字段屬性。它是在運行時創建和使用類型實例。反射功能的類主要在 Sytem.Type命名空間下,使用這些類可以在運行時創建類型實例,然後調用其中方法或訪問其成員對象。

4. 使用ASMX的XML Web服務與使用SOAP的.NET Remoting的區別?

Web服務使用的SOAP協議,而Remoting採用的RPC。Web Service能用於不同平臺,不同語言,Remoting只適用於.NET應用程序之間的通信。效率上.NET Remoting高於Web Service。一般情況下Web Service主要應用於互聯網,.NET Remoting主要應用於局域網。

5. 類型系統是由XMLSchema表示的嗎?CLS是XMLSchema表示的嗎?

XmlSchema是一個特定的XML文檔必須滿足的一套標準。這些標準能夠描述不同的數據類型。如xs:decimal是一種XmlSchema 數據類型,其他類型有像xs:Boolean,xs:Date,xs:int等等。CLS是公共語言規範(Common Language Specification),它是任何.NET下語言(C#,VB.NET等)使用的一套數據類型。如System.Double是一種CLS數據類 型。其他的包括System.Int32,System.Boolean等。

CLS與XMLSchema表述的相同的意思,但其內在不同。

6. 從概念上闡述前期綁定(early-binding)和後期綁定(late-binding)的區別?

這個就像是強弱類型的比較相似,前期綁定是在編譯的時候就確定了要綁定的數據,而後期綁定是在運行的時候才填充數據。所以前期綁定如果失敗,會在編譯時報編譯錯誤,而後期綁定失敗只有在運行時的時候才發生。

7. 調用Assembly.Load算靜態引用還是動態引用?

這種反射操作基本都是動態,即運行時引用。

8. 何時使用Assembly.LoadFrom?何時使用Assembly.LoadFile?

相比LoadFile,用LoadFrom加載程序集時,要求同時將此程序集所依賴的程序集加載進來。而LoadFile加載程序集文件時,只將傳 入參數的文件加載,不考慮程序集依賴,但如果有相同實現,但位置不同的文件用LoadFrom是不能同時加載進來的,而LoadFile卻可以。由於 LoadFile加載的是文件,所以調用它之後,可能因爲缺少必要的依賴造成無法被執行。

9. 什麼叫Assembly Qualified Name?它是一個文件名嗎?它有什麼不同?

它不是一個文件名,相比文件名,Assembly Qualified Name(程序集限定名稱),更能確定一個程序集,它包含文件名,但同時包含版本,公鑰,和區域。因爲同樣一個名稱的文件可能有不同的版本和區域,此時單 獨靠文件名稱,可能會造成不能確定程序集的正確性。

10. Assembly.Load("foo.dll");這句話是否正確?

錯誤,正確的應該是Assembly.Load("foo")或者Assembly.LoadFrom("foo.dll")

11. 做強簽名的assembly與不做強簽名的assembly有什麼不同?

強簽名程序集可以安裝到GAC中,而不做強簽名的確不能。強名程序集可以根據強名來區分相同文件名不同版本的程序集。

12. DateTime是否可以爲null?

不能,因爲DateTime爲Struct類型,而結構屬於值類型,值類型不能爲null,只有引用類型才能被賦值null

13. 什麼叫JIT?什麼是NGEN?它們分別有什麼限制和好處?

Just In Time及時編譯,它是在程序第一次運行的時候才進行編譯,而NGEN是所謂的pre-jit,就是說在運行前事先就將程序集生成爲本機鏡像,並保存到全 局緩存中,運用NGEN可以提高程序集的加載和執行速度,因爲它可以從本機映像中還原代碼和數據結構,而不必像JIT那樣動態生成它們。但是NGEN不能 得到JIT編譯時優化(如根據處理器)的好處,這是其有缺陷的一方面。

14. .NET CLR中一代的垃圾收集器是如何管理對象的生命週期的?什麼叫非確定性終結?

垃圾收集執行的時機不定的,這個過程對於程序員是透明的,垃圾收集器自動控制着它。垃圾收集器的執行原理:週期性地遍歷被應用當前引用的所有對象的 列表。在這個搜索過程中,凡是沒有發現的被引用的對象,都將準備予以銷燬(標記爲0代)。說明了對象在什麼時候終結是不確定的,我認爲這就是非確定性終 結。通常來說,堆的耗盡是收集清掃的觸發條件。

15. Finalize()和Dispose()之間的區別?

Finalize()相當於析構函數,我們不能手動調用這個函數(但可以通過GC.SupperFinalize方法阻止CLR調用 Finalize),CLR自動判斷什麼時候調用這個函數。Dispose()同樣用於釋放託管資源,但是我們可以在任意時刻自行調用Dispose() 方法。總結就是Finalize自動釋放資源,Dispose()用於手動釋放資源。

16. using() 語法有用嗎?什麼是IDisposable?它是如何實現確定性終結的。

有用。using編譯後的MSIL會調用該對象的Dispose方法,釋放資源。實現了IDisposable的類相當與一個契約,即說明這個類要 實現Dispose()方法告訴CLR怎麼釋放它自身。因爲Dispose()方法釋放的非託管資源,所以可以手工調用它來確定性終結一個非託管資 源。(託管資源都是非確定性終結,由CLR管理,沒法改變)

17. tasklist /m "mscor*" 這句命令是幹嘛的?

列出所有使用了以" mscor"作爲開頭的dll或者exe的映像名稱,PID和模塊信息。

18. in-proc和out-of-proc的區別

in-proc是進程內,進程內能共享代碼和數據塊,out-of-proc是進程外,進程外的互操作需要用進程間通訊來實現。

19. .NET裏的哪一項技術能夠實現out-of-proc通訊?

.Net Remoting技術或者WCF技術

20. 當你在ASP.NET中運行一個組件時,它在Windows XP, Windows 2000, Windows 2003上 分別跑在哪個進程裏面?

XP: aspnet_Wp.exe、Windows 2000: aspnet_Wp.exe、Windows 2003: w3wp.exe。XP與2000是IIS5.1,2003是IIS6.0所以有了上述差別。

發佈了1 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章