.NET面試題收集2021.7.15


1、什么是面向對象

 面向對象OO = 面向對象的分析OOA + 面向對象的設計OOD + 面向對象的編程OOP;
通俗的解釋就是萬物皆對象,把所有的事物都看作一個個可以獨立的對象(單元),它們可以自己完成自己的功能,而不是像C那樣分成一個個函數;
現在純正的OO語言主要是java和C#,C++也支持OO,C是面向過程的。

2、簡述 private、 protected、 public、 internal 修飾符的訪問權限。

private : 私有成員, 在類的內部才可以訪問。
protected : 保護成員,該類內部和繼承類中可以訪問。
public : 公共成員,完全公開,沒有訪問限制。
internal: 當前程序集內可以訪問。

  

3、ADO.NET中的五個主要對象

Connection:主要是開啟程序和數據庫之間的連結。沒有利用連結對象將數據庫打開,是無法從數據庫中取得數據的。這個物件在ADO.NET 的最底層,我們可以自己產生這個對象,或是由其它的對象自動產生。
Command:主要可以用來對數據庫發出一些指令,例如可以對數據庫下達查詢、新增、修改、刪除數據等指令,以及呼叫存在數據庫中的預存程序等。這個對象是架構在Connection 對象上,也就是Command 對象是透過連結到數據源。
DataAdapter:主要是在數據源以及DataSet 之間執行數據傳輸的工作,它可以透過Command 對象下達命令后,並將取得的數據放入DataSet 對象中。這個對象是架構在Command對象上,並提供了許多配合DataSet 使用的功能。
DataSet:這個對象可以視為一個暫存區(Cache),可以把從數據庫中所查詢到的數據保留起來,甚至可以將整個數據庫顯示出來。DataSet 的能力不只是可以儲存多個Table 而已,還可以透過DataAdapter對象取得一些例如主鍵等的數據表結構,並可以記錄數據表間的關聯。DataSet 對象可以說是ADO.NET 中重量級的對象,這個對象架構在DataAdapter對象上,本身不具備和數據源溝通的能力;也就是說我們是將DataAdapter對象當做DataSet 對象以及數據源間傳輸數據的橋梁。
DataReader:當我們只需要循序的讀取數據而不需要其它操作時,可以使用DataReader 對象。DataReader對象只是一次一筆向下循序的讀取數據源中的數據,而且這些數據是只讀的,並不允許作其它的操作。因為DataReader 在讀取數據的時候限制了每次只讀取一筆,而且只能只讀,所以使用起來不但節省資源而且效率很好。使用DataReader 對象除了效率較好之外,因為不用把數據全部傳回,故可以降低網絡的負載。
ADO.NET 使用Connection 對象來連接數據庫,使用Command 或DataAdapter對象來執行SQL語句,並將執行的結果返回給DataReader 或 DataAdapter ,然后再使用取得的DataReader 或DataAdapter 對象操作數據結果。

 

4、C#中的委托是什么?事件是不是一種委托?

委托可以把一個方法作為參數代入另一個方法。
委托可以理解為指向一個函數的引用。
是,是一種特殊的委托。

  

5、override與重載的區別

重載是方法的名稱相同。參數或參數類型不同,進行多次重載以適應不同的需要
Override 是進行基類中函數的重寫。為了適應需要。

  

6、描述一下C#中索引器的實現過程,是否只能根據數字進行索引?

不是。可以用任意類型。
避免為索引器設置除 System.Int32、System.Int64、System.String、System.Object、枚舉或泛型類型參數之外的其他參數類型。

 

7、三層架構

通常意義上的三層架構就是將整個業務應用划分為:表現層(UI)、業務邏輯層(BLL)、數據訪問層(DAL)。
區分層次的目的即為了“高內聚,低耦合”的思想。
表現層(UI):通俗講就是展現給用戶的界面,即用戶在使用一個系統的時候的所見所得。
業務邏輯層(BLL):針對具體問題的操作,也可以說是對數據層的操作,對數據業務邏輯處理。
數據訪問層(DAL):該層所做事務直接操作數據庫,針對數據的增添、刪除、修改、更新、查找等每層之間是一種垂直的關系。
三層結構是N層結構的一種,一般來說,層次之間是向下依賴的,下層代碼未確定其接口(契約)前,上層代碼是無法開發的,下層代碼接口(契約)的變化將使上層的代碼一起變化。
優點: 分工明確,條理清晰,易於調試,而且具有可擴展性。
缺點: 增加成本。

  

