.Net 面試題目嘗試回答

來源:互聯網
上載者:User

標籤:java   使用   strong   io   檔案   資料   問題   cti   

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

.net的全稱是.NET Framework 是一種Managed 程式碼的編程模型,採用系統虛擬機器啟動並執行編程平台以通用語言運行庫(CommonLanguageRuntime)為基礎支援多種語言翻譯為機器碼用於執行。

CLI(Common Language Infrasttuctrue)是CLR的一個子集,也就是Net中最終對編譯成MSIL代碼的應用程式的運行環境進行管理的那一部分。在CLR結構圖中CLI位於下半部分,主要包括類載入器(Class Loader),Just-In-Time 編譯器(IL To Native Compilers)和一個運行時環境的垃圾收集器(Garbage Collector)

CLR(Common Language Runtime)是一個刻有多種程式設計語言使用的運行時,CLR的核心功能(比如記憶體管理,程式集載入,安全性,異常處理和線程同步)可由面向CLR的所有語言使用,原始碼檔案通過CLR的編譯器將產生四個部分,即PE32或PE32+的頭,CLR的頭(包括CLR的版本,標記託管模組入口方法),中繼資料(a 描述原始碼中定義的類型和成員 b 描述原始碼中引用的類型和成員),以及IL(中繼語言),之後CLR將IL編譯成CPU指令。PS C++允許編寫非託管類型。

JIT(CLR中的一種編譯器(JIT[just in time]))在JITCompiler中 1 在負責實作類別型的程式集的中繼資料中尋找被調用的方法 2 從中繼資料中擷取該方法的IL 3 分配記憶體塊 4 將IL編譯成本地的CPU指令,然後將這些本地代碼儲存到步驟3分配的記憶體中5 在Type表中修改與方法對應的記錄項,使它只想步驟3分配的記憶體塊 6 跳轉到記憶體塊中的本地代碼

GC(在託管對分配一個對象時候,可能強制執行一次GC)

2 類和結構的區別是什嗎?它們對效能有影響嗎?.NET BCL裡有哪些是類(結構),為什麼他們不是結構(類)?在定義類型時,您是如何選擇類還是結構?

答:結構是實值型別而類是參考型別,因為參考型別總是被託管堆分配,則肯定存在以下即時1 記憶體必須從託管堆分配 2 堆記憶體配置的每個對象都有一些額外成員,這些成員必須初始化 3 對象的其他位元組總是設為0 4 從託管堆分配一個對象時,可能強制一次GC 所以使用實值型別和參考型別,對效能影響較大。 BCL中 從System.ValueType派生的int32 bool Decimal TimeSpan DayofWeek 等都是實值型別,而其他的類型則是參考型別。有一個原因Int32 Bool等是實值型別是因為他們使用較頻繁,不需要有堆來分配記憶體,並在堆存入引入指標地址和索引列表。

3 在.NET 程式運行中,什麼是堆,什麼是棧?什麼情況下會在堆(棧)上分配資料?他們有效能上的區別嗎?“結構”對象可能分配在堆嗎?什麼情況下會發生,有什麼需要注意的嗎?

答:堆的全稱是託管堆,而每一個線程建立的時候都將分配一個線程棧,這個棧的空間用於向方法傳遞實參,並用於方法內部定義局部變數.聲明一個變數,類型或者欄位的時候會在棧上分配資料,之後通過c#的構造器可以分配堆的資料。效能的影響有一部分體現在GC方面,及在堆上的資料,會通過c#的GC演算法(CheckCompress),之後通過代的方式對堆上很久沒有使用的記憶體進行釋放。“結構對象”可以在堆上分配記憶體,這個過程叫做Box 裝箱,裝箱的過程可以描述為 1 在託管堆中分配好記憶體。分配的記憶體量是實值型別的各個欄位需要的記憶體量加上託管堆的所有對象都有的兩個額外成員(類型對象指標和同步索引塊)需要的記憶體量。 2 實值型別的欄位複製到新分配的堆記憶體 3 返回對象的地址。現在,這個地址是對一個對象的引用,實值型別現在是一個參考型別(而拆箱的過程就是擷取對象指標) 在比如說ArrayList.Add(object value)的類似情況下會發生裝箱。(通過ILDasm.exe)來觀察代碼注意事項

