.net 理論面試題
找了網上前輩整理的面試題整理一下 如下
1. C#中值型別和引用型別分別有哪些?
值型別:結構體(數值型別,bool型,使用者定義的結構體),列舉,可空型別。
引用型別:陣列,使用者定義的類、介面、委託,object,字串。
2. 談談你對EF的理解
這個可以談很多,比如說EF實現機制,最核心的是物件關係對映機制和LINQ To EF Provider,在此基礎上的快取機制、延遲載入、物件狀態跟蹤、事務等等,從對開發者的影響上來說,EF是微軟官方的ORM框架,結束了之前各種第三方ORM混戰的局面,統一了API,這無疑是開發者的福音。EF擁有非常優雅的,基於C#/VB語言優化的API,比如原生的LINQ查詢,自然的Code First的對資料結構的定義,Fluent API方式的資料庫和關係的定義等等。VS完美支援EF並且提供了多種資料庫的適配。
3. 欄位和屬性有什麼區別
如果你編寫一些控制元件給別的開發者用,而需要給他們提供“資料繫結”這種傻瓜化的機制,那麼使用屬性才可以做到。
屬性是方法而欄位不是,當你用反射去掉用的時候,它們有各自的API。因為屬性是方法,所以它可以和方法那樣定義在介面中,或者被繼承和重寫,重寫屬性被ORM/AOP等框架用來注入程式碼。
4. 抽象方法和虛方法的區別
抽象方法一定是虛方法,虛方法未必是抽象方法。虛方法是指可以被繼承類重寫的方法,而抽象方法是指,基類是抽象類,沒有實現它,因此必須被繼承類重寫的方法。
5. new的幾種用法
除了作為建立物件例項的關鍵字以外,new還有個罕見的用法,就是在派生類定義一個重名的同函式簽名的方法,隱藏掉基類的方法。另外就是泛型約束定義建構函式約束的時候用。
6. 什麼叫做泛型
從程式設計的角度說是在定義類或者方法的時候省去具體的型別,由呼叫者來指定,型別+泛型型別合成得到真正的型別。從實現機制上說,泛型是CLR在執行時動態根據泛型型別建立的匿名型別。從OO設計的角度說,泛型體現了多型性。泛型使得程式設計師可以複用資料結構和演算法,並且適應不同的型別,享有編譯期間的強型別檢查和語法提示。
一些經典的FCL提供的泛型型別和介面: List<T>、Dictionary<T1, T2>這個屬於複用資料結構 IComparer<T>、IEnumerable<T>這個屬於複用演算法
7. 什麼叫做類
就C#而言,類是物件的模板,物件是類的例項。C#是強型別語言,一切皆需要型別,除了內建的簡單型別,那些其例項為引用物件的都叫做類。C#也允許定義抽象類和密封類,以及兩者的疊加——靜態類,它們都無法例項化,其實這是編譯器的限制,本質上它們和一般的類沒有區別,是特殊情況
8. 請說明在.net中常用的幾種頁面間傳遞引數的方法,並說出他們的優缺點。
1.QueryString 傳遞一個或多個安全性要求不高或是結構簡單的數值。但是對於傳遞陣列或物件的話,就不能用這個方法了
2.session(viewstate) 簡單,但易丟失 作用於使用者個人,過量的儲存會導致伺服器記憶體資源的耗盡。
3.application 物件的作用範圍是整個全域性,也就是說對所有使用者都有效。其常用的方法用Lock和UnLock
4.cookie 簡單,但可能不支援,可能被偽造 Cookie是存放在客戶端的,而session是存放在伺服器端的。而且Cookie的使用要配合ASP.NET內建物件Request來使用
5.input ttype="hidden" 簡單,可能被偽造
6.url引數簡單,顯示於位址列,長度有限
9. 介面是否可繼承介面? 抽象類是否可實現(implements)介面? 抽象類是否可繼承實體類(concrete class)?
介面可以繼承介面。抽象類可以實現(implements)介面,抽象類是否可繼承實體類,但前提是實體類必須有明確的建構函式。
10. 啟動一個執行緒是用run()還是start()?
啟動一個執行緒是呼叫start()方法,使執行緒所代表的虛擬處理機處於可執行狀態,這意味著它可以由JVM排程並執行。這並不意味著執行緒就會立即執行。run()方法可以產生必須退出的標誌來停止一個執行緒。
11. GC是什麼? 為什麼要有GC?
GC是垃圾收集器。程式設計師不用擔心記憶體管理,因為垃圾收集器會自動進行管理。要請求垃圾收集,可以呼叫下面的方法之一: System.gc() Runtime.getRuntime().gc()
12. 什麼是Web Service?
Web Service便是基於網路的、分散式的模組化元件,它執行特定的任務,遵守具體的技術規範,這些規範使得Web Service能與其他相容的元件進行互操作。
13. c#中值型別和引用型別的區別
1.值型別的資料儲存在記憶體的棧中;引用型別的資料儲存在記憶體的堆中,而記憶體單元中只存放堆中物件的地址。
2.值型別存取速度快,引用型別存取速度慢。
3.值型別表示實際資料,引用型別表示指向儲存在記憶體堆中的資料的指標或引用
4.值型別繼承自System.ValueType,引用型別繼承自System.Object
5.棧的記憶體分配是自動釋放;而堆在.NET中會有GC來釋放
14. c#語言中,結構體和類的區別?
1.結構是實值型別(Value Types),而類則是引用型別(Reference Types)。
2.結構使用棧儲存(Stack Allocation),而類使用堆儲存(Heap Allocation)。
3.所有結構成員預設都是Public,而類的變數和常量數則預設位Private,不過其他類成員預設都是Public。
4.結構成員不能被宣告位Protected,而類成員可以。
15. BS與CS的聯絡與區別。
1.C/S是客戶端需要安裝專用的客戶端軟體,B/S是客戶機上只要安裝一個瀏覽器
2.C/S 一般建立在專用的網路上,C/S更強的適應範圍,
3.C/S比B/S更安全。
4.C/S可以控制本機的其他程式、可以讀寫本地磁碟檔案、可以與硬體互動。
5.B/S很難和本地硬體、程式、檔案進行互動
16. post、get的區別
1.post的引數不會顯示在瀏覽器位址列中,get的引數會顯示在瀏覽器位址列中
2.用post可提交較大的資料量,get提交的資料量則非常小(2k)
3.用post可進行檔案的提交,而用get則不可以
17. 常用的呼叫WebService的方法有哪些?
1.使用WSDL.exe命令列工具。
2.使用VS.NET中的Add Web Reference選單選項
18. try{}裡有一個return語句,那麼緊跟在這個try後的finally {}裡的code會不會被執行,什麼時候被執行,在return前還是後?
會執行,在return前執行。
19. 如何處理幾十萬條併發資料?
用儲存過程或事務。取得最大標識的時候同時更新..注意主鍵不是自增量方式這種方法併發的時候是不會有重複主鍵的..取得最大標識要有一個儲存過程來獲取.
20. 堆和棧的區別?
堆:一般由程式設計師分配釋放。用new、malloc等分配記憶體函式分配得到的就是在堆上
棧:由編譯器自動分配、釋放。在函式體中定義的變數通常在棧上。
21. StringBuilder 和 String 的區別?
1.StringBuilder 是可擴充套件的,在大量字串拼接時使用
2.String 在進行運算時會產生一個新的例項
22. 請說明在.net中常用的幾種頁面間傳遞引數的方法,並說出他們的優缺點。
1.session(viewstate) 簡單,但易丟失application 全域性
2.cookie 簡單,但可能不支援,可能被偽造
3.input type="hidden" 簡單,可能被偽造
4.url引數 簡單,顯示於位址列,長度有限
5.資料庫 穩定,安全,但效能相對弱
23. 向伺服器傳送請求有幾種方式?
get,post。get一般為連結方式,post一般為按鈕方式
24. float f=-123.567F; int i=(int)f;i的值現在是_____?
-123。
25. 委託宣告的關鍵字是______?
delegate
26. &和&&的區別。
&是位運算子,表示按位與運算,&&是邏輯運算子,表示邏輯與(and)
27. MVC模式
MVC(Model-View-Controller)把互動系統的組成分解成模型、檢視、控制器三種部件
28. mvc的優點:
1.通過把專案分成model view和controller,使得複雜專案更加容易維護。
2.沒有使用view state和伺服器表單控制元件,可以更方便的控制應用程式的行為
3.應用程式通過controller來控制程式請求,可以提供豐富的url重寫。
4.對單元測試的支援更加出色
5.在團隊開發模式下表現更出眾
29. MVC的不足:
(1)增加了系統結構和實現的複雜性。對於簡單的介面,嚴格遵循MVC,使模型、檢視與控制器分離,會增加結構的複雜性,並可能產生過多的更新操作,降低執行效率。
(2)檢視與控制器間的過於緊密的連線。檢視與控制器是相互分離,但確實聯絡緊密的部件,檢視沒有控制器的存在,其應用是很有限的,反之亦然,這樣就妨礙了他們的獨立重用。
(3)檢視對模型資料的低效率訪問。依據模型操作介面的不同,檢視可能需要多次呼叫才能獲得足夠的顯示資料。對未變化資料的不必要的頻繁訪問,也將損害操作效能。