面試題 1 什么是 CTS、CLS 和CLR
公共語言運行庫(CLR)是一個CLI 的一個實現,包含了.NET 運行引擎和符合 CLI 的類庫。
通用類型系統(CTS)包含在微軟公司提交的 CLI 規范,定義了一個可以在 CLR 上運行的類型規范。
公共語言規范是 CTS的一個子集,定義了所有面向.NET 的程序所需要符合的最小規范集。
面試題 2 CLR 技術和 COM技術的比較
CLR 和 COM 都定義了組件間交互的規范。COM 並沒有定義如何描述組件間的依賴性,並且由於其嚴格的物理約定,造成了很多組件版本升級和控制的問題。CLR 運用元數據和邏輯類型定義等機制,有效地解決了 COM 遺留的一些問題。並且,相較於 COM模型,筆者認為CLR 更容易理解和學習。
面試題 3 JIT是如何工作的
JIT 引擎在編譯中間代碼之前,會尋找方法的本機機器代碼緩存並且判斷其是否可用,如果可用則直接加載,如果不可用,JIT 引擎會查找類型中的方法存根,找到該中間代碼並且進行編譯。
面試題 4 怎么把程序集放入 GAC 中
GAC是一個具有特定目錄結構的文件夾,所有強簽名的程序集都可以被放入GAC中。可以通過.NET Framework自帶的assembly viewer來簡單地拖動添加一個程序集到 GAC 中,也可以利用諸如 gacutil.exe等工具使用命令行來添加。總之,任何方法歸根結底,都是根據 GAC 的規范和程序集本身的特性,在GAC目錄下建立相應的子目錄結構。
面試題 5 值類型和引用類型的區別
所有繼承自System.ValueType 的類型是值類型,而其他類型都是引用類型。值類型的賦值會產生一個新的數據副本,所以每個值類型都擁有一個數據副本,而引用類型的賦值則是賦值引用。值類型的對象分配在堆棧上,而引用類型的對象分配在堆上。當比較兩個值類型時,進行的是內容比較,而比較兩個引用類型時,進行的是引用比較。
面試題 6 C#中string 和String 有什么區別
String 和 string 是同一個類型的兩個名字,相同情況還有 Object 和 object。除了名稱之外,兩者沒有任何區別。
面試題 7 簡述.NET中堆棧和堆的特點和差異 .NET 的程序在進程內存中分配出堆棧、托管堆和非托管堆。所有的值類型對象和引用類型對象的引用都分配在堆棧上,堆棧根據對象的生存周期來依次分配和釋放,堆棧根據一個指向棧尾的指針來分配內存,效率較高。
.NET 所有引用類型對象分配在托管堆上,托管堆連續分配內存,並且受.NET 的垃圾收集機制管理,受托管堆的內存分配和釋放涉及復雜的內存管理,效率相對於堆棧來說低地多。 需要分配堆內存的非托管類型將被分配在非托管堆上,非托管堆不受.NET 垃圾收集機制管理,內存塊完全由程序員手動申請和釋放。
面試題 8 .NET中GC 的運行機制
垃圾回收是指收集釋放托管堆上不再被使用的對象內存。其過程基本包括:通過算法找到不再被使用的對象、移動對象使所有仍被使用的對象緊靠托管堆的一邊和調整各個狀態變量。 垃圾回收的運行成本較高,對性能的影響較大。程序員在編寫.NET 代碼時,應該避免不必要的內存分配,盡量減少或避免使用 GC.Collect來執行垃圾回收。
面試題 9 簡述 C#中重寫、重載和隱藏的概念
重寫是指用 override 關鍵字重新實現基類中的虛方法,在運行的過程中,無論通過哪個類型的引用,真正對象類型的方法將被調用。隱藏是指用 new關鍵字重新實現基類中的方法,在運行的過程中通過引用的類型判斷應該調用哪個類型的方法。重載是指多個方法共享同一個名字並且擁有相同的返回值,但是卻可以擁有不同的參數列表。
面試題 10 在 C#中如何聲明一個類不能被繼承
C#中通過關鍵字:sealed可以申明一個類型不可被繼承,設計中應該為所有不被作為基類的類型添加sealed關鍵字,以避免各種來自繼承的易產生的錯誤。
面試題 11 Int[]是引用類型還是值類型
數組類型是一族類型,它們都繼承自 System.Array,而System.Array又繼承自System.Object。所有的數組類型都是引用類型。
面試題 12 解釋泛型的基本原理
泛型類似C++中的模板,允許程序員定義更通用的類型和算法,並且在具體使用時再生成具體的封閉類型。所有帶泛型參數的類型都是一個開放式類型,它不能被實例化,但具備所有封閉類型的其他特性,本質上,它和封閉類型沒有區別。
面試題 13 Serializable 特性有何作用
通過為類型添加Serialization特性,可以使對象申明為可被序列化,也即是可被諸如BinaryFormmater等類型的對象序列化和反序列化。
面試題 14 如何自定義序列化和反序列化的過程
通過實現 ISerializable 接口中的 GetObjectData 方法可以實現自定義的序列化,而通過添加帶有SerializationInfo 和StreamingContext的參數的構造方法可以自定義反序列化的過程。
面試題 15 如何使用 IFormattable 接口實現格式化輸出
IFormattable接口幫助類型實現了多樣式的格式化輸出。IFormattable 的ToString方法接受一個代表格式的字符串參數,通過對這個參數的分析來進行格式化輸出。另外,IFormattable.ToString方法接受一個IFormatProvider類型的參數,以允許類型的使用者提供格式化的方法。
面試題 16 .NET提供了哪幾個定時器類型
.NET 的內建類型中有三個定時器類型,分別是:
- System.Windows.Forms.Timer類型
- System.Threading.Timer類型
- System.Timers.Timer類型
面試題 17 在 System.Object 中定義的三個比較方法有何異同
靜態方法 ReferenceEquals 實現了引用比較。靜態 Equals 方法實現了比較高效地調用實例 Equals 方法的功能。實例Equals 方法是一個虛方法,默認的實現是引用比較,類型可以根據需要重寫實例 Equals方法。值類型的基類ValueType 重寫了Equals方法,實現了內容的比較。
面試題 18 請解釋委托的基本原理
委托是一類繼承自System.Delegate 的類型,每個委托對象至少包含了一個指向某個方法的指針,該方法可以是實例方法,也可以是靜態方法。委托實現了回調方法的機制,能夠幫助程序員設計更加簡潔優美的面向對象程序。
面試題 19 委托回調靜態方法和實例方法有何區別
當委托綁定靜態方法時,內部的對象成員變量:_target 將會被設置成null,而當委托綁定實例方法時,_target將會設置成指向該實例方法所屬類型的一個實例對象,當委托被執行時,該對象實例將被用來調用實例方法。
面試題 20 什么是鏈式委托
鏈式委托是指一個由委托串成的鏈表,當鏈表上的一個委托被回調時,所有鏈表上該委托的后續委托將會被順序執行。
面試題 21 請解釋事件的基本使用方法
事件是一種使對象或類能夠提供通知的成員。客戶端可以通過提供事件處理程序為相應的事件添加可執行代碼。事件是一種特殊的委托。
面試題 22 請解釋反射的基本原理和其實現的基石
反射是一種動態分析程序集、模塊、類型、字段等目標對象的機制,它的實現依托於元數據。元數據是存儲在PE 文件中的數據塊,它詳細記錄了程序集或模塊內部的結構、引用的類型和程序集和清單。
面試題 23 如何利用反射來實現工廠模式
使用反射可以實現靈活性較高的工廠模式,其關鍵在於動態地查找產品所包含的所有零件,而不需要通過代碼來逐一分析使用者的需求。反射工廠模式具有靈活性高,運行效率相對較低的特點。
面試題 24 如何以較小的內存代價保存 Type、Field 和 Method 信息
System.RuntimeTypeHandle、System.RuntimeMethodHandle 和 System.RuntimeFieldHandle 三個類型,分別包含了一個指向類型、方法和字段描述的指針,用保存指針的方式來代替保存整個類型、方法和字段的信息描述對象,可以有效地減少內存的消耗。而在實際需要用到這些信息時,又可以通過這三個句柄類型對象,分別得到System.Type、System.Reflection.MethodInfo 和System.Reflection.FieldInfo 類型對象。
面試題 25 什么是線程
線程是微軟公司提出的輕量級線程的概念,一個線程擁有自己的棧和寄存器狀態。一個線程可以包含多個線程,和線程由操作系統調度所不同的是,線程內線程的調度完全由程序員自己控制,操作系統的內核完全不會知道線程的存在。在.NET 架構中,線程的概念不一定和操作系統的線程對應,有些情況下.NET 中的線程對應一個線程。
面試題 26 如何使用.NET的線程池
System.Threading.ThreaPool 類型封裝了線程池的操作。每個進程都擁有一個線程池,.NET 提供了線程池管理的機制,用戶只需要把線程需求插入到線程池中,而不必再理會后續的工作。所有線程池中的線程都是后台線程,他們不會阻礙程序的退出。
面試題 27 C#中的 lock 關鍵字有何作用
C#中的lock關鍵字實質是調用 Monitor.Enter 和Monitor.Exit兩個方法的簡化語法,功能上其實現了進入和退出某個對象的同步。通常情況下,可以通過 lock一個私有的引用成員變量來完成成員方法內的線程同步,而通過lock一個私有的靜態引用成員變量來完成靜態方法內的線程同步。
面試題 28 請解釋 ASP.NET 以什么形式運行
ASP.NET 是作為一個ISAPI 過濾器程序來運行的,同時它是一個.NET CLR的宿主,從而實現了運行托管的服務器代碼的功能。
面試題 29 GET請求和 POST 請求有何區別
HTTP協議中有兩種常用的請求:GET 和POST。GET 請求把表單的數據顯示地放在 URI 中,並且對長度和數據值編碼有所限制。POST 請求把表單數據放在 HTTP請求體中,並且沒有長度的限制。
面試題 30 介紹 ASP.NET的頁面生存周期
如果把 ASP.NET 頁面的生存周期步驟做個分類的話,可以大致分為四類:
- 初始化
- 加載數據和頁面
- 觸發事件
- 保存狀態並呈現頁面
1)初始化
初始化包含上文列出的 PreInit、Init 和 InitComplete 三個步驟,其功能包含了初始化類對象、初始化主題主頁面等特性,判斷是否是第一次訪問頁面等初始功能。
2)加載數據和頁面
這一類型包含了 LoadSate、ProcessPostDate、PreLoad、Load、ProcessPostData(第二次)等步驟。 首先從頁面回傳的數據加載入 ViewState對象,所有的數據都會以 Base64 編碼隨頁面傳入服務器。然后開始處理回傳的數據,也就是把表單中的鍵/值對存入對象之中。隨后就開始加載頁面,程序員通常會在這里做一些初始化的編程,例如在 OnLoad 事件中編寫頁面初始化代碼。最后會再次執行ProcessPostData,以處理 Load時候新添加的數據。
說明:兩次執行 ProcessPostData通常會讓程序員感到困惑,事實上這兩次數據處理都是必須的。第一次處理保證了在執行頁面加載之前,所有的數據從頁面上被讀入,這樣頁面加載時就可以訪問這些數據。而第二次ProcessPostData則是為了使頁面加載時新建立的控件中的數據能夠得到處理。這兩次處理缺一不可。
3)觸發事件
觸發事件包含了 ChangedEvents和PostBackEvent步驟。這里首先會比較ViewState中的數據和頁面上一次回傳的數據,覺得有哪些事件需要被觸發,這里事件是逐一被觸發的,但其順序將無法確定。然后會查看是否觸發Post Back 事件,該事件也就是頁面提交的事件。
4)保存狀態並呈現頁面
這里會包含SaveState、SaveStateComplete、Render步驟。首先頁面會編碼保存所有的 ViewState 數據,然后將其嵌入到頁面的一個隱藏控件中。接着轉換所有的控件標簽並生成頁面 HTML,並且發送回客戶端。
注意:上述分類並沒有包含最終的 Unload 步驟,這是因為這個步驟雖然重要,但從不需要程序員關心,ASP.NET 會負責釋放所有對象的資源。
面試題 31 列舉幾種實現頁面跳轉的方法
幾乎在每個 ASP.NET 的應用程序中,都會出現頁面跳轉的需求,而實現頁面跳轉也有非常多的方法:
- 使用Response.Redirect 方法
- 使用Server.Transfer方法
- 使用Server.Execute 方法
- 使用javascript腳本
- 使用超鏈接
面試題 32 如何防止 SQL注入式攻擊
SQL 注入式攻擊時常見的一種攻擊方法,主要利用的是系統設計的弊端。程序員在設計時需要考慮到注入式攻擊的問題,避免直接使用用戶輸入拼接 SQL 語句,適當使用加密數據進行存儲,並且在合適的場合使用存儲過程。
面試題 33 ADO.NET支持哪幾種數據源
ADO.NET 一共支持四個類別的數據源,分別是:SQL SERVER數據庫、ORACLE 數據庫、OLE DB提供商和 ODBC提供商。
面試題 34 請簡要敘述數據庫連接池的機制
ADO.NET 對上層用戶提供了數據庫連接池的服務,使用完的數據庫連接將被有選擇的保持在數據庫連接池中,以供下次使用。當用戶以某個連接字符串申請數據庫連接時,數據庫連接池將嘗試尋找在池中尋找具有相同的連接字符串的連接,並直接提供給用戶。
面試題 35 一個連接字符串可以包含哪些屬性
連接字符串包含了豐富的可選屬性,在進行數據庫操作時,程序員應該對數據庫連接字符串進行再三斟酌,不同的設置將適合不同的實際情況。詳細的連接字符串屬性列表請參考表 1。
面試題 36 什么是強類型的 DataSet
強類型DataSet 是指那些固定結構的繼承自 DataSet的類型,相較於DataSet而言,強類型的 DataSet具有訪問方便,約束性強的特點,有利於數據訪問層的隔離,也有利於把錯誤提前到編譯階段被發現。
面試題 37 什么是 XML
XML就是可擴展性標記語言, XML是一種簡單的數據存儲語言,使用一系列簡單的標記描述數據,而這些標記可以用方便的方式建立,XML極其簡單且易於掌握和使用。
面試題 38 XML 中的命名空間如何使用
命 名 空 間 被 用 來 模 塊 化 XML 文 檔 中 的 元 素 , 它 以 如 下 形 式 定 義 :
xmlns:namespace-prefix="namespace"。當解析器試圖讀取特定命名空間下的節點時,需要指定命名空間的名稱。
面試題 39 .NET中如何驗證一個 XML 文檔的格式
經過 W3C 組織的推薦,XSD 已經成為了最為標准和通用的 XML 結構定義語言。在.NET 中,XmsReader支持使用XSD文件來驗證XML文檔是否符合特定的格式,程序員需要做的事為其設置包含了指定XSD 文件的XmlReaderSetting對象,並且遍歷XML文檔。
面試題 40 什么是 XSLT,XSLT有何作用
XSLT 是一種對XML文檔進行格式轉換的語言,其通過 XPath來從XML 文檔中提取所需內容,並且依照特定語法組織新的格式。
面試題 41 如何在代碼中使用 XSLT文檔
.NET 中所有支持 XSL 的類型都被定義在 System.Xml.Xsl 命名空間下,可以使用XslCompiledTransform來進行指定的格式轉換。另外,在 BS結構系統中,客戶端可以使用 javascript腳本調用Microsoft.XMLDOM 類型,並進行格式轉換。
面試題 42 請簡述 SOAP 協議
SOAP 以 XML 形式提供了一個簡單、輕量的用於在分散或分布環境中交換結構化和類型信息的機制。SOAP協議定義了交互的方式,但並未規定時限協議的環境和技術細節。讀者可以參考 SOAP協議定義文檔,來獲取所有的協議內容。
面試題 43 如何在.NET中創建 Web Service
在.NET 中,可以使用內建類型 WebService 和WebMethod特性來實現Web Service,這種方法使得程序員完全不需要處理和通信有關的工作,而將注意力集中在邏輯工作上。為了獲得更大的靈活性,程序員也可以通過實現IHTTPRequest接口來實現定義的 asmx資源請求處理類型。更進一步的,程序員可以自定義資源文件和處理程序,來實現完全自定義的 Web Service,只需要確保所有的返回都符合 SOAP協議。
面試題 44 如何生成 Web Service 代理類型
Web Service 代理類是指負責 SOAP 通信的代理類型,這允許程序員通過調用本地的 Web Service 代理類型來達到訪問 Web Service 服務器的目的。在.NET 中,可以通過使用 wsdl.exe 工具或者添加 Web引用來生成 Web Service 代理類型,后者可以在服務器端有所變動后方便地更新代理類型。
面試題 45 如何提高連接池內連接的重用率
為了提高數據庫連接池的重用率,唯一的方法就是盡量保證系統訪問數據庫所使用的連接字符串不變。例如建立跳板數據庫,使所有連接都首先嘗試訪問跳板數據庫。另外,統一使用超級用戶帳號可以進一步統一連接字符串,但這為系統帶來了安全上的隱患。
面試題 46 ADO.NET支持哪兩種方式來訪問關系數據庫
ADO.NET 一共支持兩種數據庫訪問方式,分別是連接式的和脫機式的。連接式的較適合大數據量並且不能准確預測需要讀取多少記錄的情況,脫機式的更適合進行小數據量的讀取操作。
面試題 47 什么是關系型數據庫
關系型數據庫是支持采用了關系模型的數據庫,簡單來說,關系模型就是指二維表模型。相對於其他模型來說,關系型數據庫具有理解更容易、使用更方便、維護更簡單等優點。
面試題 48 Session有哪幾種存儲方式,之間有何區別,如何進行設置
Session 數據一共有四種存儲方式,分別為存儲在 IIS進程中、狀態服務器中、SQL Server數據庫中和自定義程序中。除了准備必要的服務外(如 SQL Server數據庫服務器),還需要配置站點的 Web.Config文件進行設置。
說明:可以在 Web.Config中設置關閉 Session數據,這樣會話的數據就不能得到保存。
面試題 49 請簡述 ViewState 的功能和實現機制
ViewState 用來存儲頁面范圍內的數據,以保證用戶在離開頁面之前數據的持續性。實現上來說,ViewState被保存在頁面內的一個隱藏控件內,並且在提交到服務器后被提取使用。