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應用程式在載入的時候,會首先檢視全域性應用程式
集快取,如果有就可以直接使用,沒有再到應用程式目錄進行查詢
到達勝利之前無法回頭!