8、MVC模式

MVC(Model View Controller)模型-視圖-控制器
MVC是典型的平行關系,沒有說誰在上誰在下的關系,模型負責業務領域的事情,視圖負責顯示的事情,控制器把數據讀取出來填充模型后把模型交給視圖去處理。而各種驗證什么的應該是在模型里處理了。它強制性的使應用程序的輸入、處理和輸出分開。MVC最大的好處是將邏輯和頁面分離。

  

9、什么是裝箱和拆箱?

裝箱:從值類型接口轉換到引用類型。
拆箱:從引用類型轉換到值類型。

  

10、什么叫應用程序域

一種邊界,它由公共語言運行庫圍繞同一應用程序范圍內創建的對象建立(即,從應用程序入口點開始,沿着對象激活的序列的任何位置)。
應用程序域有助於將在一個應用程序中創建的對象與在其他應用程序中創建的對象隔離,以使運行時行為可以預知。
在一個單獨的進程中可以存在多個應用程序域。應用程序域可以理解為一種輕量級進程。起到安全的作用。占用資源小。

  

11、CTS、CLS、CLR分別作何解釋

CTS:Common Type System 通用系統類型。
CLS:Common Language Specification 通用語言規范。
CLR:Common Language Runtime 公共語言運行庫。

  

12、在dotnet中類(class)與結構(struct)的異同?

相同點:語法類似
不同點:
1.class是引用類型,繼承自System.Object類;struct是值類型,繼承自System.ValueType類,因此不具多態性。但是注意,System.ValueType是個引用類型。
2.從職能觀點來看,class表現為行為;而struct常用於存儲數據。
3.class支持繼承,可以繼承自類和接口;而struct沒有繼承性,struct不能從class繼承,也不能作為class的基類,但struct支持接口繼承。
4.class可以聲明無參構造函數,可以聲明析構函數;而struct只能聲明帶參數構造函數,且不能聲明析構函數。因此,struct沒有自定義的默認無參構造函數,默認無參構造器只是簡單地把所有值初始化為它們的0等價值。
5.實例化時,class要使用new關鍵字;而struct可以不使用new關鍵字,如果不以new來實例化struct,則其所有的字段將處於未分配狀態,直到所有字段完成初始化,否則引用未賦值的字段會導致編譯錯誤。
6.class可以是抽象類(abstract),可以聲明抽象函數;而struct為抽象,也不能聲明抽象函數。
7.class可以聲明protected成員、virtual成員、sealed成員和override成員;而struct不可以,但是值得注意的是,struct可以重載System.Object的3個虛方法,Equals()、ToString()和GetHashTable()。
8.class的對象復制分為淺拷貝和深拷貝,必須經過特別的方法來完成復制;而struct創建的對象復制簡單,可以直接以等號連接即可。
9.class實例由垃圾回收機制來保證內存的回收處理;而struct變量使用完后立即自動解除內存分配。
10.作為參數傳遞時,class變量是以按址方式傳遞;而struct變量是以按值方式傳遞的。

該答案轉自:Anytao的[你必須知道的.NET] 第四回:后來居上:class和struct  關於類分配在堆上,結構分配在棧上 存在爭議,這種說法應該指通常情況下  另見 xiaotie的 Struct與Class辨析 ,謝謝指正

  

13、堆和棧的區別?

棧是編譯期間就分配好的內存空間,因此你的代碼中必須就棧的大小有明確的定義;
堆是程序運行期間動態分配的內存空間,你可以根據程序的運行情況確定要分配的堆內存的大小。

  

14、能用foreach遍歷訪問的對象的要求

需要實現IEnumerable接口或聲明GetEnumerator方法的類型。

  

15、GC是什么? 為什么要有GC? 

GC是垃圾收集器。程序員不用擔心內存管理,因為垃圾收集器會自動進行管理。
要請求垃圾收集,可以調用下面的方法之一: System.gc()  Runtime.getRuntime().gc()

 

 

16、值類型和引用類型的區別?

1.賦值方式不同:基於值類型的變量直接包含值。將一個值類型變量賦給另一個值類型變量時,將復制包含的值。引用類型變量的賦值只復制對對象的引用,而不復制對象本身。
2.值類型不可能派生出新的類型:所有的值類型均隱式派生自 System.ValueType。但與引用類型相同的是,結構也可以實現接口。
3.值類型不可能包含 null 值:然而,可空類型功能允許將 null 賦給值類型。
4.每種值類型均有一個隱式的默認構造函數來初始化該類型的默認值。 

  

