1 .NET Core筆試題

来源:https://www.cnblogs.com/zhendayong/archive/2023/02/17/17129895.html
-Advertisement-
Play Games

1.說說顯示實現介面和隱式實現介面的區別。 2.說說file訪問修飾的作用。 3.說說什麼是原始字元串。 4.C#10 中struct有什麼改進? 5.說說C#10中Lambda表達式的新特點。 6.說說對於泛型特性的理解。 7.說說在ASP.NET Core7中,依賴註入中的方法註入需要註意什麼? ...


1.說說顯示實現介面和隱式實現介面的區別。
2.說說file訪問修飾的作用。
3.說說什麼是原始字元串。
4.C#10 中struct有什麼改進?
5.說說C#10中Lambda表達式的新特點。
6.說說對於泛型特性的理解。
7.說說在ASP.NET Core7中,依賴註入中的方法註入需要註意什麼?
8.說說ASP.NET Core7 限流中間件。
9.說說Record關鍵字的用法
10.說說 Minimal API的特點,和普通API有什麼區別?


1.說說顯示實現介面和隱式實現介面的區別。

隱式介面實現: 如果類或者結構要實現的是單個介面,可以使用隱式實現。
顯式介面實現: 如果類或者結構繼承了多個介面,那麼介面中相同名稱成員就要顯式實現。顯示實現是
通過使用介面的完全限定名來實現介面成員的。

使用顯式介面成員執行體通常有兩個目的:
1、顯式介面成員執行體不能通過類的實例進行訪問,這就 可以從公有介面中把介面的實現部分單
獨分離開。如果一個類只在內部使用該介面,而類的使用者不會直接使用到該介面,這種顯式介面成員
執行體就可以起到作用。
2、 顯式介面成員執行體避免了介面成員之間因為同名而發生混淆。如果一個類希望對名稱和返回類型
相同的介面成員採用不同的實現方式,這就必須要使用到顯式介面成員執行體。 如果沒有顯式介面成員
執行體,那麼對於名稱和返回類型不同的介面成員,類也無法進行實現。
ex:

//約定介面
interface ISkill
{
  void Flying();
}

//隱式實現ISkill介面
public class Bird: ISkill
{
  public void Flying()
    {            
    }
}

//第一種調用方式
Bird bird = new Bird();
bird.Flying();

//第二種調用方式
 ISkill secondBrid = new Bird();
 secondBrid.Flying();

//用類和介面都可以調用Flying方法
//約定兩個介面
interface InterfaceA
    {
        void Say();
    }
interface InterfaceB
    {
        void Say();
    }
//繼承
class Person:InterfaceA, InterfaceB
    {
        void InterfaceA.Say()
        {
            Console.WriteLine("helloA");
        }
    
        void InterfaceB.Say()
        {
            Console.WriteLine("helloB");
        }
    }

//訪問形式
class Program
{
        static void Main(string[] args)
        {   
            InterfaceA p = new Person();
            p.Say();

            InterfaceB p2 = new Person();
            p2.Say();
        }
}

// 顯示實現只能通過對應的介面訪問對應的介面內的方法。用實現類去訪問時訪問不到的。

2.說說file訪問修飾的作用。

.NET7到來時,C#11中添加了file訪問修飾符。就是文件的意思,file是只能用來定義類型的訪問修飾 符,不能定義類型中的類成員,即使嵌套類也不可以。file是用來定義使用範圍最小的類型訪問修飾符, 只限於在當前文件中,其他類型的成員內訪問。
file基本的使用場景是,當需要一個類型時,但又不想這個類型的使用範圍延伸到外部,所以就在當 前.cs文件定義一個file訪問修飾符的類型,僅限於當前文件中的類型成員內部封裝並訪問。
ex:
public class Product {
    public string ? Name {
        get;
        set;
    }
    public decimal PurchasePrice {
        get;
        set;
    }
    public void PrintSalesProduct() {
        var salesPrice = new SalesPrice {
            RetailPrice = PurchasePrice * 1.5 m, WholesalePrice = PurchasePrice * 1.2 m
        };
        Console.WriteLine($ "Name:{Name},{salesPrice}");
    }
}
file record SalesPrice {
    public decimal RetailPrice {
        get;
        set;
    }
    public decimal WholesalePrice {
        get;
        set;
    }
}


3.說說什麼是原始字元串。

