如下爲自己認爲比較好的面試題集合,隨時更新
目錄
.NET常見面試題 - 九八八五 - 博客園 (cnblogs.com)
Q:什麼是 CTS、CLS 和CLR
A: 公共語言運行庫(CLR)是一個CLI 的一個實現,包含了.NET 運行引擎和符合 CLI 的類庫。
通用類型系統(CTS)包含在微軟公司提交的 CLI 規範,定義了一個可以在 CLR 上運行的類型規範。
公共語言規範是 CTS的一個子集,定義了所有面向.NET 的程序所需要符合的最小規範集。
Q:JIT是如何工作的
JIT 引擎在編譯中間代碼之前,會尋找方法的本機機器代碼緩存並且判斷其是否可用,如果可用則直接加載,如果不可用,JIT 引擎會查找類型中的方法存根,找到該中間代碼並且進行編譯
關於JIT與CIL的學習:C#/.NET JIT和IL(MSIL或CIL)實現跨平臺 (biancheng.net)
Q:怎麼把程序集放入 GAC 中 (未使用過,有待實踐)
GAC是一個具有特定目錄結構的文件夾,所有強簽名的程序集都可以被放入GAC中。可以通過.NET Framework自帶的assembly viewer來簡單地拖動添加一個程序集到 GAC 中,也可以利用諸如 gacutil.exe等工具使用命令行來添加。總之,任何方法歸根結底,都是根據 GAC 的規範和程序集本身的特性,在GAC目錄下建立相應的子目錄結構。
Q:值類型和引用類型的區別
所有繼承自System.ValueType 的類型是值類型,而其他類型都是引用類型。值類型的賦值會產生一個新的數據副本,所以每個值類型都擁有一個數據副本,而引用類型的賦值則是賦值引用。值類型的對象分配在堆棧上,而引用類型的對象分配在堆上。當比較兩個值類型時,進行的是內容比較,而比較兩個引用類型時,進行的是引用比較。
實際例子:當你存在一個list時,你在循環時修改某個值,此list集合其實也在被修改
當我們不想去修改原有的集合時,如何去做呢?
擴展1:一般可以序列化,反序列化一下這個集合或者數據,然後用一個新的變量去接收反序列化的值即可。
擴展2:值類型裝箱、拆箱
1、裝箱:就是將值類型的數據打包到引用類型的實例中( 比如將int類型的值1賦給object對象obj)
int i=1; object obj=(object)i;
裝箱時到底發生了什麼:
1)、在託管堆中分配內存。分配的內存量是值類型各字段所需的內存量,還要加上託管堆所有對象都有的兩個額外成員(類型對象指針和同步塊索引)所需的內存量
2)、值類型的字段複製到新分配的堆內存
3)、返回對象地址,現在該地址是對象引用;值類型成了引用類型
2、拆箱:就是從引用數據中提取值類型(比如將object對象obj的值賦給int類型的變量i)
object obj=”1”; int i=(int)obj;
拆箱不是裝箱過程倒過來,拆箱的代價要比裝箱低的多,拆箱是獲取指針的過程,該指針指向包含在一個對象中的原始值類型。
拆箱後將堆中的字段包含的值複製棧的值類型實例中。
3、值類型變爲引用類型不一定要裝箱,例如:
string str = "joye.net" + 26; //需要將26裝箱爲string類型 string str1 = "joye.net" + 26.ToString(); //tostring後不需要裝箱。通過反編譯可以知道 ToString是被重寫的方法。
// return String.Format("{0}",x); 所以不涉及到裝箱
Q: .NET中GC 的運行機制
垃圾回收是指收集釋放託管堆上不再被使用的對象內存。其過程基本包括:通過算法找到不再被使用的對象、移動對象使所有仍被使用的對象緊靠託管堆的一邊和調整各個狀態變量。 垃圾回收的運行成本較高,對性能的影響較大。程序員在編寫.NET 代碼時,應該避免不必要的內存分配,儘量減少或避免使用 GC.Collect來執行垃圾回收。
Q: 簡述 C#中重寫、重載和隱藏的概念
重寫是指用 override 關鍵字重新實現基類中的虛方法,在運行的過程中,無論通過哪個類型的引用,真正對象類型的方法將被調用。隱藏是指用 new關鍵字重新實現基類中的方法,在運行的過程中通過引用的類型判斷應該調用哪個類型的方法。重載是指多個方法共享同一個名字並且擁有相同的返回值,但是卻可以擁有不同的參數列表。
Q:接口是否可以繼承接口?抽象類是否可以實現接口?抽象類是否可以繼承實體類?
答:接口是可以繼承接口的,抽象類是可以實現接口的,抽象類可以繼承實體類,但是有個條件,條件是,實體類必須要有明確的構造函數。
Q: GET請求和 POST 請求有何區別
可以先表面入手回答此問題:
表面上:1.Get參數拼接字URL上,POST放在request body中。同時也表明了Get請求暴露了參數,不能傳遞敏感信息
2 GET產生的URL可以被瀏覽器記住,回退不會產生新的請求,POST請求,回退時,會產生新的請求
3.Get請求有長度限制,POST沒有參數的長度限制
4.GET只接受ASCII字符,而POST沒有限制
實質上:
Get和post沒有什麼區別,get和post都是HTTP協議中的兩種發送請求的方法。HTTP的底層是TCP/IP。所以GET和POST的底層也是TCP/IP,也就是說,GET/POST都是TCP鏈接。GET和POST能做的事情是一樣一樣的。你要給GET加上request body,給POST帶上url參數,技術上是完全行的通的。
深層次:
GET和POST還有一個重大區別,簡單的說:
GET產生一個TCP數據包;POST產生兩個TCP數據包。
詳細答案參考:https://www.cnblogs.com/logsharing/p/8448446.html
Q:頁面的生命週期
參考我之前的博客:c# 關於頁面生命週期
Q:sql參數化
-----待定
123
Q: 請簡要敘述數據庫連接池的機制
Q: Session有哪幾種存儲方式,之間有何區別,如何進行設置
首先,Session分爲客戶端Session和服務端Session兩種類型
詳細學習見此博客 https://www.cnblogs.com/zhangkai2237/archive/2012/03/22/2410890.html
擴展1:sessionState mode="Custom" (Custom自定義模式)。
分佈式項目通常部署到不同的服務器中,而傳統的session只存儲到本地服務器,並不能達到session跨域使用,以此程序員們就想到一種方式,達到session共享,現在達到session共享簡單的方法就是將session放入到redis緩存中
參見具體博客:https://www.cnblogs.com/5ishare/p/7507980.html (此博客未實踐,但是知識點可以參考)
擴展2:webapi獲取不到session問題解決 參見具體博客:https://www.cnblogs.com/kekelele/p/15587311.html
Q:ADO.NET的5個常用對象以及功能
必須手寫掌握的代碼(既包含拿電腦寫,拿筆寫):
- 手寫三層架構
- 手寫冒泡排序
- 手寫AJAX:XMLHttpRequest
- 手寫增刪改查、SQLHelper
數據庫
Q:從數據庫讀取記錄,你可能用到的方法有
ExecuteNonQuery 執行的是 增加 修改於刪除
ExecuteScalar 執行的是 返回int類型的查詢存在
Fill是用來查詢填充 Adaputer的集合類
ExecuteReade用用來返回 DateReader查詢結果集
所以,可能用到的方法有:ExecuteScalar,Fill ,ExcutreReader
Q:什麼是事務?什麼是鎖?
答:事務是指一個工作單元,它包含了一組數據操作命令,並且所有的命令作爲一個整體一起向系統提交或撤消請求操作,即這組命令要麼都執行,要麼都不執行。
鎖是在多用戶環境中對數據的訪問的限制。SqlServer自動鎖定特定記錄、字段或文件,防止用戶訪問,以維護數據安全或防止併發數據操作問題,鎖可以保證事務的完整性和併發性。
算法類
Q:一列數的規則如下: 1、1、2、3、5、8、13、21、34...... 求第30位數是多少,用遞歸算法實現
答:
public class MainClass { public static void Main() { Console.WriteLine(Foo(30)); } public static int Foo(int i) { if (i <= 0) return 0; else if(i > 0 && i <= 2) return 1; else return Foo(i - 1) + Foo(i - 2); } }
Q:請編寫一個冒泡排序
public void Bubble(int[] nums) { for (int i = 0; i < nums.Length - 1; i++) { for (int j = 0; j < nums.Length-1-i; j++) { if (nums[j] > nums[j + 1]) { int temp = nums[j]; nums[j] = nums[j + 1]; nums[j + 1] = temp; } } } }
Q:請對以下數據進行由小到大排序 11,3,7,0,12,34,9,45,27,56,89,18,23,66
快速排序的實現
public int sortUnit(int[] array, int low, int high) { int key = array[low]; while (low < high) { /*從後向前搜索比key小的值*/ while (array[high] >= key && high > low) --high; /*比key小的放左邊*/ array[low] = array[high]; /*從前向後搜索比key大的值,比key大的放右邊*/ while (array[low] <= key && high > low) ++low; /*比key大的放右邊*/ array[high] = array[low]; } /*左邊都比key小,右邊都比key大。//將key放在遊標當前位置。//此時low等於high */ array[low] = key; foreach (int i in array) { Console.Write("{0}\t", i); } Console.WriteLine(); return high; } public void Quick(int[] array, int low, int high) { if (low >= high) return; /*完成一次單元排序*/ int index = sortUnit(array, low, high); /*對左邊單元進行排序*/ Quick(array, low, index - 1); /*對右邊單元進行排序*/ Quick(array, index + 1, high); }
NET CORE
優點:按需加載,高效
Q:有哪些基礎的是已經注入了(例如log),有哪些是需要自己手動配置的(例如session)?
Q: .net core 中的configservices 和config分別有什麼作用?
Q:NETCORE 爲什麼可以用控制檯託管?
因爲netcore內置了Kestrel(注:有了kestrel才能真正實現跨平臺)
視頻學習
NET5零基礎完整實戰教程詳解
地址:https://study.163.com/course/introduction.htm?courseId=1211262801&utm_campaign=share&utm_medium=androidShare&utm_content=courseIntro&utm_u=1450121140&utm_source=weixin
NET架構師訓練營
https://study.163.com/course/introduction.htm?courseId=1210611811&utm_campaign=share&utm_medium=androidShare&utm_content=courseIntro&utm_u=1450121140&utm_source=weixin
ASP.NET Core 學習視頻教程(Blog.Core)
https://www.bilibili.com/video/BV1D4411c7s8?p=1&share_medium=android&share_plat=android&share_session_id=fe458302-fa37-4bc3-8f5c-5585a375cab8&share_source=WEIXIN&share_tag=s_i×tamp=1637823051&unique_k=Zs6uvvo
【編程入門】(完結)深入淺出ASP.NET Core 入門新手教程合集
https://www.bilibili.com/video/BV1wb411W7aB?p=1&share_medium=android&share_plat=android&share_session_id=4819a5a8-5bb0-4bc8-905c-c1f0c0bd7ee9&share_source=WEIXIN&share_tag=s_i×tamp=1637823074&unique_k=DtWcVgc