溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#中主要語言區(qū)域有哪些

發(fā)布時間:2021-12-24 11:33:10 來源:億速云 閱讀:112 作者:小新 欄目:開發(fā)技術

這篇文章給大家分享的是有關C#中主要語言區(qū)域有哪些的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

    一、數(shù)組、集合和 LINQ

    C# 和 .NET 提供了許多不同的集合類型。 數(shù)組包含由語言定義的語法。 泛型集合類型列在 System.Collections.Generic 命名空間中。 專用集合包括 System.Span<T> (用于訪問堆棧幀上的連續(xù)內(nèi)存),以及 System.Memory<T> (用于訪問托管堆上的連續(xù)內(nèi)存)。 所有集合(包括數(shù)組、Span<T> 和 Memory<T>)都遵循一種統(tǒng)一的迭代原則。 使用 System.Collections.Generic.IEnumerable<T> 接口。 這種統(tǒng)一的原則意味著任何集合類型都可以與 LINQ 查詢或其他算法一起使用。 你可以使用 IEnumerable<T> 編寫方法,這些算法適用于任何集合。

    1、數(shù)組

    數(shù)組是一種數(shù)據(jù)結構*_,其中包含許多通過計算索引訪問的變量。 數(shù)組中的變量(亦稱為數(shù)組的“元素”)均為同一種類型。 我們將這種類型稱為數(shù)組的“元素類型”。

    數(shù)組類型是引用類型,聲明數(shù)組變量只是為引用數(shù)組實例預留空間。 實際的數(shù)組實例是在運行時使用 new 運算符動態(tài)創(chuàng)建而成。 new 運算指定了新數(shù)組實例的長度,然后在此實例的生存期內(nèi)固定使用這個長度。 數(shù)組元素的索引介于 0 到 Length - 1 之間。 new 運算符自動將數(shù)組元素初始化為其默認值(例如,所有數(shù)值類型的默認值為 0,所有引用類型的默認值為 null)。

    以下示例創(chuàng)建 int 元素數(shù)組,初始化此數(shù)組,然后打印此數(shù)組的內(nèi)容。

    int[] a = new int[10];
    for (int i = 0; i < a.Length; i++)
    {
        a[i] = i * i;
    }
    for (int i = 0; i < a.Length; i++)
    {
        Console.WriteLine($"a[{i}] = {a[i]}");
    }

    此示例創(chuàng)建并在“一維數(shù)組”上進行操作。 C# 還支持多維數(shù)組。 數(shù)組類型的維數(shù)(亦稱為數(shù)組類型的秩)是 1 與數(shù)組類型方括號內(nèi)的逗號數(shù)量相加的結果。 以下示例分別分配一維、二維、三維數(shù)組。

    int[] a1 = new int[10];
    int[,] a2 = new int[10, 5];
    int[,,] a3 = new int[10, 5, 2];

    a1 數(shù)組包含 10 個元素,a2 數(shù)組包含 50 個元素 (10 × 5),a3 數(shù)組包含 100 個元素 (10 × 5 × 2)。 數(shù)組的元素類型可以是任意類型(包括數(shù)組類型)。 包含數(shù)組類型元素的數(shù)組有時稱為“交錯數(shù)組”,因為元素數(shù)組的長度不必全都一樣。 以下示例分配由 int 數(shù)組構成的數(shù)組:

    int[][] a = new int[3][];
    a[0] = new int[10];
    a[1] = new int[5];
    a[2] = new int[20];

    第一行創(chuàng)建包含三個元素的數(shù)組,每個元素都是 int[] 類型,并且初始值均為 null。 接下來的代碼行將這三個元素初始化為引用長度不同的各個數(shù)組實例。

    通過 new 運算符,可以使用“數(shù)組初始值設定項”(在分隔符 { 和 } 內(nèi)編寫的表達式列表)指定數(shù)組元素的初始值。 以下示例分配 int[],并將其初始化為包含三個元素。

    int[] a = new int[] { 1, 2, 3 };

    可從 { 和 } 內(nèi)的表達式數(shù)量推斷出數(shù)組的長度。 數(shù)組初始化可以進一步縮短,這樣就不用重新聲明數(shù)組類型了。

    int[] a = { 1, 2, 3 };

    以上兩個示例等同于以下代碼:

    int[] t = new int[3];
    t[0] = 1;
    t[1] = 2;
    t[2] = 3;
    int[] a = t;

    foreach 語句可用于枚舉任何集合的元素。 以下代碼從前一個示例中枚舉數(shù)組:

    foreach (int item in a)
    {
        Console.WriteLine(item);
    }

    foreach 語句使用 IEnumerable<T> 接口,因此適用于任何集合。

    二、字符串內(nèi)插

    C# 字符串內(nèi)插使你能夠通過定義表達式(其結果放置在格式字符串中)來設置字符串格式。 例如,以下示例從一組天氣數(shù)據(jù)顯示給定日期的溫度:

    Console.WriteLine($"The low and high temperature on {weatherData.Date:MM-DD-YYYY}");
    Console.WriteLine($"    was {weatherData.LowTemp} and {weatherData.HighTemp}.");
    // Output (similar to):
    // The low and high temperature on 08-11-2020
    //     was 5 and 30.

    內(nèi)插字符串通過 $ 標記來聲明。 字符串插內(nèi)插計算 { 和 } 之間的表達式,然后將結果轉換為 string,并將括號內(nèi)的文本替換為表達式的字符串結果。 第一個表達式 ({weatherData.Date:MM-DD-YYYY}) 中的 : 指定格式字符串。 在前一個示例中,這指定日期應以“MM-DD-YYYY”格式顯示。

    三、模式匹配

    C# 語言提供模式匹配表達式來查詢對象的狀態(tài)并基于該狀態(tài)執(zhí)行代碼。 你可以檢查屬性和字段的類型和值,以確定要執(zhí)行的操作。 switch 表達式是模式匹配的主要表達式。

    四、委托和 Lambda 表達式

    委托類型表示對具有特定參數(shù)列表和返回類型的方法的引用。 通過委托,可以將方法視為可分配給變量并可作為參數(shù)傳遞的實體。 委托還類似于其他一些語言中存在的“函數(shù)指針”概念。 與函數(shù)指針不同,委托是面向?qū)ο笄翌愋桶踩摹?/p>

    下面的示例聲明并使用 Function 委托類型:

    delegate double Function(double x);
    
    class Multiplier
    {
        double _factor;
    
        public Multiplier(double factor) => _factor = factor;
    
        public double Multiply(double x) => x * _factor;
    }
    
    class DelegateExample
    {
        static double[] Apply(double[] a, Function f)
        {
            var result = new double[a.Length];
            for (int i = 0; i < a.Length; i++) result[i] = f(a[i]);
            return result;
        }
    
        public static void Main()
        {
            double[] a = { 0.0, 0.5, 1.0 };
            double[] squares = Apply(a, (x) => x * x);
            double[] sines = Apply(a, Math.Sin);
            Multiplier m = new(2.0);
            double[] doubles = Apply(a, m.Multiply);
        }
    }

    Function 委托類型實例可以引用需要使用 double 自變量并返回 double 值的方法。 Apply 方法將給定的 Function 應用于 double[] 的元素,從而返回包含結果的 double[]。 在 Main 方法中,Apply 用于向 double[] 應用三個不同的函數(shù)。

    委托可以引用靜態(tài)方法(如上面示例中的 Square 或 Math.Sin)或?qū)嵗椒ǎㄈ缟厦媸纠械?m.Multiply)。 引用實例方法的委托還會引用特定對象,通過委托調(diào)用實例方法時,該對象會變成調(diào)用中的 this。

    還可以使用匿名函數(shù)或 Lambda 表達式創(chuàng)建委托,這些函數(shù)是在聲明時創(chuàng)建的“內(nèi)聯(lián)方法”。 匿名函數(shù)可以查看周圍方法的局部變量。

     以下示例不創(chuàng)建類:

    double[] doubles = Apply(a, (double x) => x * 2.0);

    委托不知道或不在意其所引用的方法的類。 引用的方法必須具有與委托相同的參數(shù)和返回類型。

    五、async/await

    C# 支持含兩個關鍵字的異步程序:async 和 await。 將 async 修飾符添加到方法聲明中,以聲明這是異步方法。 await 運算符通知編譯器異步等待結果完成。 控件返回給調(diào)用方,該方法返回一個管理異步工作狀態(tài)的結構。 結構通常是 System.Threading.Tasks.Task<TResult>,但可以是任何支持 awaiter 模式的類型。 這些功能使你能夠編寫這樣的代碼:以其同步對應項的形式讀取,但以異步方式執(zhí)行。 例如,以下代碼會下載 Microsoft Docs 的主頁:

    public async Task<int> RetrieveDocsHomePage()
    {
        var client = new HttpClient();
        byte[] content = await client.GetByteArrayAsync("https://docs.microsoft.com/");
    
        Console.WriteLine($"{nameof(RetrieveDocsHomePage)}: Finished downloading.");
        return content.Length;
    }

    這一小型示例顯示了異步編程的主要功能:

    • 方法聲明包含 async 修飾符。

    • 方法 await 的主體是 GetByteArrayAsync 方法的返回。

    • return 語句中指定的類型與方法的 Task<T> 聲明中的類型參數(shù)匹配。 (返回 Task 的方法將使用不帶任何參數(shù)的 return 語句)。

    六、屬性

    C# 程序中的類型、成員和其他實體支持使用修飾符來控制其行為的某些方面。 例如,方法的可訪問性是由 publicprotected、internal private 修飾符控制。 C# 整合了這種能力,以便可以將用戶定義類型的聲明性信息附加到程序?qū)嶓w,并在運行時檢索此類信息。 程序通過定義和使用特性來指定此聲明性信息。

    以下示例聲明了 HelpAttribute 特性,可將其附加到程序?qū)嶓w,以提供指向關聯(lián)文檔的鏈接。

    public class HelpAttribute : Attribute
    {
        string _url;
        string _topic;
    
        public HelpAttribute(string url) => _url = url;
    
        public string Url => _url;
    
        public string Topic
        {
            get => _topic;
            set => _topic = value;
        }
    }

    所有特性類都派生自 .NET 庫提供的 Attribute 基類。 特性的應用方式為,在相關聲明前的方括號內(nèi)指定特性的名稱以及任意自變量。 如果特性的名稱以 Attribute 結尾,那么可以在引用特性時省略這部分名稱。 例如,可按如下方法使用 HelpAttribute。

    [Help("https://docs.microsoft.com/dotnet/csharp/tour-of-csharp/features")]
    public class Widget
    {
        [Help("https://docs.microsoft.com/dotnet/csharp/tour-of-csharp/features",
        Topic = "Display")]
        public void Display(string text) { }
    }

    此示例將 HelpAttribute 附加到 Widget 類。 還向此類中的 Display 方法附加了另一個 HelpAttribute。 特性類的公共構造函數(shù)控制了將特性附加到程序?qū)嶓w時必須提供的信息。 可以通過引用特性類的公共讀寫屬性(如上面示例對 Topic 屬性的引用),提供其他信息。

    可以在運行時使用反射來讀取和操縱特性定義的元數(shù)據(jù)。 如果使用這種方法請求獲取特定特性,便會調(diào)用特性類的構造函數(shù)(在程序源中提供信息)。 返回生成的特性實例。 如果是通過屬性提供其他信息,那么在特性實例返回前,這些屬性會設置為給定值。

    下面的代碼示例展示了如何獲取與 Widget 類及其 Display 方法相關聯(lián)的 HelpAttribute 實例。

    Type widgetType = typeof(Widget);
    
    object[] widgetClassAttributes = widgetType.GetCustomAttributes(typeof(HelpAttribute), false);
    
    if (widgetClassAttributes.Length > 0)
    {
        HelpAttribute attr = (HelpAttribute)widgetClassAttributes[0];
        Console.WriteLine($"Widget class help URL : {attr.Url} - Related topic : {attr.Topic}");
    }
    
    System.Reflection.MethodInfo displayMethod = widgetType.GetMethod(nameof(Widget.Display));
    
    object[] displayMethodAttributes = displayMethod.GetCustomAttributes(typeof(HelpAttribute), false);
    
    if (displayMethodAttributes.Length > 0)
    {
        HelpAttribute attr = (HelpAttribute)displayMethodAttributes[0];
        Console.WriteLine($"Display method help URL : {attr.Url} - Related topic : {attr.Topic}");
    }

    感謝各位的閱讀!關于“C#中主要語言區(qū)域有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

    AI