C# 11 引入了原始字元串特性,允許用戶利用原始字元串在代碼中插入大量的無需轉移的文本,方便開發者在代碼中以字元串的方式塞入代碼文本等。
原始字元串需要被至少三個 " 包裹,例如 """ 和 """"" 等等,前後的引號數量要相等。
另外,原始字元串的縮進由後面引號的位置來確定
例如:
此時 str 是:帶有換行符的字元串
{
     string str = """ 
               hello 
               world 
               """;
     Console.WriteLine(str);
}

此時 str 是:帶有換行符,且第二行有空格的字元串

{
   var str = """"
           hello
               world
           """";
   Console.WriteLine(str);
}

可以直接定義JSON格式

{
   //可以直接定義JSON格式
   var json = """"
               {
                   "a": 1,
                   "b": {
                           "c": "hello",
                           "d": "world"
                         },
                   "c": [1, 2, 3, 4, 5]
               }
               """";
   Console.WriteLine(json);
   object obj= Newtonsoft.Json.JsonConvert.DeserializeObject<object>(json);
   Hashtable tb = Newtonsoft.Json.JsonConvert.DeserializeObject<Hashtable>
(json);
}

可以直接定義JSON格式

{ 
   int age= 37;
   string? jsonResult= $$"""
                 {
                   "Id":123,
                   "Name":"Richard",
                   "Age":"{{age}}"
                 }
                 """;                
}

4. C#10 中struct有什麼改進?

主要在於支持了無參數構造函數的改進,在C# 10之前,約束了不能有無參數的構造函數,現在在C#10 方法了這一約束;
public struct Teaach
{
   public Teaach(string firstName, string lastName)
   {
       this.FirstName = firstName;
       this.LastName = lastName;
   } 
   public string FirstName { get; set; } 
   public string LastName { get; set; }
}


5.說說C#10中Lambda表達式的新特點

在之前的版本中我們是需要顯式聲明委托類型,如上述被註釋的代碼,在 C# 10 就可以直接使用 var 來聲明由編譯器去推斷委托的類型
// Func<int> func = () => 1;
var func = () => 1;
// Func<string> func2 = ()=>"Hello";
var func2 = () => "Hello";

我們可以在指定輸入參數類型的時候,可以設置 ref / out / int 來表示一個值類型的引用傳遞,示例如

var refFunc = (ref int x) => { x++; };
var outFunc = (out int x) => { x = -1; };
var inFunc = (in int x) => { };
var num = 1;
refFunc(ref num);
Console.WriteLine(num);
outFunc(out num);
Console.WriteLine(num);

C# 10 的委托可以指定返回類型,如下:

// return type
var lambdaWithReturnValue0 = int? () => null;
// return type and input type
var lambdaWithReturnValue1 = int? (string s)
   => string.IsNullOrEmpty(s) ? 1 : null;
// Func<bool, object>
var choose = object (bool b) => b ? 1 : "two";

對於能夠推斷出類型的方法,我們也可以使用 var 來聲明委托,示例如下

// Action<string> func3 = LocalMethod;
var func3 = LocalMethod;
void LocalMethod(string a)
{
   Console.WriteLine(a);
}
var checkFunc = string.IsNullOrEmpty;
var read = Console.Read;
Action<string> write = Console.Write;

現在我們可以在 Lambda 表達式中指定 Attribute

var parse3 =[Description("Lambda attribute")](string s) => int.Parse(s);
var choose3 =[Description("Lambda attribute1")]object (bool b) => b ? 1 : "two";

6.說說對於泛型特性的理解。

泛型:不確定的類型,聲明時不確定類型,調用時確定類型。可以支持一個類、方法、委托、介面等 類 支持不同類型的需求;那麼對於泛型的支持;
C# 10 推廣了特性,使得特性可以用泛型,如下例:
public sealed class SomeAttribute<T> : Attribute
{
}

在使用的時候:

[SomeAttribute<int>]
class A { }  
[SomeAttribute<string>]
class B { } 

7.說說在ASP.NET Core7中,依賴註入中的方法註入需要註意什麼?

在MinimalAPI 或者是控制器中的方法中,如果需要支持註入,因為註入的對象和方法的參數是寫在一起 的。會出現系統無法識別這裡寫的參數究竟是要註入,還是調用方傳入的參數。那麼如果明確那個參數 是要通過註入(也就是說通過IOC容器來創建),就需要給這個參數標記一個特性【FromServices】,指 定當前這個參數是來自於IOC容器,也就是註入進來的。

8.說說ASP.NET Core7 限流中間件。

實操如下:
安裝.NET 7.0 SDK
通過nuget包安裝Microsoft.AspNetCore.RateLimiting
創建.NET7網站應用,註冊中間件
可以根據不同資源不同限制併發數,/api首碼的資源租約數2,等待隊列長度為2,其他預設租約數1,隊列長度1。
app.UseRateLimiter(new RateLimiterOptions()
{
   // 觸發限流的響應碼
   DefaultRejectionStatusCode = 500,
   OnRejected = async (ctx, rateLimitLease) =>
   {
       // 觸發限流回調處理
   },
   Limiter = PartitionedRateLimiter.Create<HttpContext, string>(resource =>
   {
       if (resource.Request.Path.StartsWithSegments("/api"))
       {
           return RateLimitPartition.CreateConcurrencyLimiter("WebApiLimiter", _ => new ConcurrencyLimiterOptions(2,QueueProcessingOrder.NewestFirst, 2));
       }
       else
       {
           return RateLimitPartition.CreateConcurrencyLimiter("DefaultLimiter",
               _ => new ConcurrencyLimiterOptions(1, QueueProcessingOrder.NewestFirst, 1));
       }
   })
});


9. 說說Record關鍵字的用法

可以用來簡單聲明一個類:
record People
{
   public string Name { get; init; } 
   public int Age { get; init; }
}
上面是聲明一個類
下麵的聲明也是聲明一個類,和上面的一樣;不需要使用大括弧來執行屬性;
record People2(string Name, int Age);

這裡的示例,用 record 聲明瞭兩個 實體,第二個 實體 聲明的時候使用了簡化的寫法,record
People2(string Name, int Age); 這樣的聲明意味著,構造方法有兩個參數,分別是 string Name 和 int
Age,並對應著兩個屬性,屬性的聲明方式和 People 一樣 public string Name { get; init; } 都是一個
get 一個 init,對於 record 支持一個 with 表達式,來修改某幾個屬性的值,這對於有很多屬性都相同的
場景來說是及其方便的;


10.說說 Minimal API的特點,和普通API有什麼區別?

Minimal API翻譯過來:極簡Api或者最小Api,從名字上就可以理解。 Minimal API意在去掉過多的流 程。相比於普通的Webapi,在HttpContext的處理流程中,減少了處理的步驟,沒有MVC的流程,在中間 件的位置處理了請求;減少了處理的步驟,減少了電腦的資源消耗,提高性能。當然在功能的支持上 也有部分是少於普通 的.NET Core WebApi的。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 教程簡介 Google Plus初學者教程 - 從基本到高級概念的簡單簡單步驟學習Google Plus,其中包括簡介,業務頁面設置,創建新帳戶,瀏覽Google Plus,添加業務詳細信息,上傳個人資料圖片,添加封面圖片,圈子,社區,環聊,活動,上傳帖子,編輯帖子,刪除帖子,轉發帖子,報告帖子,促 ...
  • 一、背景 開發一款Idea插件,實現對yaml文件的定製化格式檢查。 !! 後指定的類路徑是否準確 yaml中的key是否equal類中field的name value是否能夠轉換成類中field的類型 …… 完成代碼功能上線後,使用過程發現很多問題。後在主管幫助下,對代碼進行了重構。事後對重構前後 ...
  • 教程簡介 Microsoft Expression Web Tutorial for Beginners - 從基本到高級概念的簡單簡單步驟學習Microsoft Expression Web,其中包括概述,環境設置,新網站,空白網頁,網頁佈局,HTML佈局,水平導航,垂直導航,驗證頁面,動態Web ...
  • 什麼是素數? 質數又稱素數。一個大於1的自然數,除了1和它自身外,不能被其他自然數整除的數叫做質數;否則稱為合數(規定1既不是質數也不是合數)。 實際案例 比如我們想找出1-1000的所有素數 思路1 可以先定義一個方法 primeNumber//參數列表用來接收所想找的素數範圍 public st ...
  • 本文介紹基於Python的隨機森林(Random Forest,RF)回歸代碼,以及模型超參數(包括決策樹個數與最大深度、最小分離樣本數、最小葉子節點樣本數、最大分離特征數等)自動優化的代碼~ ...
  • nano /etc/motd // _ooOoo_ // // o8888888o // // 88" . "88 // // (| ^_^ |) // // O\ = /O // // ____/` '\____ // // .' \\| |// `. // // / \\||| : |||// ...
  • 本文敘述的問題的根源在於對C#基礎知識掌握不牢固,從而在遇到難以理解的問題時浪費了大量時間; 在此也警示自己,該啃啃基礎書籍了! 話不多說,先上代碼: 先看問題 services.AddEasyCaching(option => { option.UseHybrid(config => { .... ...
  • ###語法: select * from 表名 where 條件1 start with 條件2 connect by 條件3; 條件2: 是根結點的限定語句,當然可以放寬限定條件,以取得多個根結點,實際就是多棵樹。 條件3: 是連接條件,其中用PRIOR表示上一條記錄,比如 CONNECT BY ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...