C#.NET面試題匯總系列三:高級知識


0. 參考文檔

1. IList 接口與List的區別是什么?

IList 泛型接口是 ICollection 泛型接口的子代,並且是所有泛型列表的基接口,接口定義了一些操作方法這些方法要自己去實現

List 是個類型 已經實現了IList 定義的方法

2. 談談ArrayList和List<>的性能區別

ArrayList的每一個Add方法,都需要將數據進行裝箱操作,而如果提取的值是值類型又會涉及拆箱動作,而裝箱和拆箱是有損性能的,是會耗時的

3. 泛型的主要約束和次要約束是什么?

主要約束:一個泛型參數至多擁有一個主要約束,主要約束可以是一個引用類型、class或者struct

次要約束:主要是指實參實現的接口的限定。對於一個泛型,可以有0到無限的次要約束,次要約束規定了實參必須實現所有的次要約束中規定的接口

4. 如何把一個array復制到arrayist里?

foreach(object arr in array)
{
  arrayist.Add(arr);
}

5. 有10萬個數字,判斷一下里面是否存在重復的數字

使用C#的List集合自帶的去重方法,例如 Distinct(),GroupBy()等

利用 Dictionary 的Key值唯一的特性

6. 什么是閉包?

通過 Lambda 表達式可以訪問 Lambda 表達式塊外部的變量,這成為閉包

當引用外部變量時,需要注意,外部變量變化時,lambda表達式的結果也可能會隨着外部變量變化而變化

7. EF(Entity Framework)是什么?

體框架EF是ADO.NET中的一組支持開發面向數據的軟件應用程序的技術,是微軟的一個ORM框架

8. 什么是ORM?

ORM指的是面向對象的對象模型和關系型數據庫的數據結構之間的互相轉換

9. 描述EF的幾種開發模式

答: 共三種,但是CodeFirst有一種特殊的

  • CodeFirstFromDB,代碼先行,但是實體來時來自於數據庫
  • CodeFirst 領域設計時先定義實體類,用實體類生成數據庫
  • DbFirst 從數據庫生成實體類
  • Model First 使用Visual Studio實體設計器,設計ER,同時生成Entity類DB

10. 請說明EF中映射實體對象的幾種狀態

一共五種狀態

  • Detached:該實體未由上下文跟蹤

  • Unchanged:實體將由上下文跟蹤並存在於數據庫中,其屬性值與數據庫中的值相同

  • Added:實體將由上下文跟蹤,但是在數據庫中還不存在

  • Deleted:實體將由上下文跟蹤並存在於數據庫中,但已標記為在下次調用 SaveChanges 時從數據庫中刪除

  • Modified:實體將由上下文跟蹤並存在於數據庫中,已修改其中的一些或所有屬性值

11. 為什么用EF而不用原生的ADO.NET?

大的提高開發效率,EF是微軟自己的產品,開發中代碼都是強類型的

12. 如何提高LINQ性能問題?

在數據庫中的表中定義合適的索引和鍵

只獲得你需要的列和行

盡可能使用一條查詢而不是多條

只為了展示數據,而不進行后續修改時,可以使用AsNoTracking,取消實體狀態追蹤

13. 什么是IEnumerable?

是一個接口,它只含有一個方法GetEnumerator

實現了這個接口的類可以使用Foreach關鍵字進行迭代,實現這個接口必須實現方法GetEnumerator

IEnumerable功能有限,不能插入和刪除,訪問IEnumerable只能通過迭代,不能使用索引器

在迭代時,只能前進不能后退,新的迭代不會記得之前迭代后值的任何變化

14. LINQ to Object和LINQ to SQL有何區別?

LINQ to SQL可以將查詢表達式轉換為SQL語句,然后在數據庫中執行

LINQ to Object,則是將查詢表達式直接轉化為Enumerable的一系列方法,最終在C#內部執行

LINQ to Object的數據源總是實現IEnumerable,LINQ to SQL的數據源總是實現IQueryable並使用Queryable的擴展方法

15. 泛型的優點有哪些?

代碼的可重用性。無需從基類型繼承,無需重寫成員,擴展性好

類型安全性提高。 泛型將類型安全的負擔從你那里轉移到編譯器。 沒有必要編寫代碼來測試正確的數據類型,因為它會在編譯時強制執行。 降低了強制類型轉換的必要性和運行時錯誤的可能性

性能提高。泛型集合類型通常能更好地存儲和操作值類型,因為無需對值類型進行裝箱

16. try {}里有一個return語句,finally 的code會不會被執行,什么時候被執行

會執行,在return前執行

17. 在c#中,反射是什么?

反射(Reflection)是.NET中的重要機制,通過放射,可以在運行時獲 得.NET 中每一個類型(包括類、結構、委托、接口和枚舉等)的成員,包括方法、屬性、事件,以及構造函數等。還可以獲得每個成員的名稱、限定符和參數等

18. GC是什么? 為什么要有GC?

GC是垃圾收集器。程序員不用擔心內存管理,因為垃圾收集器會自動進行管理

.NET的GC機制有這樣兩個問題:首先,GC並不是能釋放所有的資源。它不能自動釋放非托管資源

GC並不是實時性的,這將會造成系統性能上的瓶頸和不確定性

GC就是對“不可達“的對象進行回收,釋放內存

19. 應用程序池集成模式和經典模式的區別?

如果托管應用程序在采用集成模式的應用程序池中知運行,服務器將使用 IIS 和 ASP.NET 的集成請求處理管道來處理請求

如果托管應用程序在采用經典模式的應用程序池中運行,服務器會繼續通過 Aspnet_isapi.dll 路由托管代碼請求,其處理請求的方式就像應用程序在 IIS 6.0 中運行一樣

20. 私有程序集與共享程序集有什么區別?

一個私有程序集通常為單個應用程序所使用,並且存儲於這個應用程序所在的目錄之中或此目錄下的一個子目錄中

共享程序集通常存儲在全局程序集緩存(Global Assembly Cache)之中,這是一個由.NET運行時所維護的程序集倉庫。共享程序集通常是對許多應用程序都有用的代碼庫,比如.NET Framework類

21. 什么是GAC?它解決了什么問題?

Gloal Assembly Cache,全局應用程序集緩存。它解決了幾個程序共享某一個程序集的問題。不必再將那個被共

享的程序集拷貝到應用程序目錄了,其實這道理很簡單,.net應用程序在加載的時候,會首先查看全局應用程序

集緩存,如果有就可以直接使用,沒有再到應用程序目錄進行查找


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM