C# .Net基礎知識點解答 C# .Net基礎知識點解答

C# .Net基礎知識點解答

1. 什麼是.NET?什麼是CLI?什麼是CLR?IL是什麼?JIT是什麼,它是如何工做的?GC是什麼,簡述一下GC的工做方式?javascript

通俗的講,.Net是微軟開發應用程序的一個平臺;html

CLI是Common Language Infrastructure,是公共語言架構;java

CLR是Common Language Runtime,即公共語言運行時;編程

IL是.Net編譯器產生的中間代碼,稱爲通用中間語言CIL(Common Intermediate Language),CIL常被稱爲MSIL,即表明IL的微實現語言;數組

JIT是以即時編譯Just In Time的方式編譯IL代碼,和Java的字節碼ByteCode對比來講,字節碼是解釋性編譯,而JIT是即時編譯,效率上會更勝一籌。數據結構

除此以外,還有CTS 通用類型系統,Common Type System;CLS公共語言規範Common Language Specification;FCL .Net框架類庫Framework Class Library;架構

引用《你必須知道的.Net》一書中的插圖作說明框架

GC,垃圾回收器,Garbage Collection,負責執行內存的清理工做,GC經過對託管堆的管理,能有效的解決C++程序中相似於內存泄露、訪問不可達對象等問題。ide

一個對象若沒有被其餘任何對象引用,則該對象被認爲是能夠回收的對象;函數式編程

最好不要經過GC.Collect來強制執行垃圾回收;

垃圾對象並不是被當即執行內存清理,GC能夠在任什麼時候候執行垃圾收集。

 

2. 類(class)和結構(struct)的區別是什麼?它們對性能有影響嗎?.NET BCL裏有哪些是類(結構),爲何它們不是結構(類)?在自定義類型時,您如何選擇是類仍是結構?

Class是引用類型,是非配在內存的託管堆上,可以被實例化,屬於引用類型,類是引用傳遞的;

而struct是值類型,分配在內存的棧上,結構體是複製傳遞的,如Int3二、Boolean、DateTime都是結構體。

頻繁大量使用引用類型須要GC回收處理,在某些狀況下對性能會有影響。

若是一個對象只有屬性、沒有方法的時候應該定義成struc,開銷會小一些;class適用於這個對象同時具備行爲和屬性。

 

3. 在.NET程序運行過程當中,什麼是堆,什麼是棧?什麼狀況下會在堆(棧)上分配數據?它們有性能上的區別嗎?"結構"對象可能分配在堆上嗎?什麼狀況下會發生,有什麼須要注意的嗎?

棧是編譯期間就分配好的內存空間,所以代碼中必須就棧的大小有明確的定義,如局部類型變量、值類型參數等;

堆是程序運行期間動態分配的內存空間,能夠根據程序的運行狀況肯定要分配的堆內存的大小。

性能上棧要比內存堆的開銷小一些,速度快;

會,當一個類裏面包含結構體對象的時候,struct會分配在堆上,值類型老是分配在它聲明的地方。

 

4. 泛型的做用是什麼?它有什麼優點?它對性能有影響嗎?它在執行時的行爲是什麼?.NET BCL中有哪些泛型類型?舉例說明平時編程中您定義的泛型類型。

泛型相似於模板,有利於代碼重用;

省去了拆箱、裝箱過程,性能上提高了不少;

本質上來說,在IL初次編譯時泛型T只是做爲類型佔位符;

BCL中實現了泛型接口的類都是檢討類型,如List<T>, Dictionary<T,K>

 

5. 異常的做用是什麼?.NET BCL中有哪些常見的異常?在代碼中您是如何捕獲/處理異常的?在"catch (ex)"中,"throw"和"throw ex"有什麼區別?您會如何設計異常的結構,什麼狀況下您會拋出異常?

異常是系統容錯和規範程序的不可或缺的重要因素和手段。

