- 1. NET/dotnet core/.NET framework 的關系
- 2. corefx, coreclr 都是什么?
- 3. asp.net core
- 3.1. 3.1 Kestrel
- 3.2. 3.2 asp.net core 主要的特性
- 3.3. 3.3 startup class的作用?
- 3.4. 3.4 Startup class的config service方法有什么作用?
- 3.5. 3.5 startup class的configure方法有什么作用?
- 3.6. 3.6 什么是meta packages?
- 3.7. 3.7 什么是中間件?
- 3.8. 3.8 application builder的use和run方法有什么區別?
- 3.9. 3.9 dot net core 管道(pipeline)里面的map拓展有什么作用?
- 3.10. 3.10 如何在dot net core中激活session功能?
- 3.11. 3.11 如何在controller中注入service?
- 3.12. dot net core里面的路徑是如何處理的?
- 3.13. application builder的use和run方法有什么區別?
- 3.14. 3.12 依賴注入后的服務生命周期?
- 3.15. 3.13 什么么是Razor頁面?
- 3.16. 3.14 如何在Razor頁面中實現數據模型綁定?
- 3.17. 3.15 Server.Transfer和Response.Redirect的區別是什么
- 3.18. API,什么時候用Get/Post/Put/Delete
- 4. C
- 4.1. 一個單例(Singleton)類
- 4.2. abstract class和interface有什么區別?
- 4.3. 是否可以繼承String類?
- 4.4. StringBuilder 和 String 的區別?
- 4.5. 什么情況下會用到虛方法?它與接口有什么不同?
- 4.6. string、String;int、Int32;Boolean、bool的區別
- 4.7. private、 protected、 public、 internal 修飾符的訪問權限。
- 4.8. C#中的委托是什么?事件是不是一種委托?事件和委托的關系。
- 4.9. override與重載(overload)的區別
- 4.10. 什么是裝箱(boxing)和拆箱(unboxing)
1. NET/dotnet core/.NET framework 的關系
先看2張圖
最新的.NET 5的示意圖
之前的(dotnet core3.x時代)的示意圖
總結如下:
- 2016 年開始,分開了.NET Framework和.NET Core,后者開源、面向跨平台應用;
- 2019年,.NET Framework和.NET Core被.NET5完成了統一。未來只會有一個.NET,可以支持 Windows、Linux、macOS、iOS、Android、tvOS、watchOS 和 WebAssembly,等等
- .Net standard library 是之前.NET Framework和.NET Core公共的部分;
2. corefx, coreclr 都是什么?
dotnet 組織包含了.NET Core的核心代碼, 包括coreclr和corefx等.
- coreclr是運行時代碼,
- corefx是各種基礎類庫的代碼. CoreFX主要包含數個公共庫,例如 System.Collections, System.IO, System.Xml等。
3. asp.net core
3.1. 3.1 Kestrel
Kestrel是asp.net core引入的跨平台的網絡服務器,是默認配置。可以沒有iis, apache和nginx就可以單獨運行。
Kestrel基於libuv實現;(node.js 也是基於libuv)
3.2. 3.2 asp.net core 主要的特性
- 依賴注入。
- 日志系統架構。
- 引入了一個跨平台的網絡服務器,kestrel。可以沒有iis, apache和nginx就可以單獨運行。
- 可以使用命令行創建應用。
- 使用AppSettings.json 來配置工程。
- 使用start up來注冊服務。
- 更好的支持異步編程。
- 支持web socket和signal IR。
- 對於跨網站的請求的預防和保護機制。
3.3. 3.3 startup class的作用?
Startup class是dot net core應用的入口。所有的dot net core應用必須有這個class。這個類用來配置應用。這個類的調用是在program main函數里面進行配置的。類的名字可以自己定義。
3.4. 3.4 Startup class的config service方法有什么作用?
在這個方法里我們可以添加一些service進入依賴注入容器。
3.5. 3.5 startup class的configure方法有什么作用?
這個方法來定義整個應用如何響應HTTP請求。它有幾個比較重要的參數,application builder,Hosting environment, logo factory, 在這里我們可以配置一些中間件用來處理路徑,驗證和session等等。
3.6. 3.6 什么是meta packages?
Meta packages是指包含所有ASP dot net code依賴的一個包。叫做Microsoft.AspNetCore.All
3.7. 3.7 什么是中間件?
中間件在這里是指注入到應用中處理請求和響應的組件。asp.net core 的中間件模型也是洋蔥模型(和node.js d Koa 一樣)
3.8. 3.8 application builder的use和run方法有什么區別?
這兩個方法都在start up class的configure方法里面調用。都是用來向應用請求管道里面添加中間件的。Use方法可以調用下一個中間件的添加,而run不會。
3.9. 3.9 dot net core 管道(pipeline)里面的map拓展有什么作用?
可以針對不同的路徑添加不同的中間件。
public void Configure(IApplicationBuilder app)
{
app.Map("/path1", Middleware1);
app.Map("/path2", Middleware2);
}
3.10. 3.10 如何在dot net core中激活session功能?
- 首先要添加session包.
- 其次要在config service方法里面添加session。
- 然后又在configure方法里面調用usesession。
3.11. 3.11 如何在controller中注入service?
依賴注入的思想:
- 在config services方法中配置這個service。
- 在controller的構造函數中,添加這個依賴注入。
3.12. dot net core里面的路徑是如何處理的?
路徑處理是用來為進入的請求尋找處理函數的機制。所有的路徑在函數運行開始時進行注冊。
主要有兩種路徑處理方式:
- 常規路徑處理就是用MapRoute的方式設定調用路徑
- 屬性路徑處理是指在調用函數的上方設定一個路徑屬性。
3.13. application builder的use和run方法有什么區別?
這兩個方法都在start up class的configure方法里面調用。都是用來向應用請求管道里面添加中間件的。Use方法可以調用下一個中間件的添加,而run不會。
3.14. 3.12 依賴注入后的服務生命周期?
在dot net core中,我們不需要關心如何釋放這些服務, 因為系統會幫我們釋放掉。有三種服務的生命周期。
- 單實例服務, 通過add singleton方法來添加。在注冊時即創建服務, 在隨后的請求中都使用這一個服務。
- 短暫服務, 通過add transient方法來添加。是一種輕量級的服務,用於無狀態服務的操作。
- 作用域服務,一個新的請求會創建一個服務實例。使用add scoped方法來添加。
3.15. 3.13 什么么是Razor頁面?
是dot net core中支持ASP網頁表格的一種開發模型。@page 作為頁面的起始標志。可以看做是asp.net core使用的模板引擎。
3.16. 3.14 如何在Razor頁面中實現數據模型綁定?
使用bindproperty屬性。
3.17. 3.15 Server.Transfer和Response.Redirect的區別是什么
- Server.Transfer僅是服務器中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向后的地址;
- Response.Redirect則是完全的跳轉,瀏覽器將會得到跳轉的地址,並重新發送請求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉后的鏈接地址。
3.18. API,什么時候用Get/Post/Put/Delete
- GET: 查詢
- POST :創建對象
- PUT: 修改對象
- DELETE:刪除
4. C#
4.1. 一個單例(Singleton)類
單線程下的簡單實現:
public MySingleton
{
private MySingleton(){} // 禁止被實例化
public readonly static MySingletonInstance = new MySingleton(); // 程序加載時就會初始化
}
線程安全的加鎖雙檢查
public class MySingleton
{
private static MySingleton _instance = null;
private static readonly object SynObject = new object();
MySingleton() { }
public static MySingleton Instance
{
get
{
if (null == _instance)
{
lock (SynObject)
{
if (null == _instance)
{
_instance = new MySingleton();
}
}
}
return _instance;
}
}
}
4.2. abstract class和interface有什么區別?
相同點:都不能被直接實例化,都可以通過繼承實現其抽象方法。
不同點:
- 接口支持多繼承;抽象類不能實現多繼承。
- 接口只能定義行為;抽象類既可以定義行為,還可能提供實現。
- 接口只包含方法(Method)、屬性(Property)、索引器(Index)、事件(Event)的簽名,但不能定義字段和包含實現的方法;
- 抽象類可以定義字段、屬性、包含有實現的方法。
4.3. 是否可以繼承String類?
String類是sealed類故不可以繼承。
4.4. StringBuilder 和 String 的區別?
String 在進行運算時(如賦值、拼接等)會產生一個新的實例,而 StringBuilder 則不會。所以在大量字符串拼接或頻繁對某一字符串進行操作時最好使用 StringBuilder,不要使用 String。
但是簡單的字符拼接,String還是首選。(100?次以內用String,以上用StringBuilder)
4.5. 什么情況下會用到虛方法?它與接口有什么不同?
- 子類重新定義父類的某一個方法時,必須把父類的方法定義為virtual
- 在定義接口中不能有方法體,虛方法可以。
- 實現時,子類可以不重新定義虛方法,但如果一個類繼承接口,那必須實現這個接口。
4.6. string、String;int、Int32;Boolean、bool的區別
String、Int32、Boolean等都屬於.Net中定義的類,而string、int、bool相當於C#中對這些類定義的別名。CTS。
4.7. private、 protected、 public、 internal 修飾符的訪問權限。
- private : 私有成員, 在類的內部才可以訪問。
- protected : 保護成員,該類內部和繼承類中可以訪問。
- public : 公共成員,完全公開,沒有訪問限制。
- internal: 當前程序集內可以訪問。
4.8. C#中的委托是什么?事件是不是一種委托?事件和委托的關系。
委托可以把一個方法作為參數代入另一個方法,可以理解為指向一個函數的指針。
換個說法來解釋,委托就是函數指針,事件就是保存多個函數指針的數組。
事件和委托的區別如下:
- 事件只能在方法的外部進行聲明,而委在方法的外部和內部都可以聲明。
- 事件只能在類的內部觸發,不能在類的外部觸發。而委托在類的內部和外都都可以觸發。
- 委托一般用於回調,而事件用於外部接口。例如在觀察者模式中,在被觀察者中可以聲明一個事件作為外部觀察者注冊的接口。
4.9. override與重載(overload)的區別
- 重載是方法的名稱相同。參數或參數類型不同,進行多次重載以適應不同的需要。重載(overload)是面向過程的概念。
- Override 是進行基類中函數的重寫。Override是面向對象的概念
4.10. 什么是裝箱(boxing)和拆箱(unboxing)
裝箱:從值類型接口轉換到引用類型。
拆箱:從引用類型轉換到值類型。
--------END--------
參考:
https://www.webtrainingroom.com/interview/asp-net-core-interview-questions-answers
https://www.talkingdotnet.com/asp-net-core-interview-questions/