Int32 v =5;

object o = v;  --1 對v進行裝箱 將引用指標儲存到 o 

v=123;

 

Console.WriteLine(v+","+(Int32)o); --在這個方法裡會2次裝箱操作 1 對v 進行裝箱,並將指標保留到棧上以進行concat(連結操作) 將字串載入棧上以執行Contact操作  將字串載入到棧上執行concat操作 對o進行拆箱,擷取一個指標,他指向棧上Int32片段 對Int32進行裝箱,並將指標保留在棧上進行Concat操作。

如果需要對實值型別的執行個體引用,該執行個體就必須裝箱。將一個實值型別的執行個體傳給需要擷取一個參考型別的方法,就會發生這種情況。雖然未裝箱的實值型別沒有類型對象指標,但仍可調用由類型類型繼承或重寫的虛方法,如果沒有調用基類的實現,那麼就不會裝箱,但是如果調用了積累的實現,則被裝箱。而GetType或者MemberwiseClone ,都會對實值型別進行裝箱。

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

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

 

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

 

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

 

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

5 List和T[]的區別是什麼,平時你是如何選擇的?Dictionary<TKey,TValue>是做什麼的?.NET BVL中還有哪些常用的容器?他們分別是如何?的(哪種資料結構)?分別適用於哪些情境?

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

 

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

 

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

6 抽象類別和介面有什麼區別?使用時有什麼需要注意的嗎?如何選擇是定義一個“完全抽象”的抽象類別,還是介面?什麼是介面的“顯式實現”?為什麼說它很重要?

答:相同點:都不能被執行個體化,都可以通過繼承實現其抽象方法;

 

不同點:介面支援多繼承,抽象類別不能;介面只能定義行為,抽象類別既可以定義行為,還能提供實現;介面只包含方法、屬       性、索引器和事件的簽名,不能包括自訂欄位和實現方法,抽象類別可以包含自訂欄位和實現方法。

7 字串是參考型別還是結構類型?他和普通的應用類型相比有什麼特別的地方嗎?使用字串時有什麼需要注意的地方?為什麼說StringBuilder比較高效?在連結字串時,他無論何時都比直接相加更高效嗎?

字串是特殊的參考型別。

 

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

 

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

 

不是的,對於簡單的字串串連操作,在效能上StringBuilder不一定總是優於String,因為StringBuilder對象的創   建代價比較大,在字串串連目標較少的情況下,過度濫用StringBuilder會導致效能的浪費而非節約。只有大量的或者無法預知次數的字串操作,才考慮以StringBuilder實現。

8 如何高效的進行數組複製?“二維數組和數組內數組有什麼區別”?在使用雙重迴圈遍曆一個二維數組時,如何選擇內外層的遍曆順序?

9 什麼是元編程,.NET有哪些元編程的手段和情境?什麼是反射?能否舉一些反射的常用情境?有人說反射效能較差,您怎麼看待這個問題?有什麼辦法可以提高反射的效能嗎?

 元編程是對程式本身的編程,如反射;

 

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

10 委託是什嗎?匿名方法是什嗎?在C#3.0 中 lambda運算式是什嗎?擴充方法是什嗎?LINQ是什嗎?您覺得在C#3.0中還有哪些重要的特性,他們帶來什麼優勢?BCL中哪些類庫和這些特性有關?您平時工作最常用哪些?

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

 

 Lambda運算式函數式編程,LINQ表示Language-integrated Query (LINQ),為CLR提供了資訊查詢能力。

 

 擴充方法,用this關鍵字標記延伸方法的第一個參數,且該參數不能為指標類型。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.