BCL中常見的異常有StackOverflowException、OutOfMemoryException、NullReferenceException、IndexOutOfRangeException、ArgumentException、DivideByZeroException等;

捕獲異常使用try-catch-finally語句塊 ;

"throw"和"throw ex"的區別是:推薦使用throw來拋出異常,由於throw ex會將上次異常清空,又拋出一個新的異常,不利於堆棧跟蹤錯誤源頭。

 

6. List<T>和T[]的區別是什麼,平時你如何進行選擇?Dictionary<TKey, TValue>是作什麼的?.NET BCL中還有哪些經常使用的容器?它們分別是如何實現的(哪一種數據結構)?分別是適用於哪些場景?

List<T>長度不固定,動態變化,支持方法較多;T[]固定大小的泛型數組。

Dictionary<TKey, TValue>是泛型字典,提供一對一的關係;

.Net BCL中經常使用的集合有Stack<T>、Queue<T>、LinkedList<T>,對應的數據結構是棧、隊列和鏈表。

 

7. 抽象類和接口有什麼區別?使用時有什麼須要注意的嗎?如何選擇是定義一個"徹底抽象"的抽象類,仍是接口?什麼是接口的"顯式實現"?爲何說它很重要?

相同點:都不能被實例化,均可以經過繼承實現其抽象方法;

不一樣點:接口支持多繼承,抽象類不能;接口只能定義行爲,抽象類既能夠定義行爲,還能提供實現;接口只包含方法、屬性、索引器和事件的簽名,不能包括自定義字段和實現方法,抽象類能夠包含自定義字段和實現方法。

 

8. 字符串是引用類型類型仍是結構類型?它和普通的引用類型相比有什麼特別的地方嗎?使用字符串時有什麼須要注意的地方?爲何說StringBuilder比較高效?在鏈接多個字符串時,它不管什麼時候都比直接相加更高效嗎?

字符串是特殊的引用類型。

其特殊之處在於string是不可變的,即字符串恆定性(Immutability),字符串一經建立,就不可改變。

當大量使用string進行拼接的時候,直接使用string+會影響效率,使用StringBuilder更爲合適;

不是的,對於簡單的字符串鏈接操做,在性能上StringBuilder不必定老是優於String,由於StringBuilder對象的建立代價比較大,在字符串鏈接目標較少的狀況下,過分濫用StringBuilder會致使性能的浪費而非節約。只有大量的或者沒法預知次數的字符串操做,才考慮以StringBuilder實現。

 

9. 如何高效地進行數組複製?"二維數組"和"數組的數組"有什麼區別?在使用雙重循環遍歷一個二維數組時,如何選擇內外層的遍歷順序?

 

 

10. 什麼是元編程,.NET有哪些元編程的手段和場景?什麼是反射?可否舉一些反射的經常使用場景?有人說反射性能較差,您怎麼看待這個問題?有什麼辦法能夠提升反射的性能嗎?

元編程是對程序自己的編程,如反射;

程序集包含模塊,模塊又包含類型,類型下有成員,反射就是管理程序集、模塊、類型的對象,它可以動態的建立類,獲取現有對象的類型,能調用類型的方法和訪問類型的字段屬性。它是在程序運行時建立和使用類型的。

 

11. 委託是什麼?匿名方法是什麼?在C# 3.0中,Lambda表達式是什麼?擴展方法是什麼?LINQ是什麼?您以爲C# 3.0中還有哪些重要的特性,它們帶來了什麼優點?BCL中哪些類庫和這些特性有關?您平時最經常使用哪些?

委託是指向函數的指針;匿名方法相似javascript中的匿名方法,無須聲明,直接使用;

Lambda表達式函數式編程,LINQ表示語言集成查詢,爲CLR提供了信息查詢能力。

擴展方法,用this關鍵字標記擴展方法的第一個參數,且該參數不能爲指針類型。

相關文章
相關標籤/搜索