17、C#中的接口和類有什么異同。

不同點:
不能直接實例化接口。
接口不包含方法的實現。
接口可以多繼承,類只能單繼承。
類定義可在不同的源文件之間進行拆分。
相同點:
接口、類和結構都可以從多個接口繼承。
接口類似於抽象基類:繼承接口的任何非抽象類型都必須實現接口的所有成員。
接口和類都可以包含事件、索引器、方法和屬性。

  

18、abstract class和interface有什么區別?

相同點:
都不能被直接實例化,都可以通過繼承實現其抽象方法。
都是面向抽象編程的技術基礎,實現了諸多的設計模式。
不同點:
接口支持多繼承;抽象類不能實現多繼承。
接口只能定義抽象規則;抽象類既可以定義規則,還可能提供已實現的成員。
接口是一組行為規范;抽象類是一個不完全的類,着重族的概念。
接口可以用於支持回調(CallBack);抽象類不能實現回調,因為繼承不支持。
接口只包含方法(Method)、屬性(Property)、索引器(Index)、事件(Event)的簽名,但不能定義字段和包含實現的方法;
抽象類可以定義字段、屬性、包含有實現的方法。 
接口可以作用於值類型(Struct)和引用類型(Class);抽象類只能作用於引用類型。例如,Struct就可以繼承接口,而不能繼承類。

  

19、sleep() 和 wait() 有什么區別?

sleep()方法是將當前線程掛起指定的時間。
wait()釋放對象上的鎖並阻塞當前線程,直到它重新獲取該鎖。

 

20、是否可以繼承String類?

String類是sealed類故不可以繼承。(.NET中沒有final關鍵字,謝謝14樓 New.min 和15樓  Duron800 指正)

 

21、try {}里有一個return語句,那么緊跟在這個try后的finally {}里的code會不會被執行,什么時候被執行,在return前還是后?

會執行,在return前執行。

 

22、new 關鍵字用法

new 運算符 用於創建對象和調用構造函數。
new 修飾符 用於向基類成員隱藏繼承成員。
new 約束 用於在泛型聲明中約束可能用作類型參數的參數的類型。
new實現多態

 

23、描述線程與進程的區別?

1.線程(Thread)與進程(Process)二者都定義了某種邊界,不同的是進程定義的是應用程序與應用程序之間的邊界,不同的進程之間不能共享代碼和數據空間,而線程定義的是代碼執行堆棧和執行上下文的邊界。
2.一個進程可以包括若干個線程,同時創建多個線程來完成某項任務,便是多線程。而同一進程中的不同線程共享代碼和數據空間。用一個比喻來說,如果一個家庭代表一個進程,在家庭內部,各個成員就是線程,家庭中的每個成員都有義務對家庭的財富進行積累,同時也有權利對家庭財富進行消費,當面對一個任務的時候,家庭也可以派出幾個成員來協同完成,而家庭之外的人則沒有辦法直接消費不屬於自己家庭的財產。

 

24、什么是強類型,什么是弱類型?哪種更好些?為什么?

強類型是在編譯的時候就確定類型的數據,在執行時類型不能更改,而弱類型在執行的時候才會確定類型。
沒有好不好,二者各有好處,強類型安全,因為它事先已經確定好了,而且效率高。
一般用於編譯型編程語言,如c++,java,c#,pascal等,弱類型相比而言不安全,在運行的時候容易出現錯誤,但它靈活,多用於解釋型編程語言,如javascript,vb等

 

25、什么是反射?

程序集包含模塊,而模塊又包括類型,類型下有成員,反射就是管理程序集,模塊,類型的對象,它能夠動態的創建類型的實例,設置現有對象的類型或者獲取現有對象的類型,能調用類型的方法和訪問類型的字段屬性。它是在運行時創建和使用類型實例

 

26、DateTime是否可以為null?

不能,因為其為Struct類型,而結構屬於值類型,值類型不能為null,只有引用類型才能被賦值null


27、using() 語法有用嗎?什么是IDisposable?它是如何實現確定性終結的

有用,實現了IDisposiable的類在using中創建,using結束后會自定調用該對象的Dispose方法,釋放資源。不明白什么是確定性終結


免責聲明